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 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 74.97*fgkmm;
200 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
201 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
202 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
204 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
205 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
206 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
207 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
208 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
210 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
211 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
212 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
213 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
214 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
216 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
217 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
218 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
219 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
220 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
221 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
222 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
223 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
224 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
225 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
226 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
228 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
229 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
230 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
232 const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
233 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
234 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
236 // the stesalite ladder foot at its end
237 const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
238 const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
239 const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
240 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
242 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
243 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
244 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
245 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
247 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
248 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
249 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
251 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
252 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
254 // the U cooling pipe and its heat exchanger in end-ladder cards system
255 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
256 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
257 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
258 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
259 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
260 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
261 //--- The al body of the cooling syst.of the heat exchanger :
262 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
263 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
264 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
265 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
266 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
267 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm;// shift in X of the arms from the axis
268 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
271 const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
272 const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
273 const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
274 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
276 const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
277 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
278 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
279 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
280 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
281 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
283 const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
284 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
285 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
286 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
287 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
288 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
290 const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
291 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
293 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
294 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
295 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
297 const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
298 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
300 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
301 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
302 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
304 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
305 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
306 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
308 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
309 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
310 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
312 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
313 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
314 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
317 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
318 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
319 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
321 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
322 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
323 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
324 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
328 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
329 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
335 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
336 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
340 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
341 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
342 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
343 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
346 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
347 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
349 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
350 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
354 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
355 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
356 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
360 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
361 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
362 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
365 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
366 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
367 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
368 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
371 // screws fixing boards to the end-ladder on the U tube
372 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
373 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
374 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
375 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
376 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
379 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
380 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
381 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
382 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
383 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
384 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
386 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
387 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
389 // size and position of various chips on carlos end-ladder board
390 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
391 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
392 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
393 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
394 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
396 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
397 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
402 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
403 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
406 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
409 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
410 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
412 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
413 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
414 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
415 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
416 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
418 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
419 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
424 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
425 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
426 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
427 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
428 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
430 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
431 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
432 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
433 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
434 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
436 // distance from the heat bridge center to the card center :
437 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
439 // some pieces at the end of the carbon fiber ladder
440 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
441 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
442 const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
443 const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
444 const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
445 const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
446 const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
447 const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
449 // Cooling connector between phynox and plastic cooling water tubes
450 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
451 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
452 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
453 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
454 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
455 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
456 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
459 // parameters for coding SDD cables on SDD and SSD cones
460 const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
461 // copper : LV + signal + HV(HV ???)
462 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)
463 - fgkSectionCuPerMod);
465 const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
466 // (sections are given in cm square)
467 const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
469 const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
470 const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
471 const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
472 const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
473 // These last parameters come from cone's code and define the slope
474 // and position of the SDD cone end. For some unknown reason, this doesn't
475 // allow to stick on the SDD cone. This has to be checked when a correct
476 // version of the cone is available ... For now 'm applying some approximative
479 const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
480 const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
481 const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
483 const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
484 const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
485 const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
493 ClassImp(AliITSv11GeometrySDD)
495 //________________________________________________________________________
496 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
499 fCoolPipeSupportL(0),
500 fCoolPipeSupportR(0),
503 fBaseThermalBridge(0),
519 fAddCoolingSyst(kTRUE),
521 fAddOnlyLadder3min(-1),
522 fAddOnlyLadder3max(-1),
523 fAddOnlyLadder4min(-1),
524 fAddOnlyLadder4max(-1),
525 fColorCarbonFiber(4),
535 fLay3LadderUnderSegDH(0),
536 fLay4LadderUnderSegDH(0),
537 fLay3LaddShortRadius(0),
538 fLay3LaddLongRadius(0),
539 fLay4LaddShortRadius(0),
540 fLay4LaddLongRadius(0)
543 // Standard constructor
549 //________________________________________________________________________
550 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
551 AliITSv11Geometry(debug),
553 fCoolPipeSupportL(0),
554 fCoolPipeSupportR(0),
557 fBaseThermalBridge(0),
573 fAddCoolingSyst(kTRUE),
575 fAddOnlyLadder3min(-1),
576 fAddOnlyLadder3max(-1),
577 fAddOnlyLadder4min(-1),
578 fAddOnlyLadder4max(-1),
579 fColorCarbonFiber(4),
589 fLay3LadderUnderSegDH(0),
590 fLay4LadderUnderSegDH(0),
591 fLay3LaddShortRadius(0),
592 fLay3LaddLongRadius(0),
593 fLay4LaddShortRadius(0),
594 fLay4LaddLongRadius(0)
597 // Constructor setting debugging level
602 //________________________________________________________________________
603 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
604 AliITSv11Geometry(s.GetDebug()),
605 fPinSupport(s.fPinSupport),
606 fCoolPipeSupportL(s.fCoolPipeSupportL),
607 fCoolPipeSupportR(s.fCoolPipeSupportR),
608 fSDDsensor3(s.fSDDsensor3),
609 fSDDsensor4(s.fSDDsensor4),
610 fBaseThermalBridge(s.fBaseThermalBridge),
612 fCardLVR(s.fCardLVR),
613 fCardLVL(s.fCardLVL),
615 fCardCarlos(s.fCardCarlos),
616 fRaccordoL(s.fRaccordoL),
617 fDigitCableLay3A(s.fDigitCableLay3A),
618 fDigitCableLay3B(s.fDigitCableLay3B),
619 fDigitCableLay4A(s.fDigitCableLay4A),
620 fDigitCableLay4B(s.fDigitCableLay4B),
621 fMotherVol(s.fMotherVol),
622 fAddHybrids(s.fAddHybrids),
623 fAddSensors(s.fAddSensors),
624 fAddHVcables(s.fAddHVcables),
625 fAddCables(s.fAddCables),
626 fAddCoolingSyst(s.fAddCoolingSyst),
627 fCoolingOn(s.fCoolingOn),
628 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
629 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
630 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
631 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
632 fColorCarbonFiber(s.fColorCarbonFiber),
633 fColorRyton(s.fColorRyton),
634 fColorPhynox(s.fColorPhynox),
635 fColorSilicon(s.fColorSilicon),
636 fColorAl(s.fColorAl),
637 fColorPolyhamide(s.fColorPolyhamide),
638 fColorGlass(s.fColorGlass),
639 fColorSMD(s.fColorSMD),
640 fColorSMDweld(s.fColorSMDweld),
641 fColorStesalite(s.fColorStesalite),
642 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
643 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
644 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
645 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
646 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
647 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
650 // do only a "shallow copy" ...
654 //________________________________________________________________________
655 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
656 operator=(const AliITSv11GeometrySDD &s) {
657 // Assignment operator
658 if(&s == this) return *this;
659 fMotherVol = s.fMotherVol;
660 fAddHybrids = s.fAddHybrids;
661 fAddSensors = s.fAddSensors;
662 fAddHVcables = s.fAddHVcables;
663 fAddCables = s.fAddCables;
664 fAddCoolingSyst = s.fAddCoolingSyst;
665 fCoolingOn = s.fCoolingOn;
666 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
667 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
668 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
669 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
673 //________________________________________________________________________
674 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
675 // Look like a destructor
676 // Smell like a destructor
677 // And actually is the destructor
678 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
679 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
680 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
681 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
684 //________________________________________________________________________
685 void AliITSv11GeometrySDD::SetParameters() {
687 // Define display colors and the non constant geometry parameters
690 Double_t detLadderDist = 8*fgkmm;
692 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
693 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
695 // radius from the center to the CF ladder :
696 fLay3LaddShortRadius = (fgkLay3DetShortRadius
697 + fgkLadWaferSep+2*fgkWaferThickness
699 fLay3LaddLongRadius = (fgkLay3DetLongRadius
700 + fgkLadWaferSep+2*fgkWaferThickness
702 fLay4LaddShortRadius = (fgkLay4DetShortRadius
703 + fgkLadWaferSep+2*fgkWaferThickness
705 fLay4LaddLongRadius = (fgkLay4DetLongRadius
706 + fgkLadWaferSep+2*fgkWaferThickness
709 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
710 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
711 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
712 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
713 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
714 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
716 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
717 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
718 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
719 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
720 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
721 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
722 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
723 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
727 //________________________________________________________________________
728 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
730 // Called to get a medium, checks that it exists.
731 // If not, prints an error and returns 0
735 sprintf(ch, "ITS_%s",mediumName);
736 TGeoMedium* medium = gGeoManager->GetMedium(ch);
738 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
743 //________________________________________________________________________
744 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
745 // Get the actual number of ladder in layer 3
746 if ( (fAddOnlyLadder3min<0) ||
747 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
748 (fAddOnlyLadder3max<0) ||
749 (fAddOnlyLadder3max >= fgkLay3Nladd) )
751 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
755 //________________________________________________________________________
756 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
757 // Get the actual number of ladder in layer 4
758 if ( (fAddOnlyLadder4min<0) ||
759 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
760 (fAddOnlyLadder4max<0) ||
761 (fAddOnlyLadder4max >= fgkLay4Nladd) )
763 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
767 //________________________________________________________________________
768 void AliITSv11GeometrySDD::CreateBasicObjects() {
770 // Create basics objets which will be assembled together
771 // in Layer3 and Layer4 functions
775 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
776 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
777 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
778 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
780 fPinSupport = CreatePinSupport();
781 fCoolPipeSupportL = CreateCoolPipeSupportL();
782 fCoolPipeSupportR = CreateCoolPipeSupportR();
784 fBaseThermalBridge = CreateBaseThermalBridge();
785 fHybrid = CreateHybrid(0);
787 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
788 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
789 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
790 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
791 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
792 TGeoMedium *raccordMedium = GetMedium("INOX$"); // ??? material of raccordo ???
794 //********************************************************************
795 // pieces of the carbon fiber structure
796 //********************************************************************
797 Double_t dy = fgkLadderSegBoxDH/2;
798 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
799 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
800 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
801 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
802 Double_t dYTranslation = (fgkLadderHeight/2.
803 -0.5*fgkLadderWidth*TMath::Tan(beta)
804 -fgkLadderBeamRadius);
805 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
807 //--- the top V of the Carbon Fiber Ladder (segment)
808 TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
809 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
810 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
811 cfLaddTop1,carbonFiberLadderStruct);
812 TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
813 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
814 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
815 cfLaddTop2, carbonFiberLadderStruct);
816 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
817 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
818 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
821 TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
822 fgkLadderLb, fgkLadderHb, fgkLadderl);
823 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
824 cfLaddSide1,carbonFiberLadderStruct);
825 TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
826 fgkLadderLb, fgkLadderHb, fgkLadderl);
827 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
828 cfLaddSide2,carbonFiberLadderStruct);
829 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
830 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
831 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
832 alpha*TMath::RadToDeg());
833 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
834 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
835 -alpha*TMath::RadToDeg());
836 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
839 // Beams on the sides
840 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
841 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
842 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
843 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
844 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
845 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
846 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
848 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
849 carbonFiberLadderStruct);
850 sideBeam->SetLineColor(fColorCarbonFiber);
852 //Euler rotation : about Z, then new X, then new Z
853 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
854 -beamPhiPrime*TMath::RadToDeg(),-90);
855 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
856 beamPhiPrime*TMath::RadToDeg(), -90);
857 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
858 beamPhiPrime*TMath::RadToDeg(), -90);
859 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
860 -beamPhiPrime*TMath::RadToDeg(),-90);
862 TGeoCombiTrans *beamTransf[8];
863 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
864 TMath::Tan(halfTheta),
865 fgkLadderBeamRadius/2. - dy,
866 -3*fgkSegmentLength/8, beamRot1);
868 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
869 TMath::Tan(halfTheta),
870 fgkLadderBeamRadius/2. - dy,
871 -3*fgkSegmentLength/8, beamRot1);
872 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
874 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
875 TMath::Tan(halfTheta),
876 fgkLadderBeamRadius/2. - dy,
877 -fgkSegmentLength/8, beamRot2);
879 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
880 TMath::Tan(halfTheta),
881 fgkLadderBeamRadius/2. - dy,
882 -fgkSegmentLength/8, beamRot2);
883 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
885 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
886 TMath::Tan(halfTheta),
887 fgkLadderBeamRadius/2. - dy,
888 -3*fgkSegmentLength/8, beamRot3);
890 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
891 TMath::Tan(halfTheta),
892 fgkLadderBeamRadius/2. - dy,
893 -3*fgkSegmentLength/8, beamRot3);
894 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
896 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
897 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
898 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
899 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
901 //--- Beams of the bottom
902 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
903 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
904 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
905 bottomBeam1, carbonFiberLadderStruct);
906 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
907 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
908 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
909 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
910 bottomBeam2, carbonFiberLadderStruct);
911 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
912 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
913 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
914 - fgkLadderLb/3, 0, 180);
915 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
916 bottomBeam3, carbonFiberLadderStruct);
917 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
918 //bottomBeam3Vol->SetLineColor(2);
919 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
920 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
922 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
923 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
924 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
925 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
926 -fgkSegmentLength/2, bottomBeamRot1);
927 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
928 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
929 - dy, fgkSegmentLength/2, bottomBeamRot2);
930 // be careful for beams #3: when "reading" from -z to +z and
931 // from the bottom of the ladder, it should draw a Lambda, and not a V
932 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
933 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
934 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
935 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
936 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
937 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
939 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
940 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
941 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
942 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
943 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
944 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
945 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
946 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
947 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
948 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
949 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
950 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
951 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
952 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
953 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
954 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
955 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
956 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
957 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
960 //********************************************************************
962 //********************************************************************
964 for (Int_t i=0; i<fgkLay3Ndet; i++) {
965 sprintf(cableName, "digitCableLay3A_%i",i);
966 fDigitCableLay3A[i].SetName(cableName);
967 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
968 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
969 fDigitCableLay3A[i].SetNLayers(2);
970 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
972 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
973 sprintf(cableName, "digitCableLay3B_%i",i);
974 fDigitCableLay3B[i].SetName(cableName);
975 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
976 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
977 fDigitCableLay3B[i].SetNLayers(2);
978 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
980 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
982 for (Int_t i=0; i<fgkLay4Ndet; i++) {
983 sprintf(cableName, "digitCableLay4A_%i",i);
984 fDigitCableLay4A[i].SetName(cableName);
985 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
986 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
987 fDigitCableLay4A[i].SetNLayers(2);
988 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
990 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
991 sprintf(cableName, "digitCableLay4B_%i",i);
992 fDigitCableLay4B[i].SetName(cableName);
993 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
994 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
995 fDigitCableLay4B[i].SetNLayers(2);
996 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
998 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1000 // Well, those digit cables could also include the analog cables
1001 // which have the same width and the same path, at least in the ladder.
1002 // It will gain some computing ressources (less volumes) and some
1003 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1004 // The only thing to do is to change the names and put the correct total
1007 // some transformations and volumes used in several places
1008 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1009 0, -fgkCarlosSuppAngle, 0);
1011 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1012 fgkLittleScrewHeadH/2);
1013 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1014 littleScrewHead, stainless);
1015 fCommonVol[0]->SetLineColor(kGray);
1017 fLadderFoot = CreateLadderFoot();
1019 fCardHV = CreateHVCard(0);
1020 fCardCarlos = CreateCarlosCard(0);
1022 //==================
1023 // link beteen phynox and plastic cooling tubes
1024 //==================
1026 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1027 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1028 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1029 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1030 vwaterRac->SetLineColor(kBlue);
1032 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1033 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1034 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1035 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1036 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1037 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1038 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1039 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1040 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1041 vtube1Rac->SetLineColor(kGray);
1042 vtube2Rac->SetLineColor(kGray);
1043 vtube3Rac->SetLineColor(kGray);
1045 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1046 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1047 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1048 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1049 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1050 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1051 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1052 fRaccordoL->AddNode(vwaterRac, 1,0);
1053 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1054 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1055 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1059 //________________________________________________________________________
1060 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1062 // a debugging function for checking some possible overlaps
1064 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1065 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1066 if (fHybrid) fHybrid->CheckOverlaps(precision);
1070 //________________________________________________________________________
1071 TGeoCombiTrans *AliITSv11GeometrySDD::
1072 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1075 // return the TGeoCombiTrans which make a translation in y and z
1076 // and a rotation in phi in the global coord system
1077 // If planeSym = true, the rotation places the object symetrically
1078 // (with respect to the transverse plane) to its position in the
1079 // case planeSym = false
1082 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1083 TGeoRotation r1("",0.,0.,dphi);
1084 TGeoRotation r2("",90, 180, -90-dphi);
1086 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1087 combiTrans1->SetTranslation(t1);
1088 if (planeSym) combiTrans1->SetRotation(r1);
1089 else combiTrans1->SetRotation(r2);
1094 //________________________________________________________________________
1095 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1099 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1100 const Double_t *vect = ct->GetTranslation();
1101 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1102 ct->SetTranslation(newVect);
1106 //________________________________________________________________________
1107 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1108 // for code developpment and debugging purposes
1110 if (! fSDDsensor3) CreateBasicObjects();
1112 // moth->AddNode(fPinSupport, 1, 0);
1113 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1114 // moth->AddNode(fSDDsensor3, 1, 0);
1115 // moth->AddNode(fSDDsensor4, 1, 0);
1116 // moth->AddNode(fBaseThermalBridge, 1, 0);
1117 // moth->AddNode(fHybrid,100,0);
1118 // moth->AddNode(fLadderFoot,1,0);
1119 //moth->AddNode(fCardLVL,1,0);
1120 //moth->AddNode(fCardLVR,1,0);
1122 TGeoVolume* seg = CreateLadderSegment( 3, 0);
1123 moth->AddNode(seg, 1, 0);
1125 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1126 // moth->AddNode(lay3Ladder, 1, 0);
1128 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1129 // moth->AddNode(lay3Detectors, 1, 0);
1131 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1132 // moth->AddNode(lay3Detectors, 1, 0);
1135 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1136 // moth->AddNode(endLadder, 1, 0);
1138 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1139 // moth->AddNode(highVCard, 1, 0);
1141 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1142 // moth->AddNode(supportRing, 1, 0);
1144 // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1145 // moth->AddNode(endLadderCards, 1, 0);
1147 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1148 // moth->AddNode(carlosCard, 1, 0);
1153 //==================================
1154 //--- test of flat cable curvature
1155 //==================================
1158 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1159 cable.SetNLayers(1);
1160 cable.SetNLayers(2);
1161 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1162 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1163 cable.SetInitialNode(endLadderCards);
1165 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1174 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1175 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1176 cable.CreateAndInsertBoxCableSegment(1,angle);
1178 Double_t p3[3], p4[3];
1183 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1184 cable.CreateAndInsertCableCylSegment(2,angle);
1189 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1190 cable.CreateAndInsertCableSegment(3,angle);
1195 //________________________________________________________________________
1196 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1198 // Insert the layer 3 in the mother volume. This is a virtual volume
1199 // containing ladders of layer 3 and the supporting rings
1203 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1207 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1210 if (! fSDDsensor3) CreateBasicObjects();
1212 //====================================
1213 // First we create the central barrel
1214 //====================================
1216 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1217 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1218 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1219 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1220 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1221 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1222 virtualLayer3Shape, airSDD);
1224 Double_t dPhi = 360./fgkLay3Nladd;
1225 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1226 // Placing virtual ladder and detectors volumes following
1227 // ladder ordering convention
1230 Int_t iLaddMax = fgkLay3Nladd;
1231 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1232 iLaddMin = fAddOnlyLadder3min;
1233 iLaddMax = fAddOnlyLadder3max+1;
1236 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1238 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1239 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1240 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1242 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1243 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1244 TGeoCombiTrans *ctLadd;
1245 //=============================================================
1247 // Special modification for ladder 2 of layer 3:
1248 // It has been inverted (pi rotation around y axis)
1250 //=============================================================
1252 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1253 0, ladderPhi, kTRUE);
1255 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1256 0, ladderPhi, kFALSE);
1257 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1258 ///////////////////////////////////////////////////
1259 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1260 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1261 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1262 minRadiusDetBox += detectorsThick/2;
1263 TGeoCombiTrans *ctDet;
1265 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1266 0, ladderPhi, kTRUE);
1268 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1269 0, ladderPhi, kFALSE);
1271 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1272 ///////////////////////////////////////////////////
1276 //====================================
1277 // Then the forward rapidity pieces
1278 // (cooling, Carlos, LV, HV ...)
1279 //====================================
1281 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1282 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1283 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1285 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1286 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1287 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1288 fgkForwardLay3Length/2.);
1290 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1291 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1292 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1295 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1296 virtualForward3Shape, airSDD);
1297 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1298 virtualForward3Shape, airSDD);
1299 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1300 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1302 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1303 fgkLay3Length/2+fgkForwardLay3Length/2);
1304 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1305 -fgkLay3Length/2-fgkForwardLay3Length/2);
1307 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1309 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1310 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1311 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1312 minRadiusDetBox += detectorsThick/2;
1314 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1316 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1317 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1318 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1319 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1321 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1322 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1329 virtualLayer3->CheckOverlaps(0.01);
1330 //virtualForward3Pos->CheckOverlaps(0.01);
1331 //virtualForward3Neg->CheckOverlaps(0.01);
1334 virtualLayer3->SetVisibility(kFALSE);
1335 //virtualForward3Pos->SetVisibility(kFALSE);
1336 //virtualForward3Neg->SetVisibility(kFALSE);
1339 moth->AddNode(virtualLayer3, 1, 0);
1340 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1341 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1345 // //________________________________________________________________________
1346 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1348 // // Insert the forward pieces of layer 3 in the mother volume.
1349 // // (cooling, Carlos, LV, HV ...)
1353 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1357 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1359 // if (! fSDDsensor3) CreateBasicObjects();
1361 // Double_t dPhi = 360./fgkLay3Nladd;
1362 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1363 // Int_t iLaddMin = 0;
1364 // Int_t iLaddMax = fgkLay3Nladd;
1365 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1366 // iLaddMin = fAddOnlyLadder3min;
1367 // iLaddMax = fAddOnlyLadder3max+1;
1369 // char rotName[30];
1372 // //=================
1374 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1375 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1376 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1378 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1379 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1380 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1381 // fgkForwardLay3Length/2.);
1383 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1384 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1385 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1388 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1389 // virtualForward3Shape, airSDD);
1390 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1391 // virtualForward3Shape, airSDD);
1392 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1393 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1395 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1396 // fgkLay3Length/2+fgkForwardLay3Length/2);
1397 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1398 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1400 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1402 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1403 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1404 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1405 // minRadiusDetBox += detectorsThick/2;
1407 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1409 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1410 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1411 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1412 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1414 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1415 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1418 // if(GetDebug(1)) {
1419 // virtualForward3Pos->CheckOverlaps(0.01);
1420 // virtualForward3Neg->CheckOverlaps(0.01);
1423 // virtualForward3Pos->SetVisibility(kFALSE);
1424 // virtualForward3Neg->SetVisibility(kFALSE);
1426 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1427 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1432 //________________________________________________________________________
1433 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1435 // Insert the end-ladder of layer 3 in the mother volume.
1436 // (cooling, Carlos, LV, HV ...)
1440 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1444 if (! fSDDsensor3) CreateBasicObjects();
1447 Int_t iLaddMax = fgkLay3Nladd;
1448 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1449 iLaddMin = fAddOnlyLadder3min;
1450 iLaddMax = fAddOnlyLadder3max+1;
1453 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1454 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1457 Double_t dPhi = 360./fgkLay3Nladd;
1458 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1460 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1462 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1464 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1466 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1468 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1469 fgkLay3Length/2, ladderPhi, kTRUE);
1470 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1471 -fgkLay3Length/2, ladderPhi, kFALSE);
1473 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1474 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1478 virtualForward3Pos->CheckOverlaps(0.01);
1479 virtualForward3Neg->CheckOverlaps(0.01);
1482 moth->AddNode(virtualForward3Pos, 1);
1483 moth->AddNode(virtualForward3Neg, 1);
1486 //________________________________________________________________________
1487 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1489 // Insert the layer 4 in the mother volume. This is a virtual volume
1490 // containing ladders of layer 4 and the supporting rings
1494 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1500 if (! fSDDsensor3) CreateBasicObjects();
1502 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1503 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1504 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1505 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1506 virtualLayer4Shape, airSDD);
1508 //====================================
1509 // First we create the central barrel
1510 //====================================
1512 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1513 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1514 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1516 Double_t dPhi = 360./fgkLay4Nladd;
1517 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1519 // placing virtual ladder and detectors volumes following ladder
1520 // ordering convention
1523 Int_t iLaddMax = fgkLay4Nladd;
1524 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1525 iLaddMin = fAddOnlyLadder4min;
1526 iLaddMax = fAddOnlyLadder4max+1;
1528 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1530 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1531 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1532 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1534 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1535 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1536 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1537 0, ladderPhi, kTRUE);
1538 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1539 ///////////////////////////////////////////////////
1540 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1541 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1543 minRadiusDetBox = fgkLay4DetLongRadius;
1544 minRadiusDetBox += detBoxThickness/2;
1545 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1546 0, ladderPhi, kTRUE);
1547 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1548 ///////////////////////////////////////////////////
1552 //====================================
1553 // Then the pieces at forward rapidity
1554 // (cooling, Carlos, LV, HV ...)
1555 //====================================
1557 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1558 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1559 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1561 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1562 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1563 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1564 fgkForwardLay4Length/2.);
1565 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1566 virtualForward4Shape, airSDD);
1567 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1568 virtualForward4Shape, airSDD);
1569 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1570 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1572 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1573 fgkLay4Length/2+fgkForwardLay4Length/2);
1574 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1575 -fgkLay4Length/2-fgkForwardLay4Length/2);
1577 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1579 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1580 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1582 minRadiusDetBox = fgkLay4DetLongRadius;
1583 minRadiusDetBox += detBoxThickness/2;
1585 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1587 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1588 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1589 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1590 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1591 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1592 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1596 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1598 virtualLayer4->SetVisibility(kFALSE);
1599 //virtualForward4Pos->SetVisibility(kFALSE);
1600 //virtualForward4Neg->SetVisibility(kFALSE);
1602 moth->AddNode(virtualLayer4,1,0);
1603 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1604 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1608 // //________________________________________________________________________
1609 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1611 // // Insert the layer 4 in the mother volume. This is a virtual volume
1612 // // containing ladders of layer 4 and the supporting rings
1613 // // (cooling, Carlos, LV, HV ...)
1617 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1621 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1623 // if (! fSDDsensor3) CreateBasicObjects();
1625 // Double_t dPhi = 360./fgkLay4Nladd;
1626 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1628 // // placing virtual ladder and detectors volumes following ladder
1629 // // ordering convention
1630 // char rotName[20];
1631 // Int_t iLaddMin = 0;
1632 // Int_t iLaddMax = fgkLay4Nladd;
1633 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1634 // iLaddMin = fAddOnlyLadder4min;
1635 // iLaddMax = fAddOnlyLadder4max+1;
1638 // //=================
1639 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1640 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1641 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1643 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1644 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1645 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1646 // fgkForwardLay4Length/2.);
1647 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1648 // virtualForward4Shape, airSDD);
1649 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1650 // virtualForward4Shape, airSDD);
1651 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1652 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1654 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1655 // fgkLay4Length/2+fgkForwardLay4Length/2);
1656 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1657 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1659 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1661 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1662 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1663 // if (iLadd%2 != 0)
1664 // minRadiusDetBox = fgkLay4DetLongRadius;
1665 // minRadiusDetBox += detBoxThickness/2;
1667 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1669 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1670 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1671 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1672 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1673 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1674 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1677 // virtualForward4Pos->SetVisibility(kFALSE);
1678 // virtualForward4Neg->SetVisibility(kFALSE);
1680 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1681 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1685 //________________________________________________________________________
1686 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1688 // Insert the end-ladder of layer 4 in the mother volume.
1689 // (cooling, Carlos, LV, HV ...)
1693 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1697 if (! fSDDsensor3) CreateBasicObjects();
1699 // placing virtual ladder and detectors volumes following ladder
1700 // ordering convention
1702 Int_t iLaddMax = fgkLay4Nladd;
1703 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1704 iLaddMin = fAddOnlyLadder4min;
1705 iLaddMax = fAddOnlyLadder4max+1;
1708 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1709 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1712 Double_t dPhi = 360./fgkLay4Nladd;
1713 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1715 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1717 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1720 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1722 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1724 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1725 fgkLay4Length/2, ladderPhi, kTRUE);
1726 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1727 -fgkLay4Length/2, ladderPhi, kFALSE);
1728 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1729 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1732 moth->AddNode(virtualForward4Pos, 1);
1733 moth->AddNode(virtualForward4Neg, 1);
1737 //________________________________________________________________________
1738 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1740 // return an assembly volume containing the CF ladder
1743 Int_t nDetectors = fgkLay3Ndet;
1744 Double_t ladderLength = fgkLay3LadderLength;
1745 Double_t underSegDH = fLay3LadderUnderSegDH;
1746 Double_t *sensorZPos = fLay3sensorZPos;
1747 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1748 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1752 nDetectors = fgkLay4Ndet;
1753 ladderLength = fgkLay4LadderLength;
1754 digitCableA = fDigitCableLay4A;
1755 digitCableB = fDigitCableLay4B;
1756 underSegDH = fLay4LadderUnderSegDH;
1757 sensorZPos = fLay4sensorZPos;
1760 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1762 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1763 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1765 // placing virtual ladder segment following detector ordering convention
1766 //=======================================================================
1769 // adding segment this way to create cable points in the correct order ...
1770 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1772 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1773 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1774 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1775 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1776 + fgkSegmentLength/2;
1777 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1778 underSegDH/2,segmentPos);
1780 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1782 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1784 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1785 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1786 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1787 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1788 + fgkSegmentLength/2;
1789 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1790 underSegDH/2,segmentPos);
1792 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1795 // putting virtual volume corresponding to the end of ladder
1796 //=======================================================================
1797 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1798 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1799 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1800 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1801 // Euler rotation : about Z, then new X, then new Z
1802 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1803 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1804 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1805 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1806 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1808 // creating and inserting cable segments
1809 // (check points are placed while creating segments)
1810 //=======================================================================
1812 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1814 digitCableA[iSegment].SetInitialNode(virtualLadder);
1815 digitCableB[iSegment].SetInitialNode(virtualLadder);
1817 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1818 Double_t rotation = 0;
1820 rotation = 90-fgkHybridAngle;
1821 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1823 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1827 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1828 Double_t rotation = 0;
1830 rotation = fgkHybridAngle-90;
1831 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1833 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1838 //=======================================================================
1840 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1841 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1843 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1844 char cableHVname[30];
1845 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1846 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1847 cableHV[iSegment].SetName(cableHVname);
1848 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1849 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1850 cableHV[iSegment].SetNLayers(2);
1851 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1853 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1854 cableHV[iSegment].SetInitialNode(virtualLadder);
1856 Double_t x1[3], x2[3], x3[3],
1857 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1859 x1[0] = -fgkTransitHVtailXpos;
1860 x2[0] = -fgkTransitHVtailXpos;
1861 x3[0] = -fgkTransitHVtailXpos;
1862 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1863 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1864 *fgkLongHVcableSeparation;
1865 // adjust where HV long cable starts in Y
1866 // useful if you want to let some space for alignment
1867 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1868 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1869 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1871 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1872 x2[2] = x1[2]+5*fgkmm;
1873 x3[2] = ladderLength/2-endLength;
1874 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1875 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1876 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1878 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1879 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1880 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1881 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1885 x1[0] = fgkTransitHVtailXpos;
1886 x2[0] = fgkTransitHVtailXpos;
1887 x3[0] = fgkTransitHVtailXpos;
1889 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1890 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1891 *fgkLongHVcableSeparation;
1892 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1893 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1894 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1896 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1897 x2[2] = x1[2]-5*fgkmm;
1898 x3[2] = -ladderLength/2+endLength;
1899 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1900 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1901 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1903 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1904 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1908 //**********************************
1909 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1910 return virtualLadder;
1914 //________________________________________________________________________
1915 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
1916 Double_t xSign, Double_t L, Double_t H, Double_t l) {
1917 // Create one half of the V shape corner of CF ladder
1919 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1920 cfLaddSide->SetVertex( 0, 0, 0);
1921 cfLaddSide->SetVertex( 1, 0, -H);
1922 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1923 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1924 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1925 cfLaddSide->SetVertex( 4, 0, 0);
1926 cfLaddSide->SetVertex( 5, 0, -H);
1927 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1928 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1929 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1934 //________________________________________________________________________
1935 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1937 // return a box containing the front-end hybrid
1940 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1942 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1943 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1944 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1945 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1946 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1947 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1948 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1949 // + upFLTotalThick + ccUpLayerTotThick);
1950 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1952 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1954 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1956 //**************************************************** media :
1957 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1958 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1959 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1960 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1961 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1962 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1963 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1964 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1965 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1966 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1967 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1969 //**************************************************** main volume :
1970 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1971 (fgkHybridLength)/2);
1972 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1975 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1976 fgkHybridThBridgeThick/2,
1979 //**************************************************** Thermal bridge :
1980 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1982 carbonFiberLadderStruct);
1983 vThermalBridge->SetLineColor(fColorCarbonFiber);
1984 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1985 +fgkHybridThBridgeThick/2, 0);
1986 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
1988 //**************************************************** Screen layer :
1989 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
1990 fgkHybAlThick/2, fgkHybridLength/2);
1991 //here the upedex and glue layers are both assumed to be polyimide
1992 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
1994 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
1996 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
1997 (screenTotalThick+lowFLTotalThick)/2);
1999 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2000 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2002 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2003 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2004 +fgkHybAlThick/2, 0);
2006 TGeoTranslation hybHolePos1Tr(roundHoleX,
2007 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2008 -fgkHybridLength/2+fgkHybRndHoleZ);
2009 TGeoTranslation hybHolePos2Tr(roundHoleX,
2010 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2011 fgkHybridLength/2-fgkHybRndHoleZ);
2013 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2014 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2015 hybHolePos1->SetName("hybHolePos1");
2016 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2017 hybHolePos2->SetName("hybHolePos2");
2019 upGlueScreenTr->RegisterYourself();
2020 alScreenTr->RegisterYourself();
2021 hybHolePos1->RegisterYourself();
2022 hybHolePos2->RegisterYourself();
2025 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2026 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2027 "+sRoundHole:hybHolePos2)");
2028 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2029 vScreenAl->SetLineColor(fColorAl);
2030 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2031 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2032 "+sRoundHole:hybHolePos2)");
2033 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2034 sScreenUpGlue,polyhamideSDD);
2035 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2037 hybrid->AddNode(vScreenUpGlue, 1, 0);
2038 hybrid->AddNode(vScreenAl, 1, 0);
2040 //**************************************************** FL low layer :
2041 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2042 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2044 //here the upedex and glue layers are both assumed to be polyimide
2045 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2046 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2048 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2049 fgkHybAlThick/2, sideWidth1/2);
2051 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2052 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2053 -(fgkHybridLength-sideWidth1)/2);
2054 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2055 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2056 -(fgkHybridLength-sideWidth1)/2);
2057 upGlueBarTr1->RegisterYourself();
2058 alBarTr1->RegisterYourself();
2060 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2061 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2062 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2063 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2064 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2065 sLowUpGlueBar1, polyhamideSDD);
2066 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2068 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2069 vLowAlBar1->SetLineColor(fColorAl);
2070 hybrid->AddNode(vLowUpGlueBar1,1,0);
2071 hybrid->AddNode(vLowAlBar1,1,0);
2074 //here the upedex and glue layers are both assumed to be polyimide
2075 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2076 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2078 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2079 fgkHybAlThick/2, sideWidth2/2);
2081 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2082 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2083 (fgkHybridLength-sideWidth2)/2);
2084 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2085 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2086 (fgkHybridLength-sideWidth2)/2);
2087 upGlueBarTr2->RegisterYourself();
2088 alBarTr2->RegisterYourself();
2090 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2091 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2092 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2093 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2094 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2096 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2098 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2099 vLowAlBar2->SetLineColor(fColorAl);
2100 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2101 hybrid->AddNode(vLowAlBar2, 1, 0);
2103 if(GetDebug(3)) { // Remove compiler warning.
2104 sAlScreenLayer->InspectShape();
2105 sUpGlueScreenLayer->InspectShape();
2106 sRoundHole->InspectShape();
2107 sUpGlueBar1->InspectShape();
2108 sUpGlueBar2->InspectShape();
2109 sAlBar1->InspectShape();
2110 sAlBar2->InspectShape();
2113 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2114 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2115 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2117 lowFLpiece.SetNLayers(2);
2118 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2120 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2121 // alSDD at 80% : mostly to take into account strips of piece 3
2123 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2124 lowLayerYmin + lowFLTotalThick/2,
2125 -fgkHybridLength/2 + sideWidth1 };
2126 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2127 Double_t vZ[3] = {0,0,1};
2128 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2129 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2130 lowFLpiece.SetInitialNode(hybrid);
2131 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2132 lowFLpiece.ResetPoints();
2134 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2135 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2137 lowFLpiece.SetWidth(piece2width);
2138 lowFLpiece.SetName("lowFLpiece2");
2139 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2141 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2142 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2143 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2144 lowFLpiece.ResetPoints();
2146 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2147 - fgkHybFLlowHoleAmbDX/2;
2149 lowFLpiece.SetWidth(piece3width);
2150 lowFLpiece.SetName("lowFLpiece3");
2151 x1[0] = fgkHybridWidth/2-piece3width/2;
2153 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2154 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2155 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2157 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2158 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2159 Double_t vX[3] = {1,0,0};
2160 for (Int_t i=0; i<3; i++) {
2162 sprintf(ch, "lowFLpieceA%i", i+4);
2163 lowFLpiece.SetName(ch);
2164 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2166 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2167 x1[0] = -fgkHybridWidth/2 + piece1width;
2168 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2169 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2170 x1[2] = zPiece; x2[2] = zPiece;
2171 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2172 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2173 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2174 lowFLpiece.ResetPoints();
2176 sprintf(ch, "lowFLpieceB%i", i+4);
2177 lowFLpiece.SetName(ch);
2178 x1[0] = fgkHybridWidth/2 - piece3width;
2179 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2180 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2181 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2182 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2185 //**************************************************** chips+CC:
2186 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2187 chip.SetInitialNode(hybrid);
2189 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2190 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2191 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2192 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2194 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2195 // Here the tho CC (low+up) are merged
2196 // In fact, the last layer has a smaller surface of Al -> I put 80%
2198 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2202 for (Int_t i=0; i<4; i++) {
2203 sprintf(ch, "pascalCC%i", i);
2205 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2206 x2[0] = x1[0] + fgkHybPascalDX;
2207 x1[2] = zChips[i] - fgkHybridLength/2;
2209 chip.AddCheckPoint( hybrid, 0, x1, vX );
2210 chip.AddCheckPoint( hybrid, 1, x2, vX );
2211 chip.CreateAndInsertBoxCableSegment(1,-90);
2214 sprintf(ch, "ambraCC%i", i);
2216 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2217 x2[0] = x1[0] + fgkHybAmbraDX;
2218 chip.AddCheckPoint( hybrid, 0, x1, vX );
2219 chip.AddCheckPoint( hybrid, 1, x2, vX );
2220 chip.CreateAndInsertBoxCableSegment(1,-90);
2224 //**************************************************** CC outside chips:
2225 // I don't think there is a second aluminium layer here ...
2226 for (Int_t i = 0; i<4; i++) {
2228 sprintf(ch, "ccLayerA%i", i);
2230 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2231 ccLayer1.SetInitialNode(hybrid);
2232 ccLayer1.SetNLayers(2);
2233 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2234 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2237 x1[0] = -fgkHybridWidth/2;
2238 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2239 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2240 + fgkHybChipThick + ccUpLayerTotThick/2;
2242 x1[2] = zChips[i] - fgkHybridLength/2;
2244 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2245 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2246 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2248 sprintf(ch, "ccLayerB%i", i);
2249 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2250 ccLayer2.SetInitialNode(hybrid);
2251 ccLayer2.SetNLayers(2);
2252 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2253 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2256 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2257 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2258 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2259 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2260 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2261 ccLayer2.ResetPoints();
2262 sprintf(ch, "ccLayerC%i", i);
2263 ccLayer2.SetName(ch);
2264 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2265 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2266 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2267 + ccUpLayerTotThick/2;
2270 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2271 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2272 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2275 //**************************************************** FL UP:
2276 // (last Al layer will be a special triangular shape)
2277 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2278 fgkHybFLUpperWidth/2, flUpThick/2,
2279 fgkHybFLUpperLength/2);
2280 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2281 sFLupPolyhamide, polyhamideSDD);
2282 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2283 TGeoTranslation *trFLupPolyhamide =
2284 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2285 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2287 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2289 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2290 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2291 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2292 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2293 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2294 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2295 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2296 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2297 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2298 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2301 vAluStrip->SetLineColor(fColorAl);
2302 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2303 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2305 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2306 +flUpThick+fgkHybAlThick/2;
2307 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2308 fgkHybridWidth/2,yRotAluStrip,
2309 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2310 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2311 AddTranslationToCombiTrans(aluStripTr2,0,0,
2312 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2313 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2314 AddTranslationToCombiTrans(aluStripTr3,0,0,
2315 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2316 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2317 AddTranslationToCombiTrans(aluStripTr4,0,0,
2318 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2320 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2321 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2322 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2323 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2324 //**************************************************** SMD:
2325 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2326 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2327 fgkHybSMDheight/2,fgkHybSMDendW/2);
2328 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2330 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2331 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2332 fgkHybSMDmiddleW/2);
2333 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2334 hybSMDmiddle,medSMD);
2335 vHybSMDmiddle->SetLineColor(fColorSMD);
2336 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2337 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2338 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2339 hybSMDend,medSMDweld);
2340 vHybSMDend->SetLineColor(fColorSMDweld);
2341 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2342 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2343 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2344 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2345 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2346 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2347 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2348 for (Int_t i=0; i<fgkNHybSMD; i++) {
2349 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2350 -fgkHybridWidth/2+fgkHybSMDposX[i],
2351 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2352 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2353 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2359 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2360 hybrid->SetVisibility(kFALSE);
2364 //________________________________________________________________________
2365 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2367 // Return a TGeoVolume* containing a segment of a ladder.
2370 TGeoMedium *phynoxSDD = GetMedium("INOX$");
2371 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2372 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2374 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2375 Double_t segmentLength = fgkSegmentLength;
2376 Double_t spaceBetweenCables = 500*fgkmicron;
2378 //*****************************************
2379 // Set parameters according to (iLay,iSeg):
2380 //*****************************************
2381 Int_t nDetectors = fgkLay3Ndet;
2382 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2383 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2384 (fgkSegmentLength*fgkLay3Ndet/2. -
2385 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2386 // sensorCenterZPos = z in segment local coord syst.
2388 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2389 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2392 } else if (iLay==4) {
2393 nDetectors = fgkLay4Ndet;
2394 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2395 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2396 (fgkSegmentLength*fgkLay4Ndet/2. -
2397 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2398 digitCableA = fDigitCableLay4A;
2399 digitCableB = fDigitCableLay4B;
2401 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2404 Double_t cableSideSign = -1;
2405 if (iSeg<nDetectors/2) cableSideSign = 1;
2406 Double_t spaceForCables = spaceBetweenCables*
2407 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2409 // gives [0-1-2-2-1-0]*spaceBetweenCables
2410 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2411 Int_t iUpdateCableMin;
2412 Int_t iUpdateCableMax;
2413 if (cableSideSign==-1) {
2414 iUpdateCableMin = nDetectors/2;
2415 iUpdateCableMax = iSeg-1;
2417 iUpdateCableMin = iSeg+1;
2418 iUpdateCableMax = nDetectors/2-1;
2422 cout << "Segment ("<< iLay <<',' << iSeg
2423 << ") : sensor z shift in local segment coord.="
2424 << sensorCenterZPos << endl;
2427 //****************************
2428 // The segment volume
2429 //****************************
2431 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2432 // likely slows down the transport of particles through the geometry
2434 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2436 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2437 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2438 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2441 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2443 virtualSeg->SetVisibility(kFALSE);
2445 //******************************
2446 // Carbon fiber structure :
2447 //******************************
2449 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2450 Int_t volumeIndex = 1;
2451 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2452 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2456 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2457 fLaddSegCommonTr[i]);
2460 //**********************************
2461 // Pine support of the sensors :
2462 //**********************************
2463 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2464 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2466 // The use of the following constructor type allow to use rotPS1 and rotPS2
2467 // (and not copy them) therefore we gain some memory
2468 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2469 - fgkLadderHeight/2.-tDY
2470 + fgkPinSuppHeight/2.,
2471 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2473 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2474 - fgkLadderHeight/2.-tDY
2475 + fgkPinSuppHeight/2.,
2476 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2477 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2479 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2480 - fgkLadderHeight/2.-tDY
2481 + fgkPinSuppHeight/2.,
2482 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2483 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2485 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2486 - fgkLadderHeight/2.-tDY
2487 + fgkPinSuppHeight/2.,
2488 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2489 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2491 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2492 - fgkLadderHeight/2. - tDY
2493 + fgkPinSuppHeight/2.,
2494 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2496 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2497 - fgkLadderHeight/2. - tDY
2498 + fgkPinSuppHeight/2.,
2499 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2500 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2502 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2503 - fgkLadderHeight/2. - tDY
2504 + fgkPinSuppHeight/2.,
2505 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2506 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2508 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2509 - fgkLadderHeight/2. - tDY
2510 + fgkPinSuppHeight/2.,
2511 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2512 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2514 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2515 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2516 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2517 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2518 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2519 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2520 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2521 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2523 TGeoMedium *pinMed = GetMedium("SDDKAPTON (POLYCH2)$"); // medium ???
2524 Double_t fgkPinHeight = 4.5*fgkmm;
2525 TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2527 TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2529 TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2530 - fgkLadderHeight/2.-tDY
2532 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2533 AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2534 virtualSeg->AddNode(pineV, 1, transPS2b);
2536 TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2537 - fgkLadderHeight/2. - tDY
2539 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2540 AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2541 virtualSeg->AddNode(pineV, 2, transPS6b);
2544 TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2545 - fgkLadderHeight/2.-tDY
2547 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2548 AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2549 virtualSeg->AddNode(pineV, 3, transPS4b);
2551 TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2552 - fgkLadderHeight/2. - tDY
2554 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2555 AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2556 virtualSeg->AddNode(pineV, 4, transPS8b);
2559 //******************************
2560 // Cooling pipe supports :
2561 //******************************
2562 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2563 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2564 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2565 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2567 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2568 (triangleHeight+triangleCPaxeDist/
2569 TMath::Sin(halfTheta)-coolPipeSuppH);
2570 if (fAddCoolingSyst) {
2571 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2572 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2573 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2574 -fgkLadderHeight/2. - tDY
2575 +coolPipeSuppH+fgkLadderBeamRadius,
2576 -segmentLength/2., rotCPS1);
2578 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2579 -fgkLadderHeight/2. - tDY
2580 +coolPipeSuppH+fgkLadderBeamRadius,
2581 -segmentLength/2., rotCPS1);
2582 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2584 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2585 -fgkLadderHeight/2.- tDY
2586 +coolPipeSuppH+fgkLadderBeamRadius,
2587 segmentLength/2., rotCPS2);
2589 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2590 -fgkLadderHeight/2.- tDY
2591 +coolPipeSuppH+fgkLadderBeamRadius,
2592 segmentLength/2., rotCPS2);
2593 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2595 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2596 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2597 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2598 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2601 //************************
2603 //************************
2604 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2605 -fgkLadderHeight/2. - tDY +
2606 fgkLadderBeamRadius+coolPipeSuppH, 0);
2607 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2608 -fgkLadderHeight/2.- tDY +
2609 fgkLadderBeamRadius+coolPipeSuppH, 0);
2611 if (fAddCoolingSyst) {
2612 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2613 fgkCoolPipeOuterDiam/2,
2615 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2618 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2619 coolingPipeShape, phynoxSDD );
2620 coolingPipe->SetLineColor(fColorPhynox);
2621 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2625 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2626 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2628 virtualSeg->AddNode(cooler, 1, pipeTr1);
2629 virtualSeg->AddNode(cooler, 2, pipeTr2);
2633 //**********************************
2634 // Bases of hybrid thermal bridges
2635 //**********************************
2636 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2637 // approx !!! not clear on 0752/14-A
2638 if (fAddCoolingSyst) {
2639 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2640 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2641 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2642 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2644 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2645 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2648 //*************************
2650 //*************************
2651 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2652 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2654 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2655 - shiftHyb*SinD(fgkHybridAngle) );
2656 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2657 + shiftHyb*CosD(fgkHybridAngle) );
2659 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2660 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2661 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2662 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2663 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2664 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2666 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2667 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2674 // Starting from this segment
2675 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2676 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2677 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2678 - digitCableA->GetWidth()/2;
2679 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2680 - digitCableA->GetThickness()/2;
2682 Double_t digitCableX = ( coolPipeSuppL
2683 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2684 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2685 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2686 + fgkLadderBeamRadius+coolPipeSuppH
2687 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2688 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2691 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2692 digitCableY, cableSideSign*hybDz };
2693 Double_t digitCableCenterA1[3] = {
2694 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2695 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2696 cableSideSign*segmentLength/2 };
2698 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2699 digitCableY,cableSideSign*hybDz};
2700 Double_t digitCableCenterB1[3]={
2701 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2702 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2703 cableSideSign*segmentLength/2 };
2705 Double_t vZ[3] = {0,0,1};
2706 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2707 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2708 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2709 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2711 // Updating the other cables
2712 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2714 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2716 digitCableA[iCable].GetPoint( 1, coord);
2717 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2718 digitCableB[iCable].GetPoint( 1, coord);
2719 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2723 //**********************************
2724 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2729 //________________________________________________________________________
2730 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2732 // Create a pine support and its pine
2733 // axis of rotation is the cone axis, center in its middle
2735 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ?
2737 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2738 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2739 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2740 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2741 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2742 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2743 fgkPinSuppHeight/2.+0.00001);
2744 // 0.00001 is for seing the actual hole (avoid viewer artefact)
2746 if(GetDebug(3)){// Remove compiler warning.
2747 cone->InspectShape();
2748 tong->InspectShape();
2749 hole->InspectShape();
2752 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2753 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2754 tongTrans->RegisterYourself();
2755 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2756 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2757 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2759 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2761 pinSupport->SetLineColor(fColorRyton);
2767 //________________________________________________________________________
2768 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2770 // Create half of the cooling pipe support (ALR-0752/3)
2773 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2775 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2776 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2777 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
2778 -fgkCoolPipeSuppWidthExt/2.);
2779 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2780 fgkCoolPipeSuppWidthExt/2.);
2781 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2782 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2783 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
2784 -fgkCoolPipeSuppWidthExt/2.);
2785 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2786 fgkCoolPipeSuppWidthExt/2.);
2787 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2788 side1->SetName("ITSsddCPSside1");
2790 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2791 - fgkCoolPipeSuppAxeDist
2792 + fgkCoolPipeSuppWidthExt/2., 0);
2793 side1Tr->RegisterYourself();
2794 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2795 - fgkCoolPipeSuppAxeDist
2796 + fgkCoolPipeSuppWidthExt*3/2.
2797 + fgkCoolPipeSuppWidthIn,0);
2798 side2Tr->RegisterYourself();
2800 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2801 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2802 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2803 TGeoTranslation *middleTr =
2804 new TGeoTranslation("ITSsddCPStr3",
2805 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2806 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2807 +fgkCoolPipeSuppWidthIn/2., 0);
2808 middleTr->RegisterYourself();
2810 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2811 fgkCoolPipeSuppTongW/4.,
2812 (fgkCoolPipeSuppFulWidth
2813 - 2*fgkCoolPipeSuppWidthExt
2814 - fgkCoolPipeSuppWidthIn)/2,
2815 fgkCoolPipeSuppHeight/2.);
2817 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2818 fgkCoolPipeSuppTongW/4.,
2819 - fgkCoolPipeSuppAxeDist
2820 + fgkCoolPipeSuppFulWidth
2821 - axeBox->GetDY(), 0);
2822 axeBoxTr->RegisterYourself();
2824 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2825 fgkCoolPipeSuppTongW/4.);
2827 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2828 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2829 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2830 axeTrans->RegisterYourself();
2831 //delete axeRot; // make the code crash, no idea of why !!!
2834 middle->InspectShape();
2835 axe->InspectShape();
2838 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2840 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2841 "ITSsddCoolPipeSuppShapeL",
2842 "ITSsddCPSmiddle:ITSsddCPStr3"
2843 "+ITSsddCPSside1:ITSsddCPStr1"
2844 "+ITSsddCPSside1:ITSsddCPStr2"
2845 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2846 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2847 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2848 coolPipeSuppShape, rytonSDD);
2850 coolPipeSupp->SetLineColor(fColorRyton);
2852 return coolPipeSupp;
2856 //________________________________________________________________________
2857 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2859 //Create half of the cooling pipe support (ALR-0752/3)
2862 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2864 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2865 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2866 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2867 -fgkCoolPipeSuppWidthExt/2.);
2868 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2869 fgkCoolPipeSuppWidthExt/2.);
2870 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2871 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2872 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2873 -fgkCoolPipeSuppWidthExt/2.);
2874 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2875 fgkCoolPipeSuppWidthExt/2.);
2876 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2877 side1->SetName("ITSsddCPSside1R");
2879 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2880 - fgkCoolPipeSuppAxeDist
2881 + fgkCoolPipeSuppWidthExt/2., 0);
2882 side1Tr->RegisterYourself();
2883 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2884 - fgkCoolPipeSuppAxeDist
2885 + fgkCoolPipeSuppWidthExt*3/2.
2886 + fgkCoolPipeSuppWidthIn, 0);
2887 side2Tr->RegisterYourself();
2889 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2890 (fgkCoolPipeSuppMaxLength/2.
2891 - fgkCoolPipeSuppSlitL)/2.,
2892 fgkCoolPipeSuppWidthIn/2.,
2893 fgkCoolPipeSuppHeight/2.);
2894 TGeoTranslation *middleTr =
2895 new TGeoTranslation("ITSsddCPStr3R",
2896 -( fgkCoolPipeSuppMaxLength/2.
2897 -fgkCoolPipeSuppSlitL)/2.,
2898 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2899 + fgkCoolPipeSuppWidthIn/2.,0);
2900 middleTr->RegisterYourself();
2902 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2903 fgkCoolPipeSuppTongW/4.,
2904 (fgkCoolPipeSuppFulWidth
2905 - 2*fgkCoolPipeSuppWidthExt
2906 - fgkCoolPipeSuppWidthIn)/2,
2907 fgkCoolPipeSuppHeight/2.);
2909 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2910 - fgkCoolPipeSuppTongW/4.,
2911 - fgkCoolPipeSuppAxeDist
2912 + fgkCoolPipeSuppFulWidth
2913 - axeBox->GetDY(),0);
2914 axeBoxTr->RegisterYourself();
2916 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2917 fgkCoolPipeSuppTongW/4.);
2919 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2920 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2921 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2922 axeTrans->RegisterYourself();
2926 middle->InspectShape();
2927 axe->InspectShape();
2930 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2931 "ITSsddCoolPipeSuppShapeR",
2932 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2933 "+ITSsddCPSside1R:ITSsddCPStr1R"
2934 "+ITSsddCPSside1R:ITSsddCPStr2R"
2935 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2936 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2938 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2939 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2940 coolPipeSuppShape, rytonSDD);
2941 coolPipeSupp->SetLineColor(fColorRyton);
2943 return coolPipeSupp;
2946 //________________________________________________________________________
2947 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2949 // based on ALR 0752/8
2952 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2954 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2955 - (fgkRadiusAminBTB+fgkBTBthick);
2956 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2957 fgkBTBthick/2., fgkBTBlength/2.);
2958 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2959 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2960 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2961 base1Tr->RegisterYourself();
2963 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2965 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2966 fgkBTBthick/2., fgkBTBlength/2.);
2967 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2968 fgkBTBaxisAtoBottom - base2width/2.,
2969 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2970 base2Tr->RegisterYourself();
2972 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2973 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
2974 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
2975 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
2976 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
2977 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
2978 sideTr1->RegisterYourself();
2979 sideTr2->RegisterYourself();
2981 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
2982 fgkBTBthick/2., fgkBTBHoleLength/2.);
2983 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
2984 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2985 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2986 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
2987 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
2988 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2989 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2990 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
2991 holeTr1->RegisterYourself();
2992 holeTr2->RegisterYourself();
2994 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
2995 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
2996 fgkRadiusAminBTB, radiusAmaxBTB,
2997 fgkBTBlength/2., 0., 180.);
2998 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
2999 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3000 fgkBTBlength/2., 270., 360.);
3001 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3002 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3004 roundTr1->RegisterYourself();
3006 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3007 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3008 fgkBTBlength/2., 180., 270.);
3009 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3010 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3012 roundTr2->RegisterYourself();
3014 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3015 "ITSsddBaseThermalBridgeShape",
3016 "ITSsddBTBbase1:ITSsddBTBtr1"
3017 "+ ITSsddBTBbase2:ITSsddBTBtr2"
3018 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3019 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3020 "+ ITSsddBTBside:ITSsddBTBsideTr1"
3021 "+ ITSsddBTBside:ITSsddBTBsideTr2"
3022 "- ITSsddBTBhole:ITSsddBTBholeTr1"
3023 "- ITSsddBTBhole:ITSsddBTBholeTr2"
3024 "+ ITSsddBTBmainAxis");
3026 if(GetDebug(3)){// Remove compiler warning.
3027 base1->InspectShape();
3028 base2->InspectShape();
3029 side->InspectShape();
3030 hole->InspectShape();
3031 mainAxis->InspectShape();
3032 round1->InspectShape();
3033 round2->InspectShape();
3036 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3037 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3039 carbonFiberLadderStruct);
3041 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3042 return vBaseThermalBridge;
3046 //________________________________________________________________________
3047 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3049 // Return an assembly containing a end of a CF ladder.
3052 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3053 TGeoMedium *stesalite = GetMedium("G10FR4$");
3054 TGeoMedium *phynoxSDD = GetMedium("INOX$");
3055 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3057 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3058 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3059 Double_t underSegDH = fLay3LadderUnderSegDH;
3060 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3061 // footDZ is also where to place the ruby's center in local Z
3062 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3065 } else if (iLay==4) {
3066 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3067 coolPipeSuppH = fgkLay4CoolPipeSuppH;
3068 underSegDH = fLay4LadderUnderSegDH;
3069 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3070 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3072 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3076 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3077 + underSegDH/2); //space under ladder segment
3078 // here tDY is not the same as for the segment because the end ladder
3079 // does not have a space under it, inside the general ladder volume.
3080 Double_t segmentLength = fgkSegmentLength;
3081 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3083 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3085 //**********************************
3086 // coding real matter :
3087 //**********************************
3088 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3089 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3090 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3091 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3093 //--- The 3 V shape corners of the Carbon Fiber Ladder
3095 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
3096 fgkLadderLa, fgkLadderHa, fgkLadderl);
3097 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
3098 cfLaddTop1,carbonFiberLadderStruct);
3099 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3100 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
3101 fgkLadderLa, fgkLadderHa, fgkLadderl);
3102 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3103 cfLaddTop2,carbonFiberLadderStruct);
3104 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3105 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3106 -(length-topCornerLength)/2.);
3107 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3108 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3111 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
3112 fgkLadderLb, fgkLadderHb, fgkLadderl);
3113 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3114 cfLaddSide1,carbonFiberLadderStruct);
3115 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3116 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
3117 fgkLadderLb, fgkLadderHb, fgkLadderl);
3118 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3119 cfLaddSide2,carbonFiberLadderStruct);
3120 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3121 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3122 TMath::Tan(beta) - fgkLadderBeamRadius );
3124 // because center of the triangle doesn't correspond to virtual vol. center
3125 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3126 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3127 alpha*TMath::RadToDeg());
3128 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3129 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3130 -alpha*TMath::RadToDeg());
3131 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3132 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3133 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3134 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3135 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3138 // Beams on the sides
3139 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3140 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3142 //Euler rotation : about Z, then new X, then new Z
3143 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3144 -beamPhiPrime*TMath::RadToDeg(), -90);
3145 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3146 beamPhiPrime*TMath::RadToDeg(), -90);
3147 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3148 beamPhiPrime*TMath::RadToDeg(), -90);
3149 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3150 -beamPhiPrime*TMath::RadToDeg(), -90);
3151 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3152 TMath::Tan(halfTheta),
3153 fgkLadderBeamRadius/2. + tDY,
3154 -length/2 + segmentLength/8, beamRot1);
3155 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3156 TMath::Tan(halfTheta),
3157 fgkLadderBeamRadius/2.+tDY,
3158 -length/2 + 3*segmentLength/8, beamRot2);
3159 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3160 TMath::Tan(halfTheta),
3161 fgkLadderBeamRadius/2.+tDY,
3162 -length/2 + segmentLength/8, beamRot3);
3163 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3164 TMath::Tan(halfTheta),
3165 fgkLadderBeamRadius/2. + tDY,
3166 -length/2+3*segmentLength/8, beamRot4);
3168 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3169 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3170 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3171 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3173 //--- Beams of the bottom
3174 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3176 /* Not there actually
3177 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3178 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3179 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3180 bottomBeam1, carbonFiberLadderStruct);
3181 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3183 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3184 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3185 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3186 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3188 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3189 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3190 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3191 bottomBeam2, carbonFiberLadderStruct);
3192 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3193 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3194 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3195 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3197 //**********************************
3198 //the cooling pipe supports
3199 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3200 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3202 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3203 (triangleHeight+triangleCPaxeDist/
3204 TMath::Sin(halfTheta)-coolPipeSuppH);
3206 if (fAddCoolingSyst) {
3207 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3208 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3209 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3210 -fgkLadderHeight/2.+ tDY +
3211 coolPipeSuppH+fgkLadderBeamRadius,
3212 -length/2., rotCPS1);
3213 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3214 -fgkLadderHeight/2.+ tDY +
3215 coolPipeSuppH+fgkLadderBeamRadius,
3216 -length/2., rotCPS2);
3218 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3219 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3222 //**********************************
3223 //--- The stesalite foot of the ladder
3225 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3226 - fgkLadFootY/2+fgkLadFingerPrintY;
3228 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3229 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3231 //=====================================
3234 if (fAddCoolingSyst) {
3236 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3237 -fgkLadderHeight/2.+ tDY +
3238 coolPipeSuppH + fgkLadderBeamRadius,
3239 -length/2.+coolPipeEndLen/2.);
3240 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3241 -fgkLadderHeight/2. + tDY +
3242 fgkLadderBeamRadius + coolPipeSuppH,
3243 -length/2.+coolPipeEndLen/2.);
3245 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3246 fgkCoolPipeOuterDiam/2,
3248 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3251 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3252 coolingPipeShape, phynoxSDD );
3253 coolingPipe->SetLineColor(fColorPhynox);
3254 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3257 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3258 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3260 virtualEnd->AddNode(cooler, 1, pipeTr1);
3261 virtualEnd->AddNode(cooler, 2, pipeTr2);
3265 //=====================================
3266 //--- HV cable guide
3269 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3270 fgkHVguideY1/2,fgkHVguideZ1/2);
3271 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3273 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3274 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3275 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3276 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3278 //=====================================
3280 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3281 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3282 -fgkLadderHeight/2.+ tDY +
3283 coolPipeSuppH+fgkLadderBeamRadius,
3284 -length/2.+coolPipeEndLen+raccordFullLen/2);
3285 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3286 -fgkLadderHeight/2.+ tDY +
3287 coolPipeSuppH+fgkLadderBeamRadius,
3288 -length/2.+coolPipeEndLen+raccordFullLen/2);
3290 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3291 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3293 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3298 //________________________________________________________________________
3299 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3301 //--- The stesalite foot of the ladder
3303 // The 2 screw holes on the left part
3304 // the small holes at each corner of the ruby cage (diam 2mm)
3305 // the really small level difference of 0.3mm on the bottom
3308 TGeoMedium *stesalite = GetMedium("G10FR4$");
3310 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3312 Double_t epsilon = 2e-10;
3313 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3315 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3316 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3317 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3318 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3320 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3321 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3322 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3325 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3326 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3328 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3329 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3330 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3332 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3333 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3334 rubyScrewHoleLen/2);
3336 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3337 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3338 fgkLadFootX/2-rubyScrewHoleLen/2,
3339 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3341 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3342 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3345 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3346 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3347 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3349 ladFootBox1Tr->RegisterYourself();
3350 ladFingerPrintTr->RegisterYourself();
3351 rubyCageHoleTr->RegisterYourself();
3352 rubyScrewHoleTr->RegisterYourself();
3353 rubyHoleTr->RegisterYourself();
3355 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3356 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3357 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3358 "+rubyHole:rubyHoleTr)");
3359 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3360 footRightPart,stesalite);
3361 vFootRightPart->SetLineColor(fColorStesalite);
3363 virtualFoot->AddNode(vFootRightPart, 1, 0);
3366 //--- This was the right part of the foot, now let's do the middle
3367 //--- and the right parts
3369 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3370 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3372 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3373 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3374 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3376 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3377 vFootMiddle->SetLineColor(fColorStesalite);
3378 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3381 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3382 (fgkLadFootY-fgkLadFingerPrintY)/2,
3384 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3385 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3386 -fgkLadFingerPrintY/2, 0);
3387 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3389 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3390 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3393 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3396 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3397 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3399 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3400 vFootLeft->SetLineColor(fColorStesalite);
3401 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3403 if(GetDebug(3)){ // Remove compiler warning.
3404 ladFingerPrint->InspectShape();
3405 ladFootBox1->InspectShape();
3406 rubyCageHole->InspectShape();
3407 rubyScrewHole->InspectShape();
3408 rubyHole->InspectShape();
3414 //________________________________________________________________________
3415 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3417 // return an assembly containing the CARLOS end-ladder board
3418 // and the heat bridge
3422 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3423 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3424 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3425 TGeoMedium *copper = GetMedium("COPPER$");
3426 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3427 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3429 //=========================================
3430 // cooling support of the Carlos card (HeatBridge):
3431 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3433 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3435 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3437 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3438 supCarlosBoard1, alCu12SDD);
3439 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3440 supCarlosBoard2, alCu12SDD);
3441 vSupCarlosBoard1->SetLineColor(4);
3442 vSupCarlosBoard2->SetLineColor(4);
3445 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3446 // shift of the main planes in the direction of their width
3447 // the center is fixed at the center of the 2 small fixing arms on each sides.
3450 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3451 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3452 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3453 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3455 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3456 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3459 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3463 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3464 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3466 //=========================================
3467 // fixing arm of the cooling support :
3468 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3470 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3471 supCarlosBoard3, alCu12SDD);
3472 vSupCarlosBoard3->SetLineColor(4);
3475 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3477 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3478 littleScrew, stainless);
3479 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3480 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3481 fgkLittleScrewHeadR-0.07, rotScrew);
3482 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3483 fgkLittleScrewHeadR+0.07, rotScrew);
3484 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3485 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3487 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3488 0, fgkCarlosSuppAngle, 0);
3489 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3490 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3491 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3492 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3493 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3494 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3497 //=========================================
3498 // screws fixing the board on the U tube
3499 Double_t aaa = fgkCarlosSuppY3; // ???
3500 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3501 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3502 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3503 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3504 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3505 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3507 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3509 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3510 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3511 screw1y,screw1z, CarlosSuppRot);
3513 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3514 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3515 screw1z,screw1y, CarlosSuppRot);
3517 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3518 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3519 screw1y,screw1z, CarlosSuppRot);
3521 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3522 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3523 screw1z,screw1y, CarlosSuppRot);
3525 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3526 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3527 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3528 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3530 //=========================================
3532 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3533 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3534 card1.SetNLayers(2);
3535 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3536 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3537 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3538 p1[0] = -fgkCarlosCardX1/2;
3539 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3540 p1[2] = fgkCarlosCardShift;
3541 p2[0] = fgkCarlosCardX1/2;
3542 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3543 p2[2] = fgkCarlosCardShift;
3544 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3545 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3546 card1.CreateAndInsertBoxCableSegment(1,90);
3548 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3549 card2.SetNLayers(2);
3550 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3551 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3552 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3554 p1[0] = -fgkCarlosCardX1/2;
3555 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3556 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3558 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3559 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3560 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3561 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3562 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3563 card2.CreateAndInsertBoxCableSegment(1,90);
3565 //=========================================
3566 // some chips on the board
3568 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3570 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3571 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3572 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3574 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3575 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3576 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3578 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3579 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3580 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3581 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3582 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3583 u1.CreateAndInsertBoxCableSegment(1,90);
3586 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3588 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3589 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3590 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3592 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3593 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3594 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3596 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3597 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3598 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3599 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3600 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3601 u2.CreateAndInsertBoxCableSegment(1,90);
3604 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3606 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3607 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3608 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3610 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3611 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3613 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3615 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3617 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3618 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3619 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3620 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3622 //--- U4 is like U3 (?)
3623 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3624 u4Trans->RotateX(90);
3625 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3626 fgkCarlosCardShift + fgkCarlosU4posZ);
3627 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3630 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3632 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3633 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3634 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3636 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3637 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3638 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3640 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3641 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3642 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3643 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3644 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3645 u17.CreateAndInsertBoxCableSegment(1,90);
3648 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3650 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3651 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3652 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3654 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3655 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3656 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3658 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3659 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3660 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3661 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3662 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3663 u35.CreateAndInsertBoxCableSegment(1,90);
3666 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3668 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3669 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3670 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3672 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3673 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3674 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3676 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3677 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3678 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3679 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3680 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3681 u36.CreateAndInsertBoxCableSegment(1,90);
3684 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3686 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3687 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3688 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3690 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3691 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3692 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3694 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3695 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3696 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3697 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3698 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3699 qz1.CreateAndInsertBoxCableSegment(1,90);
3701 return assemblySupCarlos;
3704 //________________________________________________________________________
3705 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3707 // Creates the assemblies containing the LV cards (left and right)
3710 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3711 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3712 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3713 TGeoMedium *copper = GetMedium("COPPER$");
3714 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3715 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3717 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3718 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3720 // we are going to use flat cable class to create multilayer box,
3721 // then we can use the pointers to created volumes to place them elsewhere
3722 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3724 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3725 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3726 cardLV.SetNLayers(2);
3727 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3728 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3729 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3731 p1[1] = fgkLVcardY/2;
3734 p2[1] = fgkLVcardY/2;
3736 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3737 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3738 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3739 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3740 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3741 fCardLVR->AddNode(boxVol, 1, trCard);
3743 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3744 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3745 chipO.SetNLayers(2);
3746 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3747 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3748 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3749 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3750 p1[1] = fgkLVChip0PosY;
3751 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3753 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3754 p2[1] = fgkLVChip0PosY;
3755 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3756 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3757 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3758 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3759 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3761 carLVfullThick/2+chip0fullThick/2, rotAdd);
3762 fCardLVR->AddNode(boxVol, 1, trCard);
3764 // put also this chip on the other side of the card
3765 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3767 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3768 fCardLVL->AddNode(boxVol, 2, trCard);
3769 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3771 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3772 fCardLVR->AddNode(boxVol, 2, trCard);
3774 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3775 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3776 chip1.SetNLayers(2);
3777 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3778 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3779 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3780 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3781 p1[1] = fgkLVChip1PosY;
3782 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3784 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3785 p2[1] = fgkLVChip1PosY;
3786 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3787 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3788 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3789 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3790 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3792 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3793 fCardLVR->AddNode(boxVol, 1, trCard);
3795 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3796 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3797 chip2.SetNLayers(2);
3798 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3799 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3800 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3801 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3802 p1[1] = fgkLVChip2PosY;
3803 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3804 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3805 p2[1] = fgkLVChip2PosY;
3806 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3807 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3808 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3809 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3810 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3812 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3813 fCardLVR->AddNode(boxVol, 1, trCard);
3815 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3816 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3817 chip3.SetNLayers(2);
3818 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3819 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3820 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3821 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3822 p1[1] = fgkLVChip3PosY;
3823 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3824 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3825 p2[1] = fgkLVChip3PosY;
3826 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3827 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3828 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3829 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3830 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3832 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3833 fCardLVR->AddNode(boxVol, 1, trCard);
3835 // the Al pieces for heat exchange :
3836 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3837 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3839 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3840 (fgkLVcoolX1/2+fgkLVcoolX2),
3841 fgkLVcoolPosY+fgkLVcoolY1/2,
3842 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3843 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3844 (fgkLVcoolX1/2+fgkLVcoolX2),
3845 fgkLVcoolPosY+fgkLVcoolY1/2,
3846 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3848 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3850 vAlLVcooling1->SetLineColor(2);
3853 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3854 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3855 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3857 fgkLVcoolPosY+fgkLVcoolY1/2,
3858 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3859 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3861 fgkLVcoolPosY+fgkLVcoolY1/2,
3862 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3864 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3866 vAlLVcooling2->SetLineColor(2);
3869 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3871 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3872 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3873 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3875 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3877 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3878 vAlLVcooling3->SetLineColor(2);
3880 //=== screw fixing th LV card to the U cooling tube :
3881 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3883 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3884 littleScrew, stainless);
3885 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3887 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3889 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3891 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3892 0, fgkLittleLVScrewHeadR,
3893 fgkLittleScrewHeadH/2);
3894 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3895 littleScrewHead, stainless);
3896 vLittleScrewHead->SetLineColor(kGray);
3897 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3898 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3899 fgkShiftLittleScrewLV,
3901 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3903 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3904 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3905 fgkShiftLittleScrewLV,
3907 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3909 // adding the cooling pieces to the left card
3910 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3911 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3912 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3913 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3914 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3916 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3917 -(fgkLVcoolX1/2+fgkLVcoolX2),
3918 fgkLVcoolPosY+fgkLVcoolY1/2,
3919 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3920 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3921 -(fgkLVcoolX1/2+fgkLVcoolX2),
3922 fgkLVcoolPosY+fgkLVcoolY1/2,
3923 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3924 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3926 fgkLVcoolPosY+fgkLVcoolY1/2,
3927 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3928 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3930 fgkLVcoolPosY+fgkLVcoolY1/2,
3931 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3933 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3935 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3937 // and to the right card
3938 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3939 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3940 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3941 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3942 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3947 //________________________________________________________________________
3948 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3950 // return an assembly containing the HV card
3954 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3955 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3956 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3957 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3958 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3959 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3961 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3963 //====================================
3964 //--- the card itself
3965 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3966 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3967 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3968 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
3970 highVCard->AddNode(vCeramicCard, 1, 0);
3973 //====================================
3977 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
3978 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
3979 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
3982 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
3983 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
3984 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
3986 vCapa1End->SetLineColor(18);// grey silver
3987 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
3988 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3989 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
3990 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3992 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
3993 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
3994 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
3996 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
3997 capa1->AddNode(vCapa1Middle, 1,0);
3998 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
3999 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4001 highVCard->AddNode(capa1, 1, capa1PosTr);
4004 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4005 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4006 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4009 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4010 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4011 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4013 vCapa2End->SetLineColor(18);// grey silver
4014 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4015 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4016 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4017 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4019 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4020 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4021 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4023 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4024 capa2->AddNode(vCapa2Middle, 1,0);
4025 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4026 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4028 highVCard->AddNode(capa2, 1, capa2PosTr);
4031 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4032 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4033 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4036 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4037 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4038 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4040 vCapa3End->SetLineColor(18);// grey silver
4042 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4043 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4044 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4045 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4047 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4048 capa3->AddNode(vCapa3Middle, 1,0);
4049 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4050 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4052 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4053 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4054 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4056 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4057 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4058 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4060 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4061 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4062 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4064 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4065 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4066 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4068 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4069 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4070 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4072 highVCard->AddNode(capa3, 1, capa3PosTr1);
4073 highVCard->AddNode(capa3, 2, capa3PosTr2);
4074 highVCard->AddNode(capa3, 3, capa3PosTr3);
4075 highVCard->AddNode(capa3, 4, capa3PosTr4);
4076 highVCard->AddNode(capa3, 5, capa3PosTr5);
4078 //====================================
4079 //--- connexions to LV card
4081 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4082 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4083 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4084 Double_t fgkConnexLVHVx = 3*fgkmm;
4085 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4086 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4088 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4089 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4090 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4091 fgkConnexLVHVdiam1/2,
4092 fgkConnexLVHVdiam2/2,
4093 fgkConnexLVHVlen/2);
4094 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4095 connexLVHVmetal, stainless);
4096 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4097 connexLVHVplastic, plastic);
4098 vConnexLVHVmetal->SetLineColor(10);// white
4099 vConnexLVHVplast->SetLineColor(12); // dark grey
4101 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4102 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4103 connexion->AddNode(vConnexLVHVplast, 1, 0);
4105 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4106 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4107 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4108 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4110 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4111 fgkConnexLVHVy1+fgkConnexLVHVdy,
4112 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4113 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4114 fgkConnexLVHVy1+fgkConnexLVHVdy,
4115 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4117 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4118 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4119 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4120 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4121 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4122 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4124 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4125 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4126 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4127 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4128 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4129 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4131 highVCard->AddNode(connexion, 1, trConnexion1);
4132 highVCard->AddNode(connexion, 2, trConnexion2);
4133 highVCard->AddNode(connexion, 3, trConnexion3);
4134 highVCard->AddNode(connexion, 4, trConnexion4);
4135 highVCard->AddNode(connexion, 5, trConnexion5);
4136 highVCard->AddNode(connexion, 6, trConnexion6);
4137 highVCard->AddNode(connexion, 7, trConnexion7);
4138 highVCard->AddNode(connexion, 8, trConnexion8);
4140 //====================================
4141 //--- cooling pieces
4143 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4144 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4147 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4148 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4150 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4151 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4153 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4155 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4157 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4159 // This last volume contains the screw used for fixing
4160 // the card to the cooling tube ...
4161 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4163 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4164 littleScrewHV, stainless);
4166 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4167 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4169 vCardHVcool1->SetLineColor(2); //red
4170 vCardHVcool2->SetLineColor(2); //red
4171 vCardHVcool3->SetLineColor(2); //red
4173 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4174 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4175 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4176 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4177 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4178 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4179 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4180 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4182 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4183 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4185 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4186 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4187 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4188 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4190 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4191 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4192 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4193 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4195 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4196 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4198 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4199 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4200 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4201 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4203 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4204 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4205 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4206 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4208 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4209 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4211 //====================================
4213 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4214 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4215 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4216 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4218 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4219 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4220 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4221 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4224 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4225 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4231 //________________________________________________________________________
4232 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4234 // return an assembly containing the LV, HV and Carlos cards of one ladder
4235 // and their cooling system
4238 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4239 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4240 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4242 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4244 //=*********************************
4245 //--- The rounded pipe for the end ladder card coooling
4247 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4248 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4252 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4253 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4257 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4258 endLadderPipe.SetNLayers(2);
4259 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4260 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4262 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4263 // of the U colling pipe in its center
4265 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4266 Double_t vectA[3] = {0,0,1};
4268 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4269 Double_t vectB[3] = {0,0,1};
4271 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4272 Double_t vectC[3] = {1,0,0};
4274 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4275 Double_t vectD[3] = {-1,0,0};
4277 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4278 Double_t vectE[3] = {0,0,-1};
4280 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4281 Double_t vectF[3] = {0,0,-1};
4283 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4284 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4285 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4286 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4287 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4288 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4290 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4291 //endLadderPipe.CreateAndInsertCableSegment( 1);
4292 endLadderPipe.CreateAndInsertTubeSegment( 1);
4293 //endLadderPipe.CreateAndInsertCableSegment( 2);
4294 endLadderPipe.CreateAndInsertTorusSegment( 2);
4295 //endLadderPipe.CreateAndInsertCableSegment( 3);
4296 endLadderPipe.CreateAndInsertTubeSegment( 3);
4297 //endLadderPipe.CreateAndInsertCableSegment( 4);
4298 endLadderPipe.CreateAndInsertTorusSegment( 4);
4299 //endLadderPipe.CreateAndInsertCableSegment( 5);
4300 endLadderPipe.CreateAndInsertTubeSegment( 5);
4302 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4303 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4304 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4305 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4307 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4308 - fgkEndLadPipeArmBoxDX,
4309 fgkEndLadPipeArmBoxDY,0);
4310 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4311 fgkEndLadPipeArmBoxDX,
4312 fgkEndLadPipeArmBoxDY,0);
4313 endLadPipeArmBoxDY1->RegisterYourself();
4314 endLadPipeArmBoxDY2->RegisterYourself();
4316 if(GetDebug(3)) { // Remove compiler warning.
4317 endLadPipeArmBox->InspectShape();
4318 endLadPipeArmTube->InspectShape();
4321 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4322 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4323 "- endLadPipeArmTube");
4324 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4325 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4326 "- endLadPipeArmTube");
4328 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4329 endLadPipeArm1, alCu12SDD);
4330 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4331 endLadPipeArm2, alCu12SDD);
4332 vEndLadPipeArm1->SetLineColor(2);
4333 vEndLadPipeArm2->SetLineColor(2);
4335 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4336 +fgkEndLadPipeArmZpos);
4338 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4339 -fgkEndLadPipeUwidth/2,0,armZ);
4340 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4341 fgkEndLadPipeUwidth/2,0,armZ);
4343 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4344 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4346 //=*********************************
4348 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4349 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4351 Double_t spaceBetweenCards = 0.2*fgkmm;
4353 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4354 +fgkEndLadPipeArmBoxDX);
4355 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4356 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4358 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4361 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4362 +coolUzPos+1.25*fgkmm;
4363 // Position in z of the first LVB with respect to the start of the cooling
4364 // rectangular arm, coming (from inside of the ladder)
4365 // The cards are added one after the other
4367 for (Int_t iCard=0; iCard<nCards; iCard++) {
4369 Double_t cardLVzShift = firstLVCardZ +
4370 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4372 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4373 cardLVyShift, cardLVzShift);
4374 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4375 cardLVyShift, cardLVzShift);
4377 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4378 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4381 //=*********************************
4383 TGeoVolumeAssembly *cardHV = fCardHV;
4385 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4386 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4388 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4389 -(fgkHVCardCeramZ)/2);
4391 for (Int_t iCard=0; iCard<nCards; iCard++) {
4393 Double_t fact = iCard*2.+1.;
4394 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4395 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4396 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4397 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4400 //=*********************************
4403 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4404 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4405 // 0, -fgkCarlosSuppAngle, 0);
4407 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4408 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4409 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4410 // position in z of the first Carlos board, coming from inside of the ladder
4412 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4413 fgkEndLadPipeArmBoxDY);
4415 for (Int_t iCard=0; iCard<nCards; iCard++) {
4417 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4418 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4419 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4420 (TGeoRotation*) fCommonTr[0]);
4422 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4425 return endLadderCards;
4429 //________________________________________________________________________
4430 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4432 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4433 // and their cooling system
4434 // This is the code actually used for the end ladder cards
4437 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4438 TGeoMedium *phynoxSDD = GetMedium("INOX$");
4439 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4440 TGeoMedium *copper = GetMedium("COPPER$");
4441 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4442 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4443 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4445 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4446 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4448 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4449 // reference radius corresponding to local y=0
4452 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4453 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4455 rREF = fgkEndLaddCardsShortRadiusLay4;
4458 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4459 +fgkEndLadPipeArmBoxDX);
4460 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4461 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4463 Double_t rMin = rREF + cardLVyShift;
4464 // (The LV card is defining rMin because it is the lower object)
4466 Double_t thickTotCable = 0.5;
4468 //==================================
4469 //--- The Pcon container
4471 // minimum angle of the Pcon :
4472 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4473 (rREF-fgkEndLadPipeArmY/2) );
4474 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4475 Double_t phi0 = 90-dphi/2;
4476 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4477 // of the U colling pipe in its center
4478 Double_t zMax = endLadPipeUlength+coolUzPos;
4479 Double_t rMax = rMin + fgkLVcardY;
4480 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4481 Double_t cablesRadius = rMax-0.5;
4483 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4484 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4485 // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4486 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4487 containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4488 containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4489 containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4490 containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4491 containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4492 // the following is quite dirty but works for the moment ...
4493 containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4494 containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4496 // The next parameters define the shape of the Pcon at its end and where cables
4498 Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4499 Double_t cableSectionR2 = rMax;
4500 Double_t cableSectionZ1 = zMax + 6.3*fgkmm + 2.5*fgkcm;
4501 Double_t cableSectionZ2 = zMax + 7.3*fgkmm + 4*fgkcm;
4502 // Those 6.3 and 7.3 are to be fixed to stick the maximum to the SDD cone
4503 // (I'm waiting for the new cone)
4505 containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4506 containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4508 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4509 //endLadderCards->SetVisibility(kFALSE);
4511 //=*********************************
4512 //--- The rounded pipe for the end ladder card cooling
4514 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4515 endLadderPipe.SetNLayers(2);
4516 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4517 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4519 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4520 Double_t vectA[3] = {0,0,1};
4522 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4523 Double_t vectB[3] = {0,0,1};
4525 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4526 Double_t vectC[3] = {1,0,0};
4528 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4529 Double_t vectD[3] = {-1,0,0};
4531 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4532 Double_t vectE[3] = {0,0,-1};
4534 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4535 Double_t vectF[3] = {0,0,-1};
4537 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4538 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4539 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4540 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4541 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4542 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4544 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4545 //endLadderPipe.CreateAndInsertCableSegment( 1);
4546 endLadderPipe.CreateAndInsertTubeSegment( 1);
4547 //endLadderPipe.CreateAndInsertCableSegment( 2);
4548 endLadderPipe.CreateAndInsertTorusSegment( 2);
4549 //endLadderPipe.CreateAndInsertCableSegment( 3);
4550 endLadderPipe.CreateAndInsertTubeSegment( 3);
4551 //endLadderPipe.CreateAndInsertCableSegment( 4);
4552 endLadderPipe.CreateAndInsertTorusSegment( 4);
4553 //endLadderPipe.CreateAndInsertCableSegment( 5);
4554 endLadderPipe.CreateAndInsertTubeSegment( 5);
4556 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4557 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4558 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4559 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4561 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4562 - fgkEndLadPipeArmBoxDX,
4563 fgkEndLadPipeArmBoxDY,0);
4564 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4565 fgkEndLadPipeArmBoxDX,
4566 fgkEndLadPipeArmBoxDY,0);
4567 endLadPipeArmBoxDY1->RegisterYourself();
4568 endLadPipeArmBoxDY2->RegisterYourself();
4570 if(GetDebug(3)) { // Remove compiler warning.
4571 endLadPipeArmBox->InspectShape();
4572 endLadPipeArmTube->InspectShape();
4575 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4576 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4577 "- endLadPipeArmTube");
4578 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4579 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4580 "- endLadPipeArmTube");
4582 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4583 endLadPipeArm1, alCu12SDD);
4584 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4585 endLadPipeArm2, alCu12SDD);
4586 vEndLadPipeArm1->SetLineColor(2);
4587 vEndLadPipeArm2->SetLineColor(2);
4589 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4590 +fgkEndLadPipeArmZpos);
4592 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4593 -fgkEndLadPipeUwidth/2,rREF,armZ);
4594 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4595 fgkEndLadPipeUwidth/2,rREF,armZ);
4597 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4598 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4600 //=*********************************
4602 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4603 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4605 Double_t spaceBetweenCards = 0.2*fgkmm;
4608 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4611 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4612 +coolUzPos+1.25*fgkmm;
4613 // Position in z of the first LVB with respect to the start of the cooling
4614 // rectangular arm, coming (from inside of the ladder)
4615 // The cards are added one after the other
4617 for (Int_t iCard=0; iCard<nCards; iCard++) {
4619 Double_t cardLVzShift = firstLVCardZ +
4620 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4622 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4623 cardLVyShift+rREF, cardLVzShift);
4624 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4625 cardLVyShift+rREF, cardLVzShift);
4627 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4628 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4631 //=*********************************
4633 TGeoVolumeAssembly *cardHV = fCardHV;
4635 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4636 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4637 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4639 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4640 -(fgkHVCardCeramZ)/2);
4642 for (Int_t iCard=0; iCard<nCards; iCard++) {
4644 Double_t fact = iCard*2.+1.;
4645 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4646 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4647 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4648 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4651 //=*********************************
4654 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4655 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4656 // 0, -fgkCarlosSuppAngle, 0);
4658 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4659 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4660 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4661 // position in z of the first Carlos board, coming from inside of the ladder
4663 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4664 fgkEndLadPipeArmBoxDY);
4666 for (Int_t iCard=0; iCard<nCards; iCard++) {
4668 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4669 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4670 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4671 (TGeoRotation*) fCommonTr[0]);
4673 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4677 //=*********************************
4681 Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4682 + fgkSectionGlassPerMod)*nCards;
4683 // We fix thickness, then width is calculated accordingly
4684 Double_t width = sectionV/thickTotCable;
4685 Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4686 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4687 Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4688 / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod);
4689 Double_t thickGlass = thickTotCable - thickCu - thickPlast;
4691 AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4692 cable.SetNLayers(3);
4693 cable.SetLayer(0, thickCu, copper, kRed);
4694 cable.SetLayer(1, thickPlast, plastic, kYellow);
4695 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4697 Double_t zVect[3]={0,0,1};
4698 Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4699 +spaceBetweenCarlsoCards)/2 + 2.9;
4700 // the 2.9cm is for taking into account carlos card angle...
4702 Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4703 cableSectionR2,cableSectionZ1,cableSectionZ2);
4705 Double_t pos1[3] = {0, cablesRadius, xMinCable};
4706 Double_t pos2[3] = {0, cablesRadius, zEndCable};
4707 cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4708 cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4709 cable.SetInitialNode(endLadderCards);
4710 cable.CreateAndInsertCableSegment(1);
4712 return endLadderCards;
4715 //________________________________________________________________________
4716 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4718 // return an assembly of the support rings, attaching the ladders to the cone
4724 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4725 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4728 //**********************************
4731 Double_t fgkRubyCageX = 9*fgkmm;
4732 Double_t fgkRubyCageY = 5.5*fgkmm;
4733 Double_t fgkRubyCageZ = 8*fgkmm;
4734 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4735 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4736 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4737 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4738 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4740 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4743 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4745 // pieces common to both square and V cages
4746 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4747 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4749 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4750 fgkRubyCageHoleDX/2+epsilon);
4752 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4753 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4754 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4755 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4756 trScrewHole->RegisterYourself();
4758 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4759 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4760 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4761 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4762 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4763 trScrewHoleFoot->RegisterYourself();
4766 // pieces which differ
4767 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4769 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4770 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4772 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4773 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4774 trRubyCageVInternBox->RegisterYourself();
4776 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4777 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4778 fgkRubyCageInternSide/4);
4780 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4781 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4782 +epsilon,0,0, rotV );
4783 trRubyCageVInternTriangl->RegisterYourself();
4786 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4787 "rubyCageBox-(rubyCageInternBox"
4788 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4790 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4791 rubyCageSquare, stainless);
4792 vRubyCageSquare->SetLineColor(10);
4794 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4795 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4796 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4797 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4798 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4799 vRubyCageV->SetLineColor(10);
4801 if(GetDebug(3)) { // Remove compiler warning.
4802 rubyCageBox->InspectShape();
4803 rubyCageInternBox->InspectShape();
4804 screwHole->InspectShape();
4805 screwHoleFoot->InspectShape();
4806 rubyCageVInternBox->InspectShape();
4807 rubyCageVInternTriangl->InspectShape();
4810 supportRing->AddNode(vRubyCageSquare, 0, 0);
4811 //supportRing->AddNode(vRubyCageV, 0, 0);
4817 //________________________________________________________________________
4818 void AliITSv11GeometrySDD::CreateSDDsensor() {
4820 // return a box containing the SDD sensor
4823 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4824 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4825 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4826 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4827 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4828 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4831 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4832 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4833 // width : in the beam direction !
4835 Double_t sensoxBoxLength = ( fgkWaferLength +
4836 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4837 // Makes life easier to include the space for the WA HV cable on both sides
4838 Double_t sensoxBoxThick = fgkWaferThickness +
4839 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4841 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4842 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4844 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4845 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4847 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4848 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4851 //****************************
4853 //****************************
4855 // we need 2 different sensor objects, because they have to have different names
4856 // This is required for the step manager
4858 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4859 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4862 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4863 wafer3->SetLineColor(fColorSilicon);
4864 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4865 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4866 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4867 sensVol3->SetLineColor(fColorSilicon+5);
4868 wafer3->AddNode(sensVol3, 1, 0);
4869 fSDDsensor3->AddNode(wafer3, 1, 0);
4871 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4872 wafer4->SetLineColor(fColorSilicon);
4873 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4874 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4875 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4876 sensVol4->SetLineColor(fColorSilicon+5);
4877 wafer4->AddNode(sensVol4, 1, 0);
4878 fSDDsensor4->AddNode(wafer4, 1, 0);
4881 //****************************
4883 //****************************
4884 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4885 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4886 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4887 vGlass->SetLineColor(fColorGlass);
4888 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4889 fgkWaferThickness/2+fgkSensorGlassLY/2,
4890 fgkGlassDZOnSensor);
4891 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4892 fgkWaferThickness/2+fgkSensorGlassLY/2,
4893 fgkGlassDZOnSensor);
4894 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4895 fgkWaferThickness/2+fgkSensorGlassLY/2,
4896 -fgkGlassDZOnSensor);
4897 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4898 fgkWaferThickness/2+fgkSensorGlassLY/2,
4899 -fgkGlassDZOnSensor);
4900 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4901 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4902 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4903 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4905 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4906 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4907 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4908 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4910 //****************************
4911 // Wrap-around cable
4912 //****************************
4914 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4915 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4916 waHVCable.SetNLayers(2);
4917 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4918 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4919 waHVCable.SetInitialNode(fSDDsensor3);
4921 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4922 x1[0] = -fgkWaHVcableLength/2;
4924 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4926 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4929 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4930 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4931 TGeoCombiTrans *ctSegment = 0;
4932 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4933 fSDDsensor4->AddNode(segment, 1, ctSegment);
4937 waHVCable.SetName("ITSsddWaHVCableD");
4938 waHVCable.ResetPoints();
4939 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4940 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4941 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4942 fSDDsensor4->AddNode(segment, 1, ctSegment);
4944 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4946 waHVCableFold.SetPhi(180,360);
4947 waHVCableFold.SetNLayers(2);
4948 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4949 polyhamideSDD, fColorPolyhamide);
4950 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4951 waHVCableFold.SetInitialNode(fSDDsensor3);
4954 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4956 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4957 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4958 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4959 fSDDsensor4->AddNode(segment, 1, ctSegment);
4962 //****************************
4964 //****************************
4965 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4966 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4967 /(2.*fgkTransitHVHeadLZ);
4968 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4969 headRadius-fgkTransitHVHeadLZ)
4972 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
4973 fgkTransitHVPolyThick/2,
4975 headPoly->SetName("headPoly");
4976 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
4977 -fgkTransitHVPolyThick/2);
4978 headPolyTr->SetName("headPolyTr");
4979 headPolyTr->RegisterYourself();
4981 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
4982 fgkTransitHVAlThick/2,
4984 headAl->SetName("headAl");
4985 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
4986 -fgkTransitHVPolyThick
4987 -fgkTransitHVAlThick/2);
4988 headAlTr->SetName("headAlTr");
4989 headAlTr->RegisterYourself();
4991 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
4992 (headRadius-fgkTransitHVHeadLZ)/2,
4993 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
4994 cache->SetName("cache");
4996 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
4997 (headRadius-fgkTransitHVHeadLZ)/2,
4998 -(fgkTransitHVPolyThick
4999 +fgkTransitHVAlThick)/2);
5000 headCacheTr->SetName("cacheTr");
5001 headCacheTr->RegisterYourself();
5003 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5004 "headPoly:headPolyTr-cache:cacheTr");
5005 TGeoVolume *vHeadPolyComp = new TGeoVolume(
5006 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5007 vHeadPolyComp->SetLineColor(fColorPolyhamide);
5008 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5009 "headAl:headAlTr-cache:cacheTr");
5010 TGeoVolume *vHeadAlComp = new TGeoVolume(
5011 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5012 vHeadAlComp->SetLineColor(fColorAl);
5015 // TGeoRotation rotHead("",0,90,0);
5016 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5017 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5019 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5020 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5021 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5024 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5025 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5026 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5027 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5030 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5031 fgkTransitHVBondingLZ,
5032 fgkTransitHVPolyThick+fgkTransitHVAlThick);
5033 transitHVCable.SetNLayers(2);
5034 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5036 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5037 transitHVCable.SetInitialNode(fSDDsensor3);
5039 x1[0] = -fgkTransitHVHeadLX/2;
5041 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5045 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5046 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5047 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5048 fSDDsensor4->AddNode(segment, 1, ctSegment);
5050 transitHVCable.ResetPoints();
5051 transitHVCable.SetName("ITSsddHVtransitTail");
5052 transitHVCable.SetWidth(fgkTransitHVtailWidth);
5053 x1[0] = fgkTransitHVtailXpos;
5054 x2[0] = fgkTransitHVtailXpos;
5055 x1[2] = -fgkTransitHVBondingLZ/2;
5056 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5057 Double_t vZ[3] = {0,0,1};
5058 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5059 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5060 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5061 fSDDsensor4->AddNode(segment, 1, ctSegment);
5064 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5065 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5066 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5067 fgkTransitHVsideLZ);
5068 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5069 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5070 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5071 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5072 fgkTransitHVsideLZ);
5073 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5074 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5076 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5077 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5078 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5079 fgkTransitHVsideLZ);
5080 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5081 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5082 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5083 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5084 fgkTransitHVsideLZ);
5085 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5086 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5088 // sideRight is not there actually
5089 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5090 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5091 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5092 // fgkTransitHVsideLZ);
5093 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5094 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5095 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5096 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5097 // fgkTransitHVsideLZ);
5098 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5099 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5101 // TGeoRotation rotSide("",0,-90,0);
5102 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5103 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5104 // -fgkTransitHVBondingLZ/2,&rotSide);
5105 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5106 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5107 // -fgkTransitHVBondingLZ/2, &rotSide);
5108 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5109 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5110 // -fgkTransitHVBondingLZ/2, &rotSide);
5111 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5112 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5113 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5114 // -fgkTransitHVBondingLZ/2,rotSide);
5115 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5116 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5117 -fgkTransitHVBondingLZ/2, rotSide);
5118 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5119 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5120 -fgkTransitHVBondingLZ/2, rotSide);
5122 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5123 sideLeft,polyhamideSDD);
5124 vSideLeft->SetLineColor(fColorPolyhamide);
5125 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5127 vSideLeftAl->SetLineColor(fColorAl);
5129 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5130 // sideRight,polyhamideSDD);
5131 // vSideRight->SetLineColor(fColorPolyhamide);
5133 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5134 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5135 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5137 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5138 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5139 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5142 //****************************
5144 fSDDsensor3->CheckOverlaps(0.01);
5145 fSDDsensor4->CheckOverlaps(0.01);
5148 fSDDsensor3->SetVisibility(kFALSE);
5149 fSDDsensor4->SetVisibility(kFALSE);
5153 //________________________________________________________________________
5154 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5156 // return a box volume containing the detectors
5159 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5161 Int_t nDetectors = fgkLay3Ndet;
5162 Double_t ladderLength = fgkLay3LadderLength;
5163 Double_t *sensorZPos = fLay3sensorZPos;
5167 nDetectors = fgkLay4Ndet;
5168 ladderLength = fgkLay4LadderLength;
5169 sensorZPos = fLay4sensorZPos;
5171 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5175 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5176 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5178 sprintf(name,"ITSsddDetBox%i",iLay);
5179 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5180 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5181 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5183 for (Int_t i=0; i<nDetectors; i++) {
5184 Double_t localZ = sensorZPos[i];
5185 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5186 if (iLay==3) if (i%2!=0) localY = -localY;
5187 if (iLay==4) if (i%2==0) localY = -localY;
5188 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5190 if (i >= nDetectors/2) {
5191 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5192 sensorPos->SetName(name);
5193 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5196 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5197 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5199 sensorPos->SetName(name);
5200 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5204 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5205 virtualDet->SetVisibility(kFALSE);
5210 //________________________________________________________________________
5211 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5213 // return a box volume containing the detectors
5216 Int_t nDetectors = fgkLay3Ndet;
5217 Double_t ladderLength = fgkLay3LadderLength;
5218 Double_t *sensorZPos = fLay3sensorZPos;
5219 TGeoVolume *sensorSDD = fSDDsensor3;
5223 nDetectors = fgkLay4Ndet;
5224 ladderLength = fgkLay4LadderLength;
5225 sensorZPos = fLay4sensorZPos;
5226 sensorSDD = fSDDsensor4;
5228 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5232 sprintf(name,"ITSsddDetBox%i",iLay);
5234 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5236 for (Int_t i=0; i<nDetectors; i++) {
5237 Double_t localZ = sensorZPos[i];
5238 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5239 if (iLay==3) if (i%2!=0) localY = -localY;
5240 if (iLay==4) if (i%2==0) localY = -localY;
5241 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5243 if (i >= nDetectors/2) {
5244 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5245 sensorPos->SetName(name);
5246 virtualDet->AddNode(sensorSDD, i, sensorPos);
5249 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5250 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5252 sensorPos->SetName(name);
5253 virtualDet->AddNode(sensorSDD, i, sensorPos);
5257 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5262 //________________________________________________________________________
5263 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5266 // export the geometry in a AliITSgeom object
5271 printf("error:Try to fill null (AliITSgeom *) object");
5275 printf("error:Try to set sensor geometry while geometry is not defined\n");
5279 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5280 fgkWaferLengthSens/2.};
5281 if(!(geom->IsShapeDefined(kSDD)))
5282 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5285 char ladderName[30];
5286 char sensorName[30];
5287 char senstivName[30];
5288 const Int_t kNLay = 2;
5289 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5290 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5293 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5295 Int_t firstSDDmod = startMod;
5296 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5297 /////////////////////////////////////////
5298 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5299 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5301 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5302 TGeoVolume *layVolume = layNode->GetVolume();
5303 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5305 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5306 /////////////////////////////////////////
5307 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5308 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5310 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5311 TGeoVolume *laddVolume = laddNode->GetVolume();
5312 TGeoHMatrix laddMatrix(layMatrix);
5313 laddMatrix.Multiply(laddNode->GetMatrix());
5315 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5316 /////////////////////////////////////////
5317 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5318 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5320 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5321 TGeoVolume *detVolume = detNode->GetVolume();
5322 TGeoHMatrix detMatrix(laddMatrix);
5323 detMatrix.Multiply(detNode->GetMatrix());
5325 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5327 TGeoVolume *wafVolume = wafNode->GetVolume();
5328 TGeoHMatrix wafMatrix(detMatrix);
5329 detMatrix.Multiply(wafNode->GetMatrix());
5330 //--------------------------------------------------------
5331 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5332 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5334 TGeoHMatrix sensMatrix(wafMatrix);
5335 sensMatrix.Multiply(sensitivNode->GetMatrix());
5337 // Sticking to the convention for local wafer coordinate
5339 if (iDet >= kNDet[iLay]/2) {
5340 // TGeoRotation rotY("",0,180,0);
5341 TGeoRotation rotY("",-180,-180,0);
5342 sensMatrix.Multiply(&rotY);
5344 // Creating the matrix in AliITSgeom for
5345 // this sensitive volume :
5346 Double_t *trans = sensMatrix.GetTranslation();
5347 Double_t *r = sensMatrix.GetRotationMatrix();
5348 Double_t rot[10] = {r[0],r[1],r[2],
5350 r[6],r[7],r[8], 1.0};
5351 //rot[9]!=0.0 => not a unity matrix
5352 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5354 // iLadd+1, iDet+1 because ladd. and det. start at +1
5359 printf("Error (ExportSensorGeometry) %s not found !\n",
5362 printf("Error (ExportSensorGeometry) %s not found !\n",
5365 printf("Error (ExportSensorGeometry) %s not found !\n",
5369 printf("Error (ExportSensorGeometry) %s not found !\n",
5373 printf("Error (ExportSensorGeometry) %s not found !\n",
5377 return (startMod-firstSDDmod);
5381 //________________________________________________________________________
5382 Int_t AliITSv11GeometrySDD::
5383 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5385 // Function which gives the layer, ladder and det.
5386 // index of the current volume. To be used in
5387 // AliITS::StepManager()
5390 if (gGeoManager->GetLevel()<3) return kFALSE;
5391 // Get the det index :
5392 TGeoNode *node = gGeoManager->GetMother(2);
5393 if (!node) return kFALSE;
5394 det = node->GetNumber()+1;
5396 // Get the ladder index :
5397 node = gGeoManager->GetMother(3);
5398 if (!node) return kFALSE;
5399 ladd = node->GetNumber()+1;
5401 // Get the layer index :
5402 if (node->GetNdaughters()==fgkLay3Ndet)
5403 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!
5410 //________________________________________________________________________
5411 TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5412 Double_t r2max, Double_t z2,
5413 Double_t section, Int_t nDiv)
5415 // Creates a cone along z where the section is approximately constant
5416 // with z. This is for simulation of cables, because a cone with a constant
5417 // radius difference would show a quantity of matter increasing with z...
5418 // The max radius of the created Pcon is evolving linearly, the min radius
5419 // is calculated at several steps (nDiv).
5420 // z2 > z1 (required by the Pcon)
5422 TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5424 Double_t dr = (r2max-r1max)/nDiv;
5425 Double_t dz = (z2-z1)/nDiv;
5426 Double_t r1minI, r2minI, r1maxI, r2maxI;
5429 Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5430 Double_t cosAlpha = (z2-z1)/lZ;
5432 r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5433 myPcon->DefineSection(0, z1, r1minI, r1max);
5435 for (Int_t i=0; i<nDiv; i++) {
5439 r1maxI = r1max + i*dr;
5440 r2maxI = r1maxI + dr;
5442 r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5443 myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5449 //________________________________________________________________________
5450 Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5451 Double_t refZ1, Double_t refZ2) {
5452 // just a helping function
5453 return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5456 //________________________________________________________________________
5457 Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5458 Int_t nLay3, Int_t nLay4,
5459 Double_t r1, Double_t z1,
5460 Double_t r2, Double_t z2) {
5462 // Create some cables portions from SDD modules grouped
5463 // and attached at the border of the SSD cone
5465 TGeoMedium *copper = GetMedium("COPPER$");
5466 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
5467 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5469 char titleCable[30];
5470 sprintf(titleCable,"cableSDDport%i",(Int_t)angle);
5473 Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5474 Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5475 Double_t width = section/thickness;
5476 Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5477 +fgkSectionGlassPerMod);
5479 Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5480 +fgkSectionGlassPerMod);
5482 Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5483 +fgkSectionGlassPerMod);
5485 Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5486 Double_t cosAlpha = (z2-z1)/hypothenus;
5487 Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5488 Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5489 angle *= TMath::DegToRad();
5490 Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5491 Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5492 Double_t pos1[3] = {x1,y1,z1};
5493 Double_t pos2[3] = {x2,y2,z2};
5494 Double_t zVect[3] = {0,0,1};
5496 AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5497 cable.SetNLayers(3);
5498 cable.SetLayer(0, thickPlast, plastic, kYellow);
5499 cable.SetLayer(1, thickCu, copper, kRed);
5500 cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5502 cable.AddCheckPoint( mother, 0, pos1, zVect );
5503 cable.AddCheckPoint( mother, 1, pos2, zVect );
5504 cable.SetInitialNode(mother);
5505 cable.CreateAndInsertCableSegment(1);
5512 //________________________________________________________________________
5513 void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth) {
5515 // Creates and inserts the SDD cables running on SDD and SSD cones
5517 TGeoMedium *copper = GetMedium("COPPER$");
5518 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
5519 TGeoMedium *opticalFiber = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
5520 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5523 //==================================
5525 //==================================
5527 Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5528 Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5530 Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5531 Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5532 Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5534 Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5535 Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5536 Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5538 // calculate z1, z2 thanks to R1 and R2
5539 Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5540 Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5541 Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, fgkConeSDDr1,fgkConeSDDr2,fgkConeSDDz1,fgkConeSDDz2);
5543 TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5545 //==================================
5546 // first set of cones : cables from layer 3
5547 //==================================
5549 TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5550 fgkSDDCableR2, sddCableZ2,
5551 sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5553 TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5554 pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0), pcon1all->GetRmax(0));
5555 Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5556 pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax, pcon1all->GetRmax(1));
5558 TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container", pcon1container, airSDD);
5559 vpcon1container->SetVisibility(kFALSE);
5561 TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5562 fgkSDDCableR2, sddCableZ2,
5563 sectionLay3Plastic, 3);
5564 TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast", pcon1plast, plastic);
5565 vpcon1plast->SetLineColor(kYellow);
5566 vpcon1container->AddNode(vpcon1plast, 0);
5568 Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5569 TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5570 fgkSDDCableR2 - dr1a, sddCableZ2,
5572 TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu", pcon1Cu, copper);
5573 vpcon1Cu->SetLineColor(kRed);
5574 vpcon1container->AddNode(vpcon1Cu, 0);
5575 //moth->AddNode(vpcon1Cu, 0);
5578 Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5579 TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5580 fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5581 sectionLay3Glass, 3);
5582 TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass", pcon1glass, opticalFiber);
5583 vpcon1glass->SetLineColor(kGreen);
5584 vpcon1container->AddNode(vpcon1glass, 0);
5586 moth->AddNode(vpcon1container, 0);
5587 moth->AddNode(vpcon1container, 1, rotCableSDD);
5589 //==================================
5590 // 2nd set of cones : cables from layer 3 and layer 4
5591 //==================================
5593 TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5594 fgkSDDCableR3, sddCableZ3,
5595 sectionLay3Plastic+sectionLay4Plastic+
5596 sectionLay3Cu+sectionLay4Cu+
5597 sectionLay3Glass+sectionLay4Glass, 1);
5598 TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5599 pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0), pcon2all->GetRmax(0));
5600 drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5601 pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax, pcon2all->GetRmax(1));
5603 TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container", pcon2container, airSDD);
5604 vpcon2container->SetVisibility(kFALSE);
5606 TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5607 fgkSDDCableR3, sddCableZ3,
5608 sectionLay3Plastic+sectionLay4Plastic, 3);
5609 TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast", pcon2plast, plastic);
5610 vpcon2plast->SetLineColor(kYellow);
5611 vpcon2container->AddNode(vpcon2plast, 0);
5613 Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5614 TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5615 fgkSDDCableR3 - dr2a, sddCableZ3,
5616 sectionLay3Cu+sectionLay4Cu, 3);
5617 TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu", pcon2Cu, copper);
5618 vpcon2Cu->SetLineColor(kRed);
5619 vpcon2container->AddNode(vpcon2Cu, 0);
5622 Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5623 TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5624 fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5625 sectionLay3Glass+sectionLay4Glass, 3);
5626 TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass", pcon2glass, opticalFiber);
5627 vpcon2glass->SetLineColor(kGreen);
5628 vpcon2container->AddNode(vpcon2glass, 0);
5630 moth->AddNode(vpcon2container, 0);
5631 moth->AddNode(vpcon2container, 1, rotCableSDD);
5633 //==================================
5634 // intermediate cylinder
5635 //==================================
5637 TGeoTube *interCyl = new TGeoTube("sddCableInterCyl", pcon2container->GetRmin(1),
5638 pcon2container->GetRmax(1),
5639 fgkSDDCableDZint/2);
5640 TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",interCyl, airSDD);
5641 vInterCyl->SetVisibility(kFALSE);
5644 Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5645 Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5646 (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5648 TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5649 rmaxCylPlast, fgkSDDCableDZint/2);
5650 TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast", interCylPlast, plastic);
5651 vInterCylPlast->SetLineColor(kYellow);
5652 vInterCyl->AddNode(vInterCylPlast, 0);
5655 Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5656 Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5657 (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5658 TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5659 rmaxCylCu, fgkSDDCableDZint/2);
5660 TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu", interCylCu, copper);
5661 vInterCylCu->SetLineColor(kRed);
5662 vInterCyl->AddNode(vInterCylCu, 0);
5665 Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5666 Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5667 (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5668 TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5669 rmaxCylGlass, fgkSDDCableDZint/2);
5670 TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",interCylGlass,opticalFiber);
5671 vInterCylGlass->SetLineColor(kGreen);
5672 vInterCyl->AddNode(vInterCylGlass, 0);
5675 TGeoTranslation *trInterCylP = new TGeoTranslation("trSddCableInterCylPos",
5676 0,0,sddCableZ3+fgkSDDCableDZint/2);
5677 moth->AddNode(vInterCyl, 0,trInterCylP);
5678 TGeoTranslation *trInterCylN = new TGeoTranslation("trSddCableInterCylNeg",
5679 0,0,-sddCableZ3-fgkSDDCableDZint/2);
5681 moth->AddNode(vInterCyl, 1,trInterCylN);
5683 //==================================
5684 // cable cone on the SSD cone
5685 //==================================
5687 Double_t sddCableR4 = rmaxCylPlast;
5688 Double_t sddCableZ4 = sddCableZ3+fgkSDDCableDZint;
5690 TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5691 fgkSDDCableR5, fgkSDDCableZ5,
5692 sectionLay3Plastic+sectionLay4Plastic+
5693 sectionLay3Cu+sectionLay4Cu+
5694 sectionLay3Glass+sectionLay4Glass, 1);
5696 TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5697 pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0), pcon3all->GetRmax(0));
5698 drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5699 pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax, pcon3all->GetRmax(1));
5701 TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container", pcon3container, airSDD);
5702 vpcon3container->SetVisibility(kFALSE);
5704 TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5705 fgkSDDCableR5, fgkSDDCableZ5,
5706 sectionLay3Plastic+sectionLay4Plastic, 3);
5707 TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast", pcon3plast, plastic);
5708 vpcon3plast->SetLineColor(kYellow);
5709 vpcon3container->AddNode(vpcon3plast, 0);
5711 Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5712 TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5713 fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5714 sectionLay3Cu+sectionLay4Cu, 3);
5715 TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu", pcon3Cu, copper);
5716 vpcon3Cu->SetLineColor(kRed);
5717 vpcon3container->AddNode(vpcon3Cu, 0);
5720 Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5721 TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5722 fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5723 sectionLay3Glass+sectionLay4Glass, 3);
5724 TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass", pcon3glass,opticalFiber);
5725 vpcon3glass->SetLineColor(kGreen);
5726 vpcon3container->AddNode(vpcon3glass, 0);
5728 moth->AddNode(vpcon3container, 0);
5729 moth->AddNode(vpcon3container, 1, rotCableSDD);
5732 //==================================
5733 // cables that are grouped at the end of SSD cones
5734 //==================================
5736 Double_t fgkSDDCableR6 = fgkSDDCableR5+10;
5737 Double_t fgkSDDCableZ6 = fgkSDDCableZ5+10;
5739 TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
5741 CreateAndInsetConeCablePart(endConeSDDCable, 40, 1*3,2*4, fgkSDDCableR5,
5742 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5744 CreateAndInsetConeCablePart(endConeSDDCable, 60, 1*3,1*4, fgkSDDCableR5,
5745 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5747 CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
5748 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5750 CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
5751 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5753 CreateAndInsetConeCablePart(endConeSDDCable, 110, 2*3,3*4, fgkSDDCableR5,
5754 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5756 CreateAndInsetConeCablePart(endConeSDDCable, 146, 0*3,3*4, fgkSDDCableR5,
5757 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5759 CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
5760 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5762 CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
5763 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5765 CreateAndInsetConeCablePart(endConeSDDCable, 220, 1*3,2*4, fgkSDDCableR5,
5766 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5768 CreateAndInsetConeCablePart(endConeSDDCable, 240, 1*3,2*4, fgkSDDCableR5,
5769 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5771 CreateAndInsetConeCablePart(endConeSDDCable, 290, 2*3,2*4, fgkSDDCableR5,
5772 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5774 CreateAndInsetConeCablePart(endConeSDDCable, 315, 1*3,1*4, fgkSDDCableR5,
5775 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5777 CreateAndInsetConeCablePart(endConeSDDCable, 350, 1*3,3*4, fgkSDDCableR5,
5778 fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
5780 moth->AddNode(endConeSDDCable, 0, 0);
5782 TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
5783 reflect->ReflectZ(kTRUE);
5784 moth->AddNode(endConeSDDCable, 1, reflect);