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 ClassImp(AliITSv11GeometrySDD)
461 //________________________________________________________________________
462 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
465 fCoolPipeSupportL(0),
466 fCoolPipeSupportR(0),
469 fBaseThermalBridge(0),
485 fAddCoolingSyst(kTRUE),
487 fAddOnlyLadder3min(-1),
488 fAddOnlyLadder3max(-1),
489 fAddOnlyLadder4min(-1),
490 fAddOnlyLadder4max(-1),
491 fColorCarbonFiber(4),
501 fLay3LadderUnderSegDH(0),
502 fLay4LadderUnderSegDH(0),
503 fLay3LaddShortRadius(0),
504 fLay3LaddLongRadius(0),
505 fLay4LaddShortRadius(0),
506 fLay4LaddLongRadius(0)
509 // Standard constructor
515 //________________________________________________________________________
516 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
517 AliITSv11Geometry(debug),
519 fCoolPipeSupportL(0),
520 fCoolPipeSupportR(0),
523 fBaseThermalBridge(0),
539 fAddCoolingSyst(kTRUE),
541 fAddOnlyLadder3min(-1),
542 fAddOnlyLadder3max(-1),
543 fAddOnlyLadder4min(-1),
544 fAddOnlyLadder4max(-1),
545 fColorCarbonFiber(4),
555 fLay3LadderUnderSegDH(0),
556 fLay4LadderUnderSegDH(0),
557 fLay3LaddShortRadius(0),
558 fLay3LaddLongRadius(0),
559 fLay4LaddShortRadius(0),
560 fLay4LaddLongRadius(0)
563 // Constructor setting debugging level
568 //________________________________________________________________________
569 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
570 AliITSv11Geometry(s.GetDebug()),
571 fPinSupport(s.fPinSupport),
572 fCoolPipeSupportL(s.fCoolPipeSupportL),
573 fCoolPipeSupportR(s.fCoolPipeSupportR),
574 fSDDsensor3(s.fSDDsensor3),
575 fSDDsensor4(s.fSDDsensor4),
576 fBaseThermalBridge(s.fBaseThermalBridge),
578 fCardLVR(s.fCardLVR),
579 fCardLVL(s.fCardLVL),
581 fCardCarlos(s.fCardCarlos),
582 fRaccordoL(s.fRaccordoL),
583 fDigitCableLay3A(s.fDigitCableLay3A),
584 fDigitCableLay3B(s.fDigitCableLay3B),
585 fDigitCableLay4A(s.fDigitCableLay4A),
586 fDigitCableLay4B(s.fDigitCableLay4B),
587 fMotherVol(s.fMotherVol),
588 fAddHybrids(s.fAddHybrids),
589 fAddSensors(s.fAddSensors),
590 fAddHVcables(s.fAddHVcables),
591 fAddCables(s.fAddCables),
592 fAddCoolingSyst(s.fAddCoolingSyst),
593 fCoolingOn(s.fCoolingOn),
594 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
595 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
596 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
597 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
598 fColorCarbonFiber(s.fColorCarbonFiber),
599 fColorRyton(s.fColorRyton),
600 fColorPhynox(s.fColorPhynox),
601 fColorSilicon(s.fColorSilicon),
602 fColorAl(s.fColorAl),
603 fColorPolyhamide(s.fColorPolyhamide),
604 fColorGlass(s.fColorGlass),
605 fColorSMD(s.fColorSMD),
606 fColorSMDweld(s.fColorSMDweld),
607 fColorStesalite(s.fColorStesalite),
608 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
609 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
610 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
611 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
612 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
613 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
616 // do only a "shallow copy" ...
620 //________________________________________________________________________
621 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
622 operator=(const AliITSv11GeometrySDD &s) {
623 // Assignment operator
624 if(&s == this) return *this;
625 fMotherVol = s.fMotherVol;
626 fAddHybrids = s.fAddHybrids;
627 fAddSensors = s.fAddSensors;
628 fAddHVcables = s.fAddHVcables;
629 fAddCables = s.fAddCables;
630 fAddCoolingSyst = s.fAddCoolingSyst;
631 fCoolingOn = s.fCoolingOn;
632 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
633 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
634 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
635 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
639 //________________________________________________________________________
640 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
641 // Look like a destructor
642 // Smell like a destructor
643 // And actually is the destructor
644 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
645 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
646 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
647 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
650 //________________________________________________________________________
651 void AliITSv11GeometrySDD::SetParameters() {
653 // Define display colors and the non constant geometry parameters
656 Double_t detLadderDist = 8*fgkmm;
658 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
659 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
661 // radius from the center to the CF ladder :
662 fLay3LaddShortRadius = (fgkLay3DetShortRadius
663 + fgkLadWaferSep+2*fgkWaferThickness
665 fLay3LaddLongRadius = (fgkLay3DetLongRadius
666 + fgkLadWaferSep+2*fgkWaferThickness
668 fLay4LaddShortRadius = (fgkLay4DetShortRadius
669 + fgkLadWaferSep+2*fgkWaferThickness
671 fLay4LaddLongRadius = (fgkLay4DetLongRadius
672 + fgkLadWaferSep+2*fgkWaferThickness
675 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
676 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
677 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
678 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
679 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
680 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
682 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
683 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
684 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
685 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
686 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
687 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
688 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
689 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
693 //________________________________________________________________________
694 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
696 // Called to get a medium, checks that it exists.
697 // If not, prints an error and returns 0
701 sprintf(ch, "ITS_%s",mediumName);
702 TGeoMedium* medium = gGeoManager->GetMedium(ch);
704 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
709 //________________________________________________________________________
710 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
711 // Get the actual number of ladder in layer 3
712 if ( (fAddOnlyLadder3min<0) ||
713 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
714 (fAddOnlyLadder3max<0) ||
715 (fAddOnlyLadder3max >= fgkLay3Nladd) )
717 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
721 //________________________________________________________________________
722 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
723 // Get the actual number of ladder in layer 4
724 if ( (fAddOnlyLadder4min<0) ||
725 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
726 (fAddOnlyLadder4max<0) ||
727 (fAddOnlyLadder4max >= fgkLay4Nladd) )
729 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
733 //________________________________________________________________________
734 void AliITSv11GeometrySDD::CreateBasicObjects() {
736 // Create basics objets which will be assembled together
737 // in Layer3 and Layer4 functions
741 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
742 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
743 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
744 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
746 fPinSupport = CreatePinSupport();
747 fCoolPipeSupportL = CreateCoolPipeSupportL();
748 fCoolPipeSupportR = CreateCoolPipeSupportR();
750 fBaseThermalBridge = CreateBaseThermalBridge();
751 fHybrid = CreateHybrid(0);
753 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
754 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
755 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
756 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
757 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
758 TGeoMedium *raccordMedium = GetMedium("inox/alum$"); // ??? material of raccordo ???
760 //********************************************************************
761 // pieces of the carbon fiber structure
762 //********************************************************************
763 Double_t dy = fgkLadderSegBoxDH/2;
764 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
765 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
766 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
767 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
768 Double_t dYTranslation = (fgkLadderHeight/2.
769 -0.5*fgkLadderWidth*TMath::Tan(beta)
770 -fgkLadderBeamRadius);
771 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
773 //--- the top V of the Carbon Fiber Ladder (segment)
774 TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
775 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
776 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
777 cfLaddTop1,carbonFiberLadderStruct);
778 TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
779 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
780 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
781 cfLaddTop2, carbonFiberLadderStruct);
782 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
783 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
784 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
787 TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
788 fgkLadderLb, fgkLadderHb, fgkLadderl);
789 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
790 cfLaddSide1,carbonFiberLadderStruct);
791 TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
792 fgkLadderLb, fgkLadderHb, fgkLadderl);
793 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
794 cfLaddSide2,carbonFiberLadderStruct);
795 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
796 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
797 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
798 alpha*TMath::RadToDeg());
799 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
800 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
801 -alpha*TMath::RadToDeg());
802 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
805 // Beams on the sides
806 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
807 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
808 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
809 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
810 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
811 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
812 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
814 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
815 carbonFiberLadderStruct);
816 sideBeam->SetLineColor(fColorCarbonFiber);
818 //Euler rotation : about Z, then new X, then new Z
819 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
820 -beamPhiPrime*TMath::RadToDeg(),-90);
821 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
822 beamPhiPrime*TMath::RadToDeg(), -90);
823 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
824 beamPhiPrime*TMath::RadToDeg(), -90);
825 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
826 -beamPhiPrime*TMath::RadToDeg(),-90);
828 TGeoCombiTrans *beamTransf[8];
829 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
830 TMath::Tan(halfTheta),
831 fgkLadderBeamRadius/2. - dy,
832 -3*fgkSegmentLength/8, beamRot1);
834 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
835 TMath::Tan(halfTheta),
836 fgkLadderBeamRadius/2. - dy,
837 -3*fgkSegmentLength/8, beamRot1);
838 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
840 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
841 TMath::Tan(halfTheta),
842 fgkLadderBeamRadius/2. - dy,
843 -fgkSegmentLength/8, beamRot2);
845 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
846 TMath::Tan(halfTheta),
847 fgkLadderBeamRadius/2. - dy,
848 -fgkSegmentLength/8, beamRot2);
849 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
851 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
852 TMath::Tan(halfTheta),
853 fgkLadderBeamRadius/2. - dy,
854 -3*fgkSegmentLength/8, beamRot3);
856 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
857 TMath::Tan(halfTheta),
858 fgkLadderBeamRadius/2. - dy,
859 -3*fgkSegmentLength/8, beamRot3);
860 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
862 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
863 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
864 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
865 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
867 //--- Beams of the bottom
868 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
869 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
870 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
871 bottomBeam1, carbonFiberLadderStruct);
872 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
873 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
874 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
875 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
876 bottomBeam2, carbonFiberLadderStruct);
877 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
878 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
879 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
880 - fgkLadderLb/3, 0, 180);
881 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
882 bottomBeam3, carbonFiberLadderStruct);
883 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
884 //bottomBeam3Vol->SetLineColor(2);
885 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
886 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
888 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
889 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
890 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
891 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
892 -fgkSegmentLength/2, bottomBeamRot1);
893 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
894 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
895 - dy, fgkSegmentLength/2, bottomBeamRot2);
896 // be careful for beams #3: when "reading" from -z to +z and
897 // from the bottom of the ladder, it should draw a Lambda, and not a V
898 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
899 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
900 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
901 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
902 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
903 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
905 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
906 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
907 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
908 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
909 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
910 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
911 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
912 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
913 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
914 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
915 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
916 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
917 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
918 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
919 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
920 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
921 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
922 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
923 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
926 //********************************************************************
928 //********************************************************************
930 for (Int_t i=0; i<fgkLay3Ndet; i++) {
931 sprintf(cableName, "digitCableLay3A_%i",i);
932 fDigitCableLay3A[i].SetName(cableName);
933 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
934 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
935 fDigitCableLay3A[i].SetNLayers(2);
936 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
938 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
939 sprintf(cableName, "digitCableLay3B_%i",i);
940 fDigitCableLay3B[i].SetName(cableName);
941 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
942 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
943 fDigitCableLay3B[i].SetNLayers(2);
944 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
946 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
948 for (Int_t i=0; i<fgkLay4Ndet; i++) {
949 sprintf(cableName, "digitCableLay4A_%i",i);
950 fDigitCableLay4A[i].SetName(cableName);
951 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
952 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
953 fDigitCableLay4A[i].SetNLayers(2);
954 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
956 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
957 sprintf(cableName, "digitCableLay4B_%i",i);
958 fDigitCableLay4B[i].SetName(cableName);
959 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
960 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
961 fDigitCableLay4B[i].SetNLayers(2);
962 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
964 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
966 // Well, those digit cables could also include the analog cables
967 // which have the same width and the same path, at least in the ladder.
968 // It will gain some computing ressources (less volumes) and some
969 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
970 // The only thing to do is to change the names and put the correct total
973 // some transformations and volumes used in several places
974 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
975 0, -fgkCarlosSuppAngle, 0);
977 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
978 fgkLittleScrewHeadH/2);
979 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
980 littleScrewHead, stainless);
981 fCommonVol[0]->SetLineColor(kGray);
983 fLadderFoot = CreateLadderFoot();
985 fCardHV = CreateHVCard(0);
986 fCardCarlos = CreateCarlosCard(0);
989 // link beteen phynox and plastic cooling tubes
992 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
993 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
994 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
995 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
996 vwaterRac->SetLineColor(kBlue);
998 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
999 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1000 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1001 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1002 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1003 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1004 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1005 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1006 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1007 vtube1Rac->SetLineColor(kGray);
1008 vtube2Rac->SetLineColor(kGray);
1009 vtube3Rac->SetLineColor(kGray);
1011 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1012 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1013 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1014 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1015 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1016 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1017 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1018 fRaccordoL->AddNode(vwaterRac, 1,0);
1019 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1020 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1021 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1025 //________________________________________________________________________
1026 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1028 // a debugging function for checking some possible overlaps
1030 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1031 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1032 if (fHybrid) fHybrid->CheckOverlaps(precision);
1036 //________________________________________________________________________
1037 TGeoCombiTrans *AliITSv11GeometrySDD::
1038 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1041 // return the TGeoCombiTrans which make a translation in y and z
1042 // and a rotation in phi in the global coord system
1043 // If planeSym = true, the rotation places the object symetrically
1044 // (with respect to the transverse plane) to its position in the
1045 // case planeSym = false
1048 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1049 TGeoRotation r1("",0.,0.,dphi);
1050 TGeoRotation r2("",90, 180, -90-dphi);
1052 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1053 combiTrans1->SetTranslation(t1);
1054 if (planeSym) combiTrans1->SetRotation(r1);
1055 else combiTrans1->SetRotation(r2);
1060 //________________________________________________________________________
1061 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1065 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1066 const Double_t *vect = ct->GetTranslation();
1067 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1068 ct->SetTranslation(newVect);
1072 //________________________________________________________________________
1073 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1074 // for code developpment and debugging purposes
1076 if (! fSDDsensor3) CreateBasicObjects();
1078 // moth->AddNode(fPinSupport, 1, 0);
1079 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1080 // moth->AddNode(fSDDsensor3, 1, 0);
1081 // moth->AddNode(fSDDsensor4, 1, 0);
1082 // moth->AddNode(fBaseThermalBridge, 1, 0);
1083 // moth->AddNode(fHybrid,100,0);
1084 // moth->AddNode(fLadderFoot,1,0);
1085 //moth->AddNode(fCardLVL,1,0);
1086 //moth->AddNode(fCardLVR,1,0);
1088 // TGeoVolume* seg = CreateLadderSegment( 3, 0);
1089 // moth->AddNode(seg, 1, 0);
1091 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1092 // moth->AddNode(lay3Ladder, 1, 0);
1094 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1095 // moth->AddNode(lay3Detectors, 1, 0);
1097 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1098 // moth->AddNode(lay3Detectors, 1, 0);
1101 // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1102 // moth->AddNode(endLadder, 1, 0);
1104 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1105 // moth->AddNode(highVCard, 1, 0);
1107 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1108 // moth->AddNode(supportRing, 1, 0);
1110 TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1111 moth->AddNode(endLadderCards, 1, 0);
1113 // TGeoVolume *endLadderCards = CreateEndLadderCards( 4 );
1114 // moth->AddNode(endLadderCards, 1, 0);
1116 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1117 // moth->AddNode(carlosCard, 1, 0);
1122 //==================================
1123 //--- test of flat cable curvature
1124 //==================================
1127 AliITSv11GeomCableFlat cable("test", 3, 0.3);
1128 cable.SetNLayers(1);
1129 cable.SetNLayers(2);
1130 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1131 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1132 cable.SetInitialNode(endLadderCards);
1134 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1143 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1144 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1145 cable.CreateAndInsertBoxCableSegment(1,angle);
1147 Double_t p3[3], p4[3];
1152 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1153 cable.CreateAndInsertCableCylSegment(2,angle);
1158 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1159 cable.CreateAndInsertCableSegment(3,angle);
1164 //________________________________________________________________________
1165 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1167 // Insert the layer 3 in the mother volume. This is a virtual volume
1168 // containing ladders of layer 3 and the supporting rings
1172 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1176 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1179 if (! fSDDsensor3) CreateBasicObjects();
1181 //====================================
1182 // First we create the central barrel
1183 //====================================
1185 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1186 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1187 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1188 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1189 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1190 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1191 virtualLayer3Shape, airSDD);
1193 Double_t dPhi = 360./fgkLay3Nladd;
1194 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1195 // Placing virtual ladder and detectors volumes following
1196 // ladder ordering convention
1199 Int_t iLaddMax = fgkLay3Nladd;
1200 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1201 iLaddMin = fAddOnlyLadder3min;
1202 iLaddMax = fAddOnlyLadder3max+1;
1205 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1207 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1208 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1209 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1211 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1212 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1213 TGeoCombiTrans *ctLadd;
1214 //=============================================================
1216 // Special modification for ladder 2 of layer 3:
1217 // It has been inverted (pi rotation around y axis)
1219 //=============================================================
1221 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1222 0, ladderPhi, kTRUE);
1224 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1225 0, ladderPhi, kFALSE);
1226 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1227 ///////////////////////////////////////////////////
1228 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1229 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1230 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1231 minRadiusDetBox += detectorsThick/2;
1232 TGeoCombiTrans *ctDet;
1234 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1235 0, ladderPhi, kTRUE);
1237 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1238 0, ladderPhi, kFALSE);
1240 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1241 ///////////////////////////////////////////////////
1245 //====================================
1246 // Then the forward rapidity pieces
1247 // (cooling, Carlos, LV, HV ...)
1248 //====================================
1250 Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1251 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1252 Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1254 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1255 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1256 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1257 fgkForwardLay3Length/2.);
1259 // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1260 // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1261 // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1264 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1265 virtualForward3Shape, airSDD);
1266 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1267 virtualForward3Shape, airSDD);
1268 // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1269 // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1271 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1272 fgkLay3Length/2+fgkForwardLay3Length/2);
1273 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1274 -fgkLay3Length/2-fgkForwardLay3Length/2);
1276 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1278 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1279 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1280 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1281 minRadiusDetBox += detectorsThick/2;
1283 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1285 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1286 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1287 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1288 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1290 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1291 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1298 virtualLayer3->CheckOverlaps(0.01);
1299 //virtualForward3Pos->CheckOverlaps(0.01);
1300 //virtualForward3Neg->CheckOverlaps(0.01);
1303 virtualLayer3->SetVisibility(kFALSE);
1304 //virtualForward3Pos->SetVisibility(kFALSE);
1305 //virtualForward3Neg->SetVisibility(kFALSE);
1308 moth->AddNode(virtualLayer3, 1, 0);
1309 //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1310 //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1314 // //________________________________________________________________________
1315 // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1317 // // Insert the forward pieces of layer 3 in the mother volume.
1318 // // (cooling, Carlos, LV, HV ...)
1322 // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1326 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1328 // if (! fSDDsensor3) CreateBasicObjects();
1330 // Double_t dPhi = 360./fgkLay3Nladd;
1331 // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1332 // Int_t iLaddMin = 0;
1333 // Int_t iLaddMax = fgkLay3Nladd;
1334 // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1335 // iLaddMin = fAddOnlyLadder3min;
1336 // iLaddMax = fAddOnlyLadder3max+1;
1338 // char rotName[30];
1341 // //=================
1343 // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1344 // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1345 // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1347 // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1348 // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1349 // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1350 // fgkForwardLay3Length/2.);
1352 // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1353 // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1354 // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1357 // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1358 // virtualForward3Shape, airSDD);
1359 // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1360 // virtualForward3Shape, airSDD);
1361 // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1362 // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1364 // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1365 // fgkLay3Length/2+fgkForwardLay3Length/2);
1366 // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1367 // -fgkLay3Length/2-fgkForwardLay3Length/2);
1369 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1371 // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1372 // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1373 // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1374 // minRadiusDetBox += detectorsThick/2;
1376 // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1378 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1379 // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1380 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1381 // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1383 // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1384 // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1387 // if(GetDebug(1)) {
1388 // virtualForward3Pos->CheckOverlaps(0.01);
1389 // virtualForward3Neg->CheckOverlaps(0.01);
1392 // virtualForward3Pos->SetVisibility(kFALSE);
1393 // virtualForward3Neg->SetVisibility(kFALSE);
1395 // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1396 // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1401 //________________________________________________________________________
1402 void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1404 // Insert the end-ladder of layer 3 in the mother volume.
1405 // (cooling, Carlos, LV, HV ...)
1409 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1413 if (! fSDDsensor3) CreateBasicObjects();
1416 Int_t iLaddMax = fgkLay3Nladd;
1417 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1418 iLaddMin = fAddOnlyLadder3min;
1419 iLaddMax = fAddOnlyLadder3max+1;
1422 TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1423 TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1426 Double_t dPhi = 360./fgkLay3Nladd;
1427 TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1429 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1431 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1433 if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1435 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1437 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1438 fgkLay3Length/2, ladderPhi, kTRUE);
1439 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1440 -fgkLay3Length/2, ladderPhi, kFALSE);
1442 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1443 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1447 virtualForward3Pos->CheckOverlaps(0.01);
1448 virtualForward3Neg->CheckOverlaps(0.01);
1451 moth->AddNode(virtualForward3Pos, 1);
1452 moth->AddNode(virtualForward3Neg, 1);
1455 //________________________________________________________________________
1456 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1458 // Insert the layer 4 in the mother volume. This is a virtual volume
1459 // containing ladders of layer 4 and the supporting rings
1463 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1469 if (! fSDDsensor3) CreateBasicObjects();
1471 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1472 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1473 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1474 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1475 virtualLayer4Shape, airSDD);
1477 //====================================
1478 // First we create the central barrel
1479 //====================================
1481 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1482 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1483 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1485 Double_t dPhi = 360./fgkLay4Nladd;
1486 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1488 // placing virtual ladder and detectors volumes following ladder
1489 // ordering convention
1492 Int_t iLaddMax = fgkLay4Nladd;
1493 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1494 iLaddMin = fAddOnlyLadder4min;
1495 iLaddMax = fAddOnlyLadder4max+1;
1497 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1499 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1500 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1501 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1503 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1504 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1505 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1506 0, ladderPhi, kTRUE);
1507 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1508 ///////////////////////////////////////////////////
1509 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1510 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1512 minRadiusDetBox = fgkLay4DetLongRadius;
1513 minRadiusDetBox += detBoxThickness/2;
1514 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1515 0, ladderPhi, kTRUE);
1516 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1517 ///////////////////////////////////////////////////
1521 //====================================
1522 // Then the pieces at forward rapidity
1523 // (cooling, Carlos, LV, HV ...)
1524 //====================================
1526 Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1527 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1528 Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1530 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1531 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1532 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1533 fgkForwardLay4Length/2.);
1534 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1535 virtualForward4Shape, airSDD);
1536 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1537 virtualForward4Shape, airSDD);
1538 // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1539 // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1541 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1542 fgkLay4Length/2+fgkForwardLay4Length/2);
1543 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1544 -fgkLay4Length/2-fgkForwardLay4Length/2);
1546 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1548 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1549 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1551 minRadiusDetBox = fgkLay4DetLongRadius;
1552 minRadiusDetBox += detBoxThickness/2;
1554 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1556 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1557 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1558 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1559 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1560 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1561 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1565 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1567 virtualLayer4->SetVisibility(kFALSE);
1568 //virtualForward4Pos->SetVisibility(kFALSE);
1569 //virtualForward4Neg->SetVisibility(kFALSE);
1571 moth->AddNode(virtualLayer4,1,0);
1572 //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1573 //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1577 // //________________________________________________________________________
1578 // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1580 // // Insert the layer 4 in the mother volume. This is a virtual volume
1581 // // containing ladders of layer 4 and the supporting rings
1582 // // (cooling, Carlos, LV, HV ...)
1586 // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1590 // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1592 // if (! fSDDsensor3) CreateBasicObjects();
1594 // Double_t dPhi = 360./fgkLay4Nladd;
1595 // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1597 // // placing virtual ladder and detectors volumes following ladder
1598 // // ordering convention
1599 // char rotName[20];
1600 // Int_t iLaddMin = 0;
1601 // Int_t iLaddMax = fgkLay4Nladd;
1602 // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1603 // iLaddMin = fAddOnlyLadder4min;
1604 // iLaddMax = fAddOnlyLadder4max+1;
1607 // //=================
1608 // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1609 // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1610 // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1612 // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1613 // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1614 // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1615 // fgkForwardLay4Length/2.);
1616 // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1617 // virtualForward4Shape, airSDD);
1618 // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1619 // virtualForward4Shape, airSDD);
1620 // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1621 // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1623 // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1624 // fgkLay4Length/2+fgkForwardLay4Length/2);
1625 // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1626 // -fgkLay4Length/2-fgkForwardLay4Length/2);
1628 // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1630 // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1631 // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1632 // if (iLadd%2 != 0)
1633 // minRadiusDetBox = fgkLay4DetLongRadius;
1634 // minRadiusDetBox += detBoxThickness/2;
1636 // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1638 // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1639 // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1640 // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1641 // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1642 // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1643 // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1646 // virtualForward4Pos->SetVisibility(kFALSE);
1647 // virtualForward4Neg->SetVisibility(kFALSE);
1649 // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1650 // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1654 //________________________________________________________________________
1655 void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1657 // Insert the end-ladder of layer 4 in the mother volume.
1658 // (cooling, Carlos, LV, HV ...)
1662 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1666 if (! fSDDsensor3) CreateBasicObjects();
1668 // placing virtual ladder and detectors volumes following ladder
1669 // ordering convention
1671 Int_t iLaddMax = fgkLay4Nladd;
1672 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1673 iLaddMin = fAddOnlyLadder4min;
1674 iLaddMax = fAddOnlyLadder4max+1;
1677 TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1678 TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1681 Double_t dPhi = 360./fgkLay4Nladd;
1682 TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1684 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1686 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1689 dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1691 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1693 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1694 fgkLay4Length/2, ladderPhi, kTRUE);
1695 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1696 -fgkLay4Length/2, ladderPhi, kFALSE);
1697 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1698 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1701 moth->AddNode(virtualForward4Pos, 1);
1702 moth->AddNode(virtualForward4Neg, 1);
1706 //________________________________________________________________________
1707 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1709 // return an assembly volume containing the CF ladder
1712 Int_t nDetectors = fgkLay3Ndet;
1713 Double_t ladderLength = fgkLay3LadderLength;
1714 Double_t underSegDH = fLay3LadderUnderSegDH;
1715 Double_t *sensorZPos = fLay3sensorZPos;
1716 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1717 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1721 nDetectors = fgkLay4Ndet;
1722 ladderLength = fgkLay4LadderLength;
1723 digitCableA = fDigitCableLay4A;
1724 digitCableB = fDigitCableLay4B;
1725 underSegDH = fLay4LadderUnderSegDH;
1726 sensorZPos = fLay4sensorZPos;
1729 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1731 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1732 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1734 // placing virtual ladder segment following detector ordering convention
1735 //=======================================================================
1738 // adding segment this way to create cable points in the correct order ...
1739 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1741 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1742 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1743 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1744 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1745 + fgkSegmentLength/2;
1746 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1747 underSegDH/2,segmentPos);
1749 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1751 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1753 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1754 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1755 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1756 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1757 + fgkSegmentLength/2;
1758 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1759 underSegDH/2,segmentPos);
1761 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1764 // putting virtual volume corresponding to the end of ladder
1765 //=======================================================================
1766 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1767 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1768 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1769 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1770 // Euler rotation : about Z, then new X, then new Z
1771 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1772 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1773 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1774 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1775 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1777 // creating and inserting cable segments
1778 // (check points are placed while creating segments)
1779 //=======================================================================
1781 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1783 digitCableA[iSegment].SetInitialNode(virtualLadder);
1784 digitCableB[iSegment].SetInitialNode(virtualLadder);
1786 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1787 Double_t rotation = 0;
1789 rotation = 90-fgkHybridAngle;
1790 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1792 digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1796 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1797 Double_t rotation = 0;
1799 rotation = fgkHybridAngle-90;
1800 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1802 digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1807 //=======================================================================
1809 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1810 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1812 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1813 char cableHVname[30];
1814 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1815 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1816 cableHV[iSegment].SetName(cableHVname);
1817 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1818 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1819 cableHV[iSegment].SetNLayers(2);
1820 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1822 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1823 cableHV[iSegment].SetInitialNode(virtualLadder);
1825 Double_t x1[3], x2[3], x3[3],
1826 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1828 x1[0] = -fgkTransitHVtailXpos;
1829 x2[0] = -fgkTransitHVtailXpos;
1830 x3[0] = -fgkTransitHVtailXpos;
1831 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1832 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1833 *fgkLongHVcableSeparation;
1834 // adjust where HV long cable starts in Y
1835 // useful if you want to let some space for alignment
1836 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1837 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1838 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1840 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1841 x2[2] = x1[2]+5*fgkmm;
1842 x3[2] = ladderLength/2-endLength;
1843 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1844 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1845 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1847 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1848 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1849 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1850 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1854 x1[0] = fgkTransitHVtailXpos;
1855 x2[0] = fgkTransitHVtailXpos;
1856 x3[0] = fgkTransitHVtailXpos;
1858 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1859 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1860 *fgkLongHVcableSeparation;
1861 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1862 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1863 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1865 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1866 x2[2] = x1[2]-5*fgkmm;
1867 x3[2] = -ladderLength/2+endLength;
1868 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1869 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1870 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1872 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1873 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1877 //**********************************
1878 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1879 return virtualLadder;
1883 //________________________________________________________________________
1884 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
1885 Double_t xSign, Double_t L, Double_t H, Double_t l) {
1886 // Create one half of the V shape corner of CF ladder
1888 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1889 cfLaddSide->SetVertex( 0, 0, 0);
1890 cfLaddSide->SetVertex( 1, 0, -H);
1891 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1892 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1893 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1894 cfLaddSide->SetVertex( 4, 0, 0);
1895 cfLaddSide->SetVertex( 5, 0, -H);
1896 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1897 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1898 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1903 //________________________________________________________________________
1904 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1906 // return a box containing the front-end hybrid
1909 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1911 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1912 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1913 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1914 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1915 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1916 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1917 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1918 // + upFLTotalThick + ccUpLayerTotThick);
1919 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1921 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1923 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1925 //**************************************************** media :
1926 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1927 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1928 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1929 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1930 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1931 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1932 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1933 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1934 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1935 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1936 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1938 //**************************************************** main volume :
1939 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1940 (fgkHybridLength)/2);
1941 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1944 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1945 fgkHybridThBridgeThick/2,
1948 //**************************************************** Thermal bridge :
1949 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1951 carbonFiberLadderStruct);
1952 vThermalBridge->SetLineColor(fColorCarbonFiber);
1953 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1954 +fgkHybridThBridgeThick/2, 0);
1955 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
1957 //**************************************************** Screen layer :
1958 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
1959 fgkHybAlThick/2, fgkHybridLength/2);
1960 //here the upedex and glue layers are both assumed to be polyimide
1961 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
1963 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
1965 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
1966 (screenTotalThick+lowFLTotalThick)/2);
1968 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
1969 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
1971 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
1972 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
1973 +fgkHybAlThick/2, 0);
1975 TGeoTranslation hybHolePos1Tr(roundHoleX,
1976 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
1977 -fgkHybridLength/2+fgkHybRndHoleZ);
1978 TGeoTranslation hybHolePos2Tr(roundHoleX,
1979 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
1980 fgkHybridLength/2-fgkHybRndHoleZ);
1982 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
1983 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
1984 hybHolePos1->SetName("hybHolePos1");
1985 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
1986 hybHolePos2->SetName("hybHolePos2");
1988 upGlueScreenTr->RegisterYourself();
1989 alScreenTr->RegisterYourself();
1990 hybHolePos1->RegisterYourself();
1991 hybHolePos2->RegisterYourself();
1994 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
1995 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
1996 "+sRoundHole:hybHolePos2)");
1997 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
1998 vScreenAl->SetLineColor(fColorAl);
1999 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2000 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2001 "+sRoundHole:hybHolePos2)");
2002 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2003 sScreenUpGlue,polyhamideSDD);
2004 vScreenUpGlue->SetLineColor(fColorPolyhamide);
2006 hybrid->AddNode(vScreenUpGlue, 1, 0);
2007 hybrid->AddNode(vScreenAl, 1, 0);
2009 //**************************************************** FL low layer :
2010 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2011 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2013 //here the upedex and glue layers are both assumed to be polyimide
2014 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2015 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2017 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2018 fgkHybAlThick/2, sideWidth1/2);
2020 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2021 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2022 -(fgkHybridLength-sideWidth1)/2);
2023 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2024 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2025 -(fgkHybridLength-sideWidth1)/2);
2026 upGlueBarTr1->RegisterYourself();
2027 alBarTr1->RegisterYourself();
2029 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2030 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2031 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2032 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2033 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2034 sLowUpGlueBar1, polyhamideSDD);
2035 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2037 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2038 vLowAlBar1->SetLineColor(fColorAl);
2039 hybrid->AddNode(vLowUpGlueBar1,1,0);
2040 hybrid->AddNode(vLowAlBar1,1,0);
2043 //here the upedex and glue layers are both assumed to be polyimide
2044 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2045 (fgkHybGlueLowThick+fgkHybUpThick)/2,
2047 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2048 fgkHybAlThick/2, sideWidth2/2);
2050 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2051 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2052 (fgkHybridLength-sideWidth2)/2);
2053 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2054 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2055 (fgkHybridLength-sideWidth2)/2);
2056 upGlueBarTr2->RegisterYourself();
2057 alBarTr2->RegisterYourself();
2059 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2060 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2061 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2062 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2063 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2065 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2067 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2068 vLowAlBar2->SetLineColor(fColorAl);
2069 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2070 hybrid->AddNode(vLowAlBar2, 1, 0);
2072 if(GetDebug(3)) { // Remove compiler warning.
2073 sAlScreenLayer->InspectShape();
2074 sUpGlueScreenLayer->InspectShape();
2075 sRoundHole->InspectShape();
2076 sUpGlueBar1->InspectShape();
2077 sUpGlueBar2->InspectShape();
2078 sAlBar1->InspectShape();
2079 sAlBar2->InspectShape();
2082 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2083 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2084 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2086 lowFLpiece.SetNLayers(2);
2087 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2089 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2090 // alSDD at 80% : mostly to take into account strips of piece 3
2092 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2093 lowLayerYmin + lowFLTotalThick/2,
2094 -fgkHybridLength/2 + sideWidth1 };
2095 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2096 Double_t vZ[3] = {0,0,1};
2097 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2098 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2099 lowFLpiece.SetInitialNode(hybrid);
2100 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2101 lowFLpiece.ResetPoints();
2103 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2104 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2106 lowFLpiece.SetWidth(piece2width);
2107 lowFLpiece.SetName("lowFLpiece2");
2108 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2110 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2111 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2112 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2113 lowFLpiece.ResetPoints();
2115 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2116 - fgkHybFLlowHoleAmbDX/2;
2118 lowFLpiece.SetWidth(piece3width);
2119 lowFLpiece.SetName("lowFLpiece3");
2120 x1[0] = fgkHybridWidth/2-piece3width/2;
2122 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2123 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2124 lowFLpiece.CreateAndInsertBoxCableSegment(1);
2126 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2127 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2128 Double_t vX[3] = {1,0,0};
2129 for (Int_t i=0; i<3; i++) {
2131 sprintf(ch, "lowFLpieceA%i", i+4);
2132 lowFLpiece.SetName(ch);
2133 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2135 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2136 x1[0] = -fgkHybridWidth/2 + piece1width;
2137 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2138 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2139 x1[2] = zPiece; x2[2] = zPiece;
2140 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2141 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2142 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2143 lowFLpiece.ResetPoints();
2145 sprintf(ch, "lowFLpieceB%i", i+4);
2146 lowFLpiece.SetName(ch);
2147 x1[0] = fgkHybridWidth/2 - piece3width;
2148 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2149 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2150 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2151 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2154 //**************************************************** chips+CC:
2155 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2156 chip.SetInitialNode(hybrid);
2158 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2159 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2160 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2161 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2163 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2164 // Here the tho CC (low+up) are merged
2165 // In fact, the last layer has a smaller surface of Al -> I put 80%
2167 x1[1] = lowLayerYmin + chipsCCTotThick/2;
2171 for (Int_t i=0; i<4; i++) {
2172 sprintf(ch, "pascalCC%i", i);
2174 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2175 x2[0] = x1[0] + fgkHybPascalDX;
2176 x1[2] = zChips[i] - fgkHybridLength/2;
2178 chip.AddCheckPoint( hybrid, 0, x1, vX );
2179 chip.AddCheckPoint( hybrid, 1, x2, vX );
2180 chip.CreateAndInsertBoxCableSegment(1,-90);
2183 sprintf(ch, "ambraCC%i", i);
2185 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2186 x2[0] = x1[0] + fgkHybAmbraDX;
2187 chip.AddCheckPoint( hybrid, 0, x1, vX );
2188 chip.AddCheckPoint( hybrid, 1, x2, vX );
2189 chip.CreateAndInsertBoxCableSegment(1,-90);
2193 //**************************************************** CC outside chips:
2194 // I don't think there is a second aluminium layer here ...
2195 for (Int_t i = 0; i<4; i++) {
2197 sprintf(ch, "ccLayerA%i", i);
2199 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2200 ccLayer1.SetInitialNode(hybrid);
2201 ccLayer1.SetNLayers(2);
2202 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2203 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2206 x1[0] = -fgkHybridWidth/2;
2207 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2208 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2209 + fgkHybChipThick + ccUpLayerTotThick/2;
2211 x1[2] = zChips[i] - fgkHybridLength/2;
2213 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2214 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2215 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2217 sprintf(ch, "ccLayerB%i", i);
2218 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2219 ccLayer2.SetInitialNode(hybrid);
2220 ccLayer2.SetNLayers(2);
2221 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2222 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2225 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2226 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2227 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2228 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2229 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2230 ccLayer2.ResetPoints();
2231 sprintf(ch, "ccLayerC%i", i);
2232 ccLayer2.SetName(ch);
2233 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2234 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2235 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2236 + ccUpLayerTotThick/2;
2239 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2240 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2241 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2244 //**************************************************** FL UP:
2245 // (last Al layer will be a special triangular shape)
2246 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2247 fgkHybFLUpperWidth/2, flUpThick/2,
2248 fgkHybFLUpperLength/2);
2249 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2250 sFLupPolyhamide, polyhamideSDD);
2251 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2252 TGeoTranslation *trFLupPolyhamide =
2253 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2254 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2256 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2258 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2259 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2260 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2261 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2262 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2263 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2264 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2265 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2266 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2267 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2270 vAluStrip->SetLineColor(fColorAl);
2271 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2272 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2274 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2275 +flUpThick+fgkHybAlThick/2;
2276 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2277 fgkHybridWidth/2,yRotAluStrip,
2278 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2279 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2280 AddTranslationToCombiTrans(aluStripTr2,0,0,
2281 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2282 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2283 AddTranslationToCombiTrans(aluStripTr3,0,0,
2284 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2285 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2286 AddTranslationToCombiTrans(aluStripTr4,0,0,
2287 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2289 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2290 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2291 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2292 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2293 //**************************************************** SMD:
2294 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2295 fgkHybSMDmiddleL/2+fgkHybSMDendL,
2296 fgkHybSMDheight/2,fgkHybSMDendW/2);
2297 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2299 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2300 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2301 fgkHybSMDmiddleW/2);
2302 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2303 hybSMDmiddle,medSMD);
2304 vHybSMDmiddle->SetLineColor(fColorSMD);
2305 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2306 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2307 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2308 hybSMDend,medSMDweld);
2309 vHybSMDend->SetLineColor(fColorSMDweld);
2310 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2311 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2312 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2313 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2314 vHybSMD->AddNode(vHybSMDmiddle,1,0);
2315 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2316 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2317 for (Int_t i=0; i<fgkNHybSMD; i++) {
2318 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2319 -fgkHybridWidth/2+fgkHybSMDposX[i],
2320 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2321 -fgkHybridLength/2+fgkHybSMDposZ[i]);
2322 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2328 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2329 hybrid->SetVisibility(kFALSE);
2333 //________________________________________________________________________
2334 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2336 // Return a TGeoVolume* containing a segment of a ladder.
2339 TGeoMedium *phynoxSDD = GetMedium("inox/alum$"); // phynoxSDD To code ??? !!!
2340 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2341 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2343 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2344 Double_t segmentLength = fgkSegmentLength;
2345 Double_t spaceBetweenCables = 500*fgkmicron;
2347 //*****************************************
2348 // Set parameters according to (iLay,iSeg):
2349 //*****************************************
2350 Int_t nDetectors = fgkLay3Ndet;
2351 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2352 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2353 (fgkSegmentLength*fgkLay3Ndet/2. -
2354 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2355 // sensorCenterZPos = z in segment local coord syst.
2357 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2358 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2361 } else if (iLay==4) {
2362 nDetectors = fgkLay4Ndet;
2363 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2364 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2365 (fgkSegmentLength*fgkLay4Ndet/2. -
2366 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2367 digitCableA = fDigitCableLay4A;
2368 digitCableB = fDigitCableLay4B;
2370 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2373 Double_t cableSideSign = -1;
2374 if (iSeg<nDetectors/2) cableSideSign = 1;
2375 Double_t spaceForCables = spaceBetweenCables*
2376 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2378 // gives [0-1-2-2-1-0]*spaceBetweenCables
2379 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2380 Int_t iUpdateCableMin;
2381 Int_t iUpdateCableMax;
2382 if (cableSideSign==-1) {
2383 iUpdateCableMin = nDetectors/2;
2384 iUpdateCableMax = iSeg-1;
2386 iUpdateCableMin = iSeg+1;
2387 iUpdateCableMax = nDetectors/2-1;
2391 cout << "Segment ("<< iLay <<',' << iSeg
2392 << ") : sensor z shift in local segment coord.="
2393 << sensorCenterZPos << endl;
2396 //****************************
2397 // The segment volume
2398 //****************************
2400 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2401 // likely slows down the transport of particles through the geometry
2403 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2405 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2406 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2407 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2410 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2412 virtualSeg->SetVisibility(kFALSE);
2414 //******************************
2415 // Carbon fiber structure :
2416 //******************************
2418 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2419 Int_t volumeIndex = 1;
2420 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2421 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2425 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2426 fLaddSegCommonTr[i]);
2429 //**********************************
2430 // Pine support of the sensors :
2431 //**********************************
2432 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2433 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2435 // The use of the following constructor type allow to use rotPS1 and rotPS2
2436 // (and not copy them) therefore we gain some memory
2437 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2438 - fgkLadderHeight/2.-tDY
2439 + fgkPinSuppHeight/2.,
2440 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2442 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2443 - fgkLadderHeight/2.-tDY
2444 + fgkPinSuppHeight/2.,
2445 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2446 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2448 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2449 - fgkLadderHeight/2.-tDY
2450 + fgkPinSuppHeight/2.,
2451 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2452 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2454 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2455 - fgkLadderHeight/2.-tDY
2456 + fgkPinSuppHeight/2.,
2457 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2458 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2460 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2461 - fgkLadderHeight/2. - tDY
2462 + fgkPinSuppHeight/2.,
2463 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2465 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2466 - fgkLadderHeight/2. - tDY
2467 + fgkPinSuppHeight/2.,
2468 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2469 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2471 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2472 - fgkLadderHeight/2. - tDY
2473 + fgkPinSuppHeight/2.,
2474 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2475 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2477 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2478 - fgkLadderHeight/2. - tDY
2479 + fgkPinSuppHeight/2.,
2480 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2481 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2483 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2484 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2485 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2486 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2487 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2488 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2489 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2490 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2492 //******************************
2493 // Cooling pipe supports :
2494 //******************************
2495 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2496 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2497 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2498 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2500 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2501 (triangleHeight+triangleCPaxeDist/
2502 TMath::Sin(halfTheta)-coolPipeSuppH);
2503 if (fAddCoolingSyst) {
2504 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2505 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2506 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2507 -fgkLadderHeight/2. - tDY
2508 +coolPipeSuppH+fgkLadderBeamRadius,
2509 -segmentLength/2., rotCPS1);
2511 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2512 -fgkLadderHeight/2. - tDY
2513 +coolPipeSuppH+fgkLadderBeamRadius,
2514 -segmentLength/2., rotCPS1);
2515 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2517 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2518 -fgkLadderHeight/2.- tDY
2519 +coolPipeSuppH+fgkLadderBeamRadius,
2520 segmentLength/2., rotCPS2);
2522 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2523 -fgkLadderHeight/2.- tDY
2524 +coolPipeSuppH+fgkLadderBeamRadius,
2525 segmentLength/2., rotCPS2);
2526 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2528 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2529 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2530 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2531 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2534 //************************
2536 //************************
2537 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2538 -fgkLadderHeight/2. - tDY +
2539 fgkLadderBeamRadius+coolPipeSuppH, 0);
2540 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2541 -fgkLadderHeight/2.- tDY +
2542 fgkLadderBeamRadius+coolPipeSuppH, 0);
2544 if (fAddCoolingSyst) {
2545 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2546 fgkCoolPipeOuterDiam/2,
2548 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2551 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2552 coolingPipeShape, phynoxSDD );
2553 coolingPipe->SetLineColor(fColorPhynox);
2554 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2558 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2559 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2561 virtualSeg->AddNode(cooler, 1, pipeTr1);
2562 virtualSeg->AddNode(cooler, 2, pipeTr2);
2566 //**********************************
2567 // Bases of hybrid thermal bridges
2568 //**********************************
2569 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2570 // approx !!! not clear on 0752/14-A
2571 if (fAddCoolingSyst) {
2572 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2573 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2574 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2575 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2577 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2578 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2581 //*************************
2583 //*************************
2584 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2585 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2587 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2588 - shiftHyb*SinD(fgkHybridAngle) );
2589 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2590 + shiftHyb*CosD(fgkHybridAngle) );
2592 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2593 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2594 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2595 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2596 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2597 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2599 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2600 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2607 // Starting from this segment
2608 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2609 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2610 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2611 - digitCableA->GetWidth()/2;
2612 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2613 - digitCableA->GetThickness()/2;
2615 Double_t digitCableX = ( coolPipeSuppL
2616 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2617 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2618 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2619 + fgkLadderBeamRadius+coolPipeSuppH
2620 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2621 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2624 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2625 digitCableY, cableSideSign*hybDz };
2626 Double_t digitCableCenterA1[3] = {
2627 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2628 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2629 cableSideSign*segmentLength/2 };
2631 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2632 digitCableY,cableSideSign*hybDz};
2633 Double_t digitCableCenterB1[3]={
2634 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2635 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2636 cableSideSign*segmentLength/2 };
2638 Double_t vZ[3] = {0,0,1};
2639 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2640 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2641 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2642 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2644 // Updating the other cables
2645 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2647 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2649 digitCableA[iCable].GetPoint( 1, coord);
2650 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2651 digitCableB[iCable].GetPoint( 1, coord);
2652 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2656 //**********************************
2657 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2662 //________________________________________________________________________
2663 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2665 // Create a pine support
2666 // axis of rotation is the cone axis, center in its middle
2668 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2669 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2670 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2671 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2672 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2673 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2674 fgkPinSuppHeight/2.);
2675 if(GetDebug(3)){// Remove compiler warning.
2676 cone->InspectShape();
2677 tong->InspectShape();
2678 hole->InspectShape();
2681 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2682 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2683 tongTrans->RegisterYourself();
2684 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2685 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2686 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2689 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2690 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport",pinSupportShape,
2692 pinSupport->SetLineColor(fColorRyton);
2694 // include the pin itself !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2698 //________________________________________________________________________
2699 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2701 // Create half of the cooling pipe support (ALR-0752/3)
2704 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2706 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2707 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2708 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
2709 -fgkCoolPipeSuppWidthExt/2.);
2710 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2711 fgkCoolPipeSuppWidthExt/2.);
2712 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2713 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2714 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
2715 -fgkCoolPipeSuppWidthExt/2.);
2716 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2717 fgkCoolPipeSuppWidthExt/2.);
2718 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2719 side1->SetName("ITSsddCPSside1");
2721 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2722 - fgkCoolPipeSuppAxeDist
2723 + fgkCoolPipeSuppWidthExt/2., 0);
2724 side1Tr->RegisterYourself();
2725 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2726 - fgkCoolPipeSuppAxeDist
2727 + fgkCoolPipeSuppWidthExt*3/2.
2728 + fgkCoolPipeSuppWidthIn,0);
2729 side2Tr->RegisterYourself();
2731 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2732 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2733 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2734 TGeoTranslation *middleTr =
2735 new TGeoTranslation("ITSsddCPStr3",
2736 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2737 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2738 +fgkCoolPipeSuppWidthIn/2., 0);
2739 middleTr->RegisterYourself();
2741 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2742 fgkCoolPipeSuppTongW/4.,
2743 (fgkCoolPipeSuppFulWidth
2744 - 2*fgkCoolPipeSuppWidthExt
2745 - fgkCoolPipeSuppWidthIn)/2,
2746 fgkCoolPipeSuppHeight/2.);
2748 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2749 fgkCoolPipeSuppTongW/4.,
2750 - fgkCoolPipeSuppAxeDist
2751 + fgkCoolPipeSuppFulWidth
2752 - axeBox->GetDY(), 0);
2753 axeBoxTr->RegisterYourself();
2755 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2756 fgkCoolPipeSuppTongW/4.);
2758 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2759 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2760 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2761 axeTrans->RegisterYourself();
2762 //delete axeRot; // make the code crash, no idea of why !!!
2765 middle->InspectShape();
2766 axe->InspectShape();
2769 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2771 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2772 "ITSsddCoolPipeSuppShapeL",
2773 "ITSsddCPSmiddle:ITSsddCPStr3"
2774 "+ITSsddCPSside1:ITSsddCPStr1"
2775 "+ITSsddCPSside1:ITSsddCPStr2"
2776 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2777 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2778 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2779 coolPipeSuppShape, rytonSDD);
2781 coolPipeSupp->SetLineColor(fColorRyton);
2783 return coolPipeSupp;
2787 //________________________________________________________________________
2788 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2790 //Create half of the cooling pipe support (ALR-0752/3)
2793 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2795 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2796 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2797 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2798 -fgkCoolPipeSuppWidthExt/2.);
2799 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2800 fgkCoolPipeSuppWidthExt/2.);
2801 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2802 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2803 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2804 -fgkCoolPipeSuppWidthExt/2.);
2805 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2806 fgkCoolPipeSuppWidthExt/2.);
2807 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2808 side1->SetName("ITSsddCPSside1R");
2810 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2811 - fgkCoolPipeSuppAxeDist
2812 + fgkCoolPipeSuppWidthExt/2., 0);
2813 side1Tr->RegisterYourself();
2814 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2815 - fgkCoolPipeSuppAxeDist
2816 + fgkCoolPipeSuppWidthExt*3/2.
2817 + fgkCoolPipeSuppWidthIn, 0);
2818 side2Tr->RegisterYourself();
2820 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2821 (fgkCoolPipeSuppMaxLength/2.
2822 - fgkCoolPipeSuppSlitL)/2.,
2823 fgkCoolPipeSuppWidthIn/2.,
2824 fgkCoolPipeSuppHeight/2.);
2825 TGeoTranslation *middleTr =
2826 new TGeoTranslation("ITSsddCPStr3R",
2827 -( fgkCoolPipeSuppMaxLength/2.
2828 -fgkCoolPipeSuppSlitL)/2.,
2829 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2830 + fgkCoolPipeSuppWidthIn/2.,0);
2831 middleTr->RegisterYourself();
2833 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2834 fgkCoolPipeSuppTongW/4.,
2835 (fgkCoolPipeSuppFulWidth
2836 - 2*fgkCoolPipeSuppWidthExt
2837 - fgkCoolPipeSuppWidthIn)/2,
2838 fgkCoolPipeSuppHeight/2.);
2840 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2841 - fgkCoolPipeSuppTongW/4.,
2842 - fgkCoolPipeSuppAxeDist
2843 + fgkCoolPipeSuppFulWidth
2844 - axeBox->GetDY(),0);
2845 axeBoxTr->RegisterYourself();
2847 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2848 fgkCoolPipeSuppTongW/4.);
2850 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2851 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2852 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2853 axeTrans->RegisterYourself();
2857 middle->InspectShape();
2858 axe->InspectShape();
2861 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2862 "ITSsddCoolPipeSuppShapeR",
2863 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2864 "+ITSsddCPSside1R:ITSsddCPStr1R"
2865 "+ITSsddCPSside1R:ITSsddCPStr2R"
2866 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2867 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2869 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2870 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2871 coolPipeSuppShape, rytonSDD);
2872 coolPipeSupp->SetLineColor(fColorRyton);
2874 return coolPipeSupp;
2877 //________________________________________________________________________
2878 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2880 // based on ALR 0752/8
2883 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2885 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2886 - (fgkRadiusAminBTB+fgkBTBthick);
2887 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2888 fgkBTBthick/2., fgkBTBlength/2.);
2889 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2890 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2891 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2892 base1Tr->RegisterYourself();
2894 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2896 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2897 fgkBTBthick/2., fgkBTBlength/2.);
2898 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2899 fgkBTBaxisAtoBottom - base2width/2.,
2900 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2901 base2Tr->RegisterYourself();
2903 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2904 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
2905 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
2906 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
2907 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
2908 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
2909 sideTr1->RegisterYourself();
2910 sideTr2->RegisterYourself();
2912 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
2913 fgkBTBthick/2., fgkBTBHoleLength/2.);
2914 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
2915 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2916 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2917 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
2918 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
2919 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2920 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2921 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
2922 holeTr1->RegisterYourself();
2923 holeTr2->RegisterYourself();
2925 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
2926 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
2927 fgkRadiusAminBTB, radiusAmaxBTB,
2928 fgkBTBlength/2., 0., 180.);
2929 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
2930 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
2931 fgkBTBlength/2., 270., 360.);
2932 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
2933 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
2935 roundTr1->RegisterYourself();
2937 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
2938 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
2939 fgkBTBlength/2., 180., 270.);
2940 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
2941 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
2943 roundTr2->RegisterYourself();
2945 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
2946 "ITSsddBaseThermalBridgeShape",
2947 "ITSsddBTBbase1:ITSsddBTBtr1"
2948 "+ ITSsddBTBbase2:ITSsddBTBtr2"
2949 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
2950 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
2951 "+ ITSsddBTBside:ITSsddBTBsideTr1"
2952 "+ ITSsddBTBside:ITSsddBTBsideTr2"
2953 "- ITSsddBTBhole:ITSsddBTBholeTr1"
2954 "- ITSsddBTBhole:ITSsddBTBholeTr2"
2955 "+ ITSsddBTBmainAxis");
2957 if(GetDebug(3)){// Remove compiler warning.
2958 base1->InspectShape();
2959 base2->InspectShape();
2960 side->InspectShape();
2961 hole->InspectShape();
2962 mainAxis->InspectShape();
2963 round1->InspectShape();
2964 round2->InspectShape();
2967 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
2968 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
2970 carbonFiberLadderStruct);
2972 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
2973 return vBaseThermalBridge;
2977 //________________________________________________________________________
2978 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
2980 // Return an assembly containing a end of a CF ladder.
2983 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
2984 TGeoMedium *stesalite = GetMedium("EPOXY$"); /// To code ??? !!!!!!!!!!!!!!!!
2985 TGeoMedium *phynoxSDD = GetMedium("inox/alum$"); // phynoxSDD To code ??? !!!!!!!!!!!
2986 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2988 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
2989 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2990 Double_t underSegDH = fLay3LadderUnderSegDH;
2991 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
2992 // footDZ is also where to place the ruby's center in local Z
2993 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
2996 } else if (iLay==4) {
2997 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
2998 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2999 underSegDH = fLay4LadderUnderSegDH;
3000 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3001 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3003 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3007 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3008 + underSegDH/2); //space under ladder segment
3009 // here tDY is not the same as for the segment because the end ladder
3010 // does not have a space under it, inside the general ladder volume.
3011 Double_t segmentLength = fgkSegmentLength;
3012 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3014 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3016 //**********************************
3017 // coding real matter :
3018 //**********************************
3019 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3020 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3021 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3022 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3024 //--- The 3 V shape corners of the Carbon Fiber Ladder
3026 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
3027 fgkLadderLa, fgkLadderHa, fgkLadderl);
3028 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
3029 cfLaddTop1,carbonFiberLadderStruct);
3030 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3031 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
3032 fgkLadderLa, fgkLadderHa, fgkLadderl);
3033 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3034 cfLaddTop2,carbonFiberLadderStruct);
3035 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3036 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3037 -(length-topCornerLength)/2.);
3038 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3039 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3042 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
3043 fgkLadderLb, fgkLadderHb, fgkLadderl);
3044 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3045 cfLaddSide1,carbonFiberLadderStruct);
3046 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3047 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
3048 fgkLadderLb, fgkLadderHb, fgkLadderl);
3049 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3050 cfLaddSide2,carbonFiberLadderStruct);
3051 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3052 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3053 TMath::Tan(beta) - fgkLadderBeamRadius );
3055 // because center of the triangle doesn't correspond to virtual vol. center
3056 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3057 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3058 alpha*TMath::RadToDeg());
3059 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3060 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3061 -alpha*TMath::RadToDeg());
3062 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3063 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3064 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3065 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3066 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3069 // Beams on the sides
3070 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3071 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3073 //Euler rotation : about Z, then new X, then new Z
3074 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3075 -beamPhiPrime*TMath::RadToDeg(), -90);
3076 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3077 beamPhiPrime*TMath::RadToDeg(), -90);
3078 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3079 beamPhiPrime*TMath::RadToDeg(), -90);
3080 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3081 -beamPhiPrime*TMath::RadToDeg(), -90);
3082 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3083 TMath::Tan(halfTheta),
3084 fgkLadderBeamRadius/2. + tDY,
3085 -length/2 + segmentLength/8, beamRot1);
3086 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3087 TMath::Tan(halfTheta),
3088 fgkLadderBeamRadius/2.+tDY,
3089 -length/2 + 3*segmentLength/8, beamRot2);
3090 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3091 TMath::Tan(halfTheta),
3092 fgkLadderBeamRadius/2.+tDY,
3093 -length/2 + segmentLength/8, beamRot3);
3094 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3095 TMath::Tan(halfTheta),
3096 fgkLadderBeamRadius/2. + tDY,
3097 -length/2+3*segmentLength/8, beamRot4);
3099 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3100 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3101 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3102 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3104 //--- Beams of the bottom
3105 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3107 /* Not there actually
3108 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3109 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3110 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3111 bottomBeam1, carbonFiberLadderStruct);
3112 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3114 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3115 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3116 -length/2+fgkSegmentLength/2, bottomBeamRot1);
3117 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3119 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3120 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3121 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3122 bottomBeam2, carbonFiberLadderStruct);
3123 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3124 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3125 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3126 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3128 //**********************************
3129 //the cooling pipe supports
3130 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3131 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3133 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3134 (triangleHeight+triangleCPaxeDist/
3135 TMath::Sin(halfTheta)-coolPipeSuppH);
3137 if (fAddCoolingSyst) {
3138 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3139 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3140 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3141 -fgkLadderHeight/2.+ tDY +
3142 coolPipeSuppH+fgkLadderBeamRadius,
3143 -length/2., rotCPS1);
3144 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3145 -fgkLadderHeight/2.+ tDY +
3146 coolPipeSuppH+fgkLadderBeamRadius,
3147 -length/2., rotCPS2);
3149 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3150 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3153 //**********************************
3154 //--- The stesalite foot of the ladder
3156 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3157 - fgkLadFootY/2+fgkLadFingerPrintY;
3159 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3160 virtualEnd->AddNode(fLadderFoot, 1, footTr);
3162 //=====================================
3165 if (fAddCoolingSyst) {
3167 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3168 -fgkLadderHeight/2.+ tDY +
3169 coolPipeSuppH + fgkLadderBeamRadius,
3170 -length/2.+coolPipeEndLen/2.);
3171 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3172 -fgkLadderHeight/2. + tDY +
3173 fgkLadderBeamRadius + coolPipeSuppH,
3174 -length/2.+coolPipeEndLen/2.);
3176 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3177 fgkCoolPipeOuterDiam/2,
3179 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3182 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3183 coolingPipeShape, phynoxSDD );
3184 coolingPipe->SetLineColor(fColorPhynox);
3185 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3188 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3189 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3191 virtualEnd->AddNode(cooler, 1, pipeTr1);
3192 virtualEnd->AddNode(cooler, 2, pipeTr2);
3196 //=====================================
3197 //--- HV cable guide
3200 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3201 fgkHVguideY1/2,fgkHVguideZ1/2);
3202 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite); // material ?
3204 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3205 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3206 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3207 virtualEnd->AddNode(guideHV, 1, guideHVtr);
3209 //=====================================
3211 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3212 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3213 -fgkLadderHeight/2.+ tDY +
3214 coolPipeSuppH+fgkLadderBeamRadius,
3215 -length/2.+coolPipeEndLen+raccordFullLen/2);
3216 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3217 -fgkLadderHeight/2.+ tDY +
3218 coolPipeSuppH+fgkLadderBeamRadius,
3219 -length/2.+coolPipeEndLen+raccordFullLen/2);
3221 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3222 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3224 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3229 //________________________________________________________________________
3230 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3232 //--- The stesalite foot of the ladder
3234 // The 2 screw holes on the left part
3235 // the small holes at each corner of the ruby cage (diam 2mm)
3236 // the really small level difference of 0.3mm on the bottom
3239 TGeoMedium *stesalite = GetMedium("EPOXY$"); /// To code ??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3241 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3243 Double_t epsilon = 2e-10;
3244 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3246 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3247 fgkLadFootX/2-fgkLadBox1X/2,0,0);
3248 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3249 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3251 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3252 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3253 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3256 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3257 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3259 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3260 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3261 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3263 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3264 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3265 rubyScrewHoleLen/2);
3267 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3268 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3269 fgkLadFootX/2-rubyScrewHoleLen/2,
3270 -fgkRubyScrewShiftToCenterY, 0, rot9090);
3272 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3273 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3276 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3277 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3278 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3280 ladFootBox1Tr->RegisterYourself();
3281 ladFingerPrintTr->RegisterYourself();
3282 rubyCageHoleTr->RegisterYourself();
3283 rubyScrewHoleTr->RegisterYourself();
3284 rubyHoleTr->RegisterYourself();
3286 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3287 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3288 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3289 "+rubyHole:rubyHoleTr)");
3290 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3291 footRightPart,stesalite);
3292 vFootRightPart->SetLineColor(fColorStesalite);
3294 virtualFoot->AddNode(vFootRightPart, 1, 0);
3297 //--- This was the right part of the foot, now let's do the middle
3298 //--- and the right parts
3300 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3301 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3303 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3304 fgkLadFootX/2-fgkLadBox1X-middleX/2,
3305 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3307 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3308 vFootMiddle->SetLineColor(fColorStesalite);
3309 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3312 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3313 (fgkLadFootY-fgkLadFingerPrintY)/2,
3315 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3316 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3317 -fgkLadFingerPrintY/2, 0);
3318 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3320 vFootLeftLadFinger->SetLineColor(fColorStesalite);
3321 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3324 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3327 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3328 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3330 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3331 vFootLeft->SetLineColor(fColorStesalite);
3332 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3334 if(GetDebug(3)){ // Remove compiler warning.
3335 ladFingerPrint->InspectShape();
3336 ladFootBox1->InspectShape();
3337 rubyCageHole->InspectShape();
3338 rubyScrewHole->InspectShape();
3339 rubyHole->InspectShape();
3345 //________________________________________________________________________
3346 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3348 // return an assembly containing the CARLOS end-ladder board
3349 // and the heat bridge
3353 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3354 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3355 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3356 TGeoMedium *copper = GetMedium("COPPER$");
3357 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3358 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3360 //=========================================
3361 // cooling support of the Carlos card (HeatBridge):
3362 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3364 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3366 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3368 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3369 supCarlosBoard1, alCu12SDD);
3370 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3371 supCarlosBoard2, alCu12SDD);
3372 vSupCarlosBoard1->SetLineColor(4);
3373 vSupCarlosBoard2->SetLineColor(4);
3376 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3377 // shift of the main planes in the direction of their width
3378 // the center is fixed at the center of the 2 small fixing arms on each sides.
3381 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3382 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3383 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3384 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3386 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3387 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3390 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3394 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3395 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3397 //=========================================
3398 // fixing arm of the cooling support :
3399 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3401 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3402 supCarlosBoard3, alCu12SDD);
3403 vSupCarlosBoard3->SetLineColor(4);
3406 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3408 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3409 littleScrew, stainless);
3410 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3411 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3412 fgkLittleScrewHeadR-0.07, rotScrew);
3413 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3414 fgkLittleScrewHeadR+0.07, rotScrew);
3415 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3416 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3418 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3419 0, fgkCarlosSuppAngle, 0);
3420 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3421 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3422 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3423 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3424 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3425 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3428 //=========================================
3429 // screws fixing the board on the U tube
3430 Double_t aaa = fgkCarlosSuppY3; // ???
3431 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3432 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3433 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3434 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3435 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3436 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3438 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3440 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3441 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3442 screw1y,screw1z, CarlosSuppRot);
3444 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3445 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3446 screw1z,screw1y, CarlosSuppRot);
3448 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3449 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3450 screw1y,screw1z, CarlosSuppRot);
3452 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3453 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3454 screw1z,screw1y, CarlosSuppRot);
3456 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3457 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3458 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3459 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3461 //=========================================
3463 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3464 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3465 card1.SetNLayers(2);
3466 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3467 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3468 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3469 p1[0] = -fgkCarlosCardX1/2;
3470 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3471 p1[2] = fgkCarlosCardShift;
3472 p2[0] = fgkCarlosCardX1/2;
3473 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3474 p2[2] = fgkCarlosCardShift;
3475 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3476 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3477 card1.CreateAndInsertBoxCableSegment(1,90);
3479 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3480 card2.SetNLayers(2);
3481 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3482 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3483 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3485 p1[0] = -fgkCarlosCardX1/2;
3486 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3487 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3489 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3490 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3491 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3492 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3493 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3494 card2.CreateAndInsertBoxCableSegment(1,90);
3496 //=========================================
3497 // some chips on the board
3499 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3501 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3502 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3503 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3505 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3506 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3507 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3509 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3510 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3511 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3512 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3513 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3514 u1.CreateAndInsertBoxCableSegment(1,90);
3517 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3519 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3520 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3521 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3523 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3524 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3525 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3527 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3528 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3529 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3530 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3531 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3532 u2.CreateAndInsertBoxCableSegment(1,90);
3535 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3537 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3538 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3539 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3541 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3542 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3544 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3546 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3548 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3549 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3550 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3551 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3553 //--- U4 is like U3 (?)
3554 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3555 u4Trans->RotateX(90);
3556 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3557 fgkCarlosCardShift + fgkCarlosU4posZ);
3558 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3561 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3563 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3564 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3565 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3567 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3568 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3569 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3571 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3572 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3573 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3574 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3575 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3576 u17.CreateAndInsertBoxCableSegment(1,90);
3579 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3581 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3582 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3583 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3585 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3586 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3587 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3589 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3590 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3591 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3592 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3593 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3594 u35.CreateAndInsertBoxCableSegment(1,90);
3597 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3599 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3600 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3601 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3603 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3604 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3605 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3607 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3608 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3609 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3610 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3611 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3612 u36.CreateAndInsertBoxCableSegment(1,90);
3615 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3617 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3618 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3619 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3621 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3622 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3623 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3625 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3626 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3627 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3628 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3629 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3630 qz1.CreateAndInsertBoxCableSegment(1,90);
3632 return assemblySupCarlos;
3635 //________________________________________________________________________
3636 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3638 // Creates the assemblies containing the LV cards (left and right)
3641 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3642 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3643 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3644 TGeoMedium *copper = GetMedium("COPPER$");
3645 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3646 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3648 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3649 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3651 // we are going to use flat cable class to create multilayer box,
3652 // then we can use the pointers to created volumes to place them elsewhere
3653 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3655 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3656 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3657 cardLV.SetNLayers(2);
3658 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3659 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3660 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3662 p1[1] = fgkLVcardY/2;
3665 p2[1] = fgkLVcardY/2;
3667 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3668 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3669 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3670 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3671 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3672 fCardLVR->AddNode(boxVol, 1, trCard);
3674 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3675 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3676 chipO.SetNLayers(2);
3677 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3678 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3679 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3680 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3681 p1[1] = fgkLVChip0PosY;
3682 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3684 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3685 p2[1] = fgkLVChip0PosY;
3686 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3687 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3688 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3689 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3690 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3692 carLVfullThick/2+chip0fullThick/2, rotAdd);
3693 fCardLVR->AddNode(boxVol, 1, trCard);
3695 // put also this chip on the other side of the card
3696 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3698 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3699 fCardLVL->AddNode(boxVol, 2, trCard);
3700 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3702 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3703 fCardLVR->AddNode(boxVol, 2, trCard);
3705 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3706 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3707 chip1.SetNLayers(2);
3708 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3709 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3710 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3711 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3712 p1[1] = fgkLVChip1PosY;
3713 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3715 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3716 p2[1] = fgkLVChip1PosY;
3717 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3718 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3719 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3720 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3721 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3723 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3724 fCardLVR->AddNode(boxVol, 1, trCard);
3726 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3727 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3728 chip2.SetNLayers(2);
3729 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3730 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3731 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3732 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3733 p1[1] = fgkLVChip2PosY;
3734 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3735 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3736 p2[1] = fgkLVChip2PosY;
3737 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3738 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3739 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3740 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3741 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3743 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3744 fCardLVR->AddNode(boxVol, 1, trCard);
3746 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3747 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3748 chip3.SetNLayers(2);
3749 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3750 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3751 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3752 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3753 p1[1] = fgkLVChip3PosY;
3754 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3755 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3756 p2[1] = fgkLVChip3PosY;
3757 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3758 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3759 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3760 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3761 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3763 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3764 fCardLVR->AddNode(boxVol, 1, trCard);
3766 // the Al pieces for heat exchange :
3767 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3768 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3770 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3771 (fgkLVcoolX1/2+fgkLVcoolX2),
3772 fgkLVcoolPosY+fgkLVcoolY1/2,
3773 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3774 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3775 (fgkLVcoolX1/2+fgkLVcoolX2),
3776 fgkLVcoolPosY+fgkLVcoolY1/2,
3777 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3779 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3781 vAlLVcooling1->SetLineColor(2);
3784 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3785 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3786 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3788 fgkLVcoolPosY+fgkLVcoolY1/2,
3789 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3790 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3792 fgkLVcoolPosY+fgkLVcoolY1/2,
3793 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3795 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3797 vAlLVcooling2->SetLineColor(2);
3800 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3802 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3803 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3804 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3806 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3808 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3809 vAlLVcooling3->SetLineColor(2);
3811 //=== screw fixing th LV card to the U cooling tube :
3812 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3814 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3815 littleScrew, stainless);
3816 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3818 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3820 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3822 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3823 0, fgkLittleLVScrewHeadR,
3824 fgkLittleScrewHeadH/2);
3825 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3826 littleScrewHead, stainless);
3827 vLittleScrewHead->SetLineColor(kGray);
3828 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3829 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3830 fgkShiftLittleScrewLV,
3832 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3834 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3835 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3836 fgkShiftLittleScrewLV,
3838 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3840 // adding the cooling pieces to the left card
3841 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3842 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3843 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3844 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3845 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3847 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3848 -(fgkLVcoolX1/2+fgkLVcoolX2),
3849 fgkLVcoolPosY+fgkLVcoolY1/2,
3850 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3851 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3852 -(fgkLVcoolX1/2+fgkLVcoolX2),
3853 fgkLVcoolPosY+fgkLVcoolY1/2,
3854 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3855 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3857 fgkLVcoolPosY+fgkLVcoolY1/2,
3858 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3859 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3861 fgkLVcoolPosY+fgkLVcoolY1/2,
3862 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3864 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3866 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3868 // and to the right card
3869 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3870 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3871 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3872 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3873 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3878 //________________________________________________________________________
3879 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3881 // return an assembly containing the HV card
3885 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3886 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3887 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3888 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3889 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3890 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3892 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3894 //====================================
3895 //--- the card itself
3896 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3897 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3898 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3899 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
3901 highVCard->AddNode(vCeramicCard, 1, 0);
3904 //====================================
3908 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
3909 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
3910 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
3913 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
3914 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
3915 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
3917 vCapa1End->SetLineColor(18);// grey silver
3918 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
3919 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3920 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
3921 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3923 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
3924 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
3925 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
3927 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
3928 capa1->AddNode(vCapa1Middle, 1,0);
3929 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
3930 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
3932 highVCard->AddNode(capa1, 1, capa1PosTr);
3935 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
3936 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
3937 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
3940 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
3941 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
3942 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
3944 vCapa2End->SetLineColor(18);// grey silver
3945 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
3946 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
3947 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
3948 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
3950 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
3951 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
3952 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
3954 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
3955 capa2->AddNode(vCapa2Middle, 1,0);
3956 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
3957 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
3959 highVCard->AddNode(capa2, 1, capa2PosTr);
3962 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
3963 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
3964 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
3967 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
3968 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
3969 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
3971 vCapa3End->SetLineColor(18);// grey silver
3973 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
3974 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
3975 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
3976 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
3978 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
3979 capa3->AddNode(vCapa3Middle, 1,0);
3980 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
3981 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
3983 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
3984 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
3985 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3987 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
3988 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
3989 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3991 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
3992 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
3993 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3995 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
3996 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
3997 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3999 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4000 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4001 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4003 highVCard->AddNode(capa3, 1, capa3PosTr1);
4004 highVCard->AddNode(capa3, 2, capa3PosTr2);
4005 highVCard->AddNode(capa3, 3, capa3PosTr3);
4006 highVCard->AddNode(capa3, 4, capa3PosTr4);
4007 highVCard->AddNode(capa3, 5, capa3PosTr5);
4009 //====================================
4010 //--- connexions to LV card
4012 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4013 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4014 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4015 Double_t fgkConnexLVHVx = 3*fgkmm;
4016 Double_t fgkConnexLVHVy1 = 8*fgkmm;
4017 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4019 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4020 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4021 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4022 fgkConnexLVHVdiam1/2,
4023 fgkConnexLVHVdiam2/2,
4024 fgkConnexLVHVlen/2);
4025 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4026 connexLVHVmetal, stainless);
4027 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4028 connexLVHVplastic, plastic);
4029 vConnexLVHVmetal->SetLineColor(10);// white
4030 vConnexLVHVplast->SetLineColor(12); // dark grey
4032 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4033 connexion->AddNode(vConnexLVHVmetal, 1, 0);
4034 connexion->AddNode(vConnexLVHVplast, 1, 0);
4036 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4037 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4038 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4039 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4041 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4042 fgkConnexLVHVy1+fgkConnexLVHVdy,
4043 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4044 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4045 fgkConnexLVHVy1+fgkConnexLVHVdy,
4046 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4048 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4049 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4050 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4051 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4052 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4053 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4055 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4056 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4057 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4058 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4059 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4060 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4062 highVCard->AddNode(connexion, 1, trConnexion1);
4063 highVCard->AddNode(connexion, 2, trConnexion2);
4064 highVCard->AddNode(connexion, 3, trConnexion3);
4065 highVCard->AddNode(connexion, 4, trConnexion4);
4066 highVCard->AddNode(connexion, 5, trConnexion5);
4067 highVCard->AddNode(connexion, 6, trConnexion6);
4068 highVCard->AddNode(connexion, 7, trConnexion7);
4069 highVCard->AddNode(connexion, 8, trConnexion8);
4071 //====================================
4072 //--- cooling pieces
4074 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4075 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4078 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4079 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4081 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4082 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4084 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4086 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4088 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4090 // This last volume contains the screw used for fixing
4091 // the card to the cooling tube ...
4092 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4094 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4095 littleScrewHV, stainless);
4097 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4098 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4100 vCardHVcool1->SetLineColor(2); //red
4101 vCardHVcool2->SetLineColor(2); //red
4102 vCardHVcool3->SetLineColor(2); //red
4104 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4105 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4106 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4107 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4108 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4109 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4110 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4111 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4113 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4114 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4116 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4117 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4118 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4119 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4121 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4122 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4123 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4124 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4126 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4127 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4129 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4130 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4131 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4132 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4134 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4135 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4136 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4137 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4139 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4140 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4142 //====================================
4144 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4145 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4146 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4147 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4149 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4150 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4151 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4152 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4155 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4156 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4162 //________________________________________________________________________
4163 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4165 // return an assembly containing the LV, HV and Carlos cards of one ladder
4166 // and their cooling system
4169 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4170 TGeoMedium *phynoxSDD = GetMedium("AL$"); // phynoxSDD To code !!!!!!!!!!!!!!!!!!!
4171 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4173 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4175 //=*********************************
4176 //--- The rounded pipe for the end ladder card coooling
4178 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4179 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4183 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4184 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4188 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4189 endLadderPipe.SetNLayers(2);
4190 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4191 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4193 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4194 // of the U colling pipe in its center
4196 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4197 Double_t vectA[3] = {0,0,1};
4199 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4200 Double_t vectB[3] = {0,0,1};
4202 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4203 Double_t vectC[3] = {1,0,0};
4205 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4206 Double_t vectD[3] = {-1,0,0};
4208 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4209 Double_t vectE[3] = {0,0,-1};
4211 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4212 Double_t vectF[3] = {0,0,-1};
4214 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4215 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4216 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4217 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4218 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4219 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4221 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4222 //endLadderPipe.CreateAndInsertCableSegment( 1);
4223 endLadderPipe.CreateAndInsertTubeSegment( 1);
4224 //endLadderPipe.CreateAndInsertCableSegment( 2);
4225 endLadderPipe.CreateAndInsertTorusSegment( 2);
4226 //endLadderPipe.CreateAndInsertCableSegment( 3);
4227 endLadderPipe.CreateAndInsertTubeSegment( 3);
4228 //endLadderPipe.CreateAndInsertCableSegment( 4);
4229 endLadderPipe.CreateAndInsertTorusSegment( 4);
4230 //endLadderPipe.CreateAndInsertCableSegment( 5);
4231 endLadderPipe.CreateAndInsertTubeSegment( 5);
4233 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4234 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4235 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4236 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4238 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4239 - fgkEndLadPipeArmBoxDX,
4240 fgkEndLadPipeArmBoxDY,0);
4241 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4242 fgkEndLadPipeArmBoxDX,
4243 fgkEndLadPipeArmBoxDY,0);
4244 endLadPipeArmBoxDY1->RegisterYourself();
4245 endLadPipeArmBoxDY2->RegisterYourself();
4247 if(GetDebug(3)) { // Remove compiler warning.
4248 endLadPipeArmBox->InspectShape();
4249 endLadPipeArmTube->InspectShape();
4252 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4253 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4254 "- endLadPipeArmTube");
4255 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4256 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4257 "- endLadPipeArmTube");
4259 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4260 endLadPipeArm1, alCu12SDD);
4261 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4262 endLadPipeArm2, alCu12SDD);
4263 vEndLadPipeArm1->SetLineColor(2);
4264 vEndLadPipeArm2->SetLineColor(2);
4266 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4267 +fgkEndLadPipeArmZpos);
4269 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4270 -fgkEndLadPipeUwidth/2,0,armZ);
4271 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4272 fgkEndLadPipeUwidth/2,0,armZ);
4274 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4275 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4277 //=*********************************
4279 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4280 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4282 Double_t spaceBetweenCards = 0.2*fgkmm;
4284 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4285 +fgkEndLadPipeArmBoxDX);
4286 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4287 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4289 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4292 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4293 +coolUzPos+1.25*fgkmm;
4294 // Position in z of the first LVB with respect to the start of the cooling
4295 // rectangular arm, coming (from inside of the ladder)
4296 // The cards are added one after the other
4298 for (Int_t iCard=0; iCard<nCards; iCard++) {
4300 Double_t cardLVzShift = firstLVCardZ +
4301 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4303 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4304 cardLVyShift, cardLVzShift);
4305 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4306 cardLVyShift, cardLVzShift);
4308 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4309 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4312 //=*********************************
4314 TGeoVolumeAssembly *cardHV = fCardHV;
4316 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4317 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4319 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4320 -(fgkHVCardCeramZ)/2);
4322 for (Int_t iCard=0; iCard<nCards; iCard++) {
4324 Double_t fact = iCard*2.+1.;
4325 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4326 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4327 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4328 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4331 //=*********************************
4334 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4335 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4336 // 0, -fgkCarlosSuppAngle, 0);
4338 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4339 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4340 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4341 // position in z of the first Carlos board, coming from inside of the ladder
4343 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4344 fgkEndLadPipeArmBoxDY);
4346 for (Int_t iCard=0; iCard<nCards; iCard++) {
4348 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4349 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4350 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4351 (TGeoRotation*) fCommonTr[0]);
4353 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4356 return endLadderCards;
4360 //________________________________________________________________________
4361 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4363 // return an Pcon containing the LV, HV and Carlos cards of one ladder
4364 // and their cooling system
4367 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!
4368 TGeoMedium *phynoxSDD = GetMedium("AL$"); // phynoxSDD To code !!!!!!!!!!!!!!!!!!!
4369 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4370 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4372 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4373 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4375 Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4376 // reference radius corresponding to local y=0
4379 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4380 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4382 rREF = fgkEndLaddCardsShortRadiusLay4;
4385 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4386 +fgkEndLadPipeArmBoxDX);
4387 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4388 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4390 Double_t rMin = rREF + cardLVyShift;
4391 // (The LV card is defining rMin because it is the lower object)
4393 //==================================
4394 //--- The Pcon container
4396 // minimum angle of the Pcon :
4397 Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4398 (rREF-fgkEndLadPipeArmY/2) );
4399 Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4400 Double_t phi0 = 90-dphi/2;
4401 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4402 // of the U colling pipe in its center
4403 Double_t zMax = endLadPipeUlength+coolUzPos;
4404 Double_t rMax = rMin + fgkLVcardY;
4405 rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4407 TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 6);
4408 //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4409 containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rMin, rMax);
4410 containerShape->DefineSection(1, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4411 containerShape->DefineSection(2, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4412 containerShape->DefineSection(3, zMax, rREF-1.*fgkmm, rMax);
4413 // the following is dirty but works ...
4414 containerShape->DefineSection(4, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4415 containerShape->DefineSection(5, zMax+6.*fgkmm, rREF+fgkCarlosCardZ1/2, rMax);
4417 TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4418 endLadderCards->SetVisibility(kFALSE);
4420 //=*********************************
4421 //--- The rounded pipe for the end ladder card cooling
4423 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4424 endLadderPipe.SetNLayers(2);
4425 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4426 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4428 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4429 Double_t vectA[3] = {0,0,1};
4431 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4432 Double_t vectB[3] = {0,0,1};
4434 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4435 Double_t vectC[3] = {1,0,0};
4437 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4438 Double_t vectD[3] = {-1,0,0};
4440 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4441 Double_t vectE[3] = {0,0,-1};
4443 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4444 Double_t vectF[3] = {0,0,-1};
4446 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4447 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4448 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4449 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4450 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4451 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4453 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4454 //endLadderPipe.CreateAndInsertCableSegment( 1);
4455 endLadderPipe.CreateAndInsertTubeSegment( 1);
4456 //endLadderPipe.CreateAndInsertCableSegment( 2);
4457 endLadderPipe.CreateAndInsertTorusSegment( 2);
4458 //endLadderPipe.CreateAndInsertCableSegment( 3);
4459 endLadderPipe.CreateAndInsertTubeSegment( 3);
4460 //endLadderPipe.CreateAndInsertCableSegment( 4);
4461 endLadderPipe.CreateAndInsertTorusSegment( 4);
4462 //endLadderPipe.CreateAndInsertCableSegment( 5);
4463 endLadderPipe.CreateAndInsertTubeSegment( 5);
4465 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4466 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4467 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4468 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4470 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4471 - fgkEndLadPipeArmBoxDX,
4472 fgkEndLadPipeArmBoxDY,0);
4473 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4474 fgkEndLadPipeArmBoxDX,
4475 fgkEndLadPipeArmBoxDY,0);
4476 endLadPipeArmBoxDY1->RegisterYourself();
4477 endLadPipeArmBoxDY2->RegisterYourself();
4479 if(GetDebug(3)) { // Remove compiler warning.
4480 endLadPipeArmBox->InspectShape();
4481 endLadPipeArmTube->InspectShape();
4484 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4485 "endLadPipeArmBox:endLadPipeArmBoxDY1"
4486 "- endLadPipeArmTube");
4487 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4488 "endLadPipeArmBox:endLadPipeArmBoxDY2"
4489 "- endLadPipeArmTube");
4491 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4492 endLadPipeArm1, alCu12SDD);
4493 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4494 endLadPipeArm2, alCu12SDD);
4495 vEndLadPipeArm1->SetLineColor(2);
4496 vEndLadPipeArm2->SetLineColor(2);
4498 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4499 +fgkEndLadPipeArmZpos);
4501 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4502 -fgkEndLadPipeUwidth/2,rREF,armZ);
4503 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4504 fgkEndLadPipeUwidth/2,rREF,armZ);
4506 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4507 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4509 //=*********************************
4511 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4512 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4514 Double_t spaceBetweenCards = 0.2*fgkmm;
4517 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4520 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4521 +coolUzPos+1.25*fgkmm;
4522 // Position in z of the first LVB with respect to the start of the cooling
4523 // rectangular arm, coming (from inside of the ladder)
4524 // The cards are added one after the other
4526 for (Int_t iCard=0; iCard<nCards; iCard++) {
4528 Double_t cardLVzShift = firstLVCardZ +
4529 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4531 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4532 cardLVyShift+rREF, cardLVzShift);
4533 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4534 cardLVyShift+rREF, cardLVzShift);
4536 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4537 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4540 //=*********************************
4542 TGeoVolumeAssembly *cardHV = fCardHV;
4544 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4545 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4546 // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4548 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4549 -(fgkHVCardCeramZ)/2);
4551 for (Int_t iCard=0; iCard<nCards; iCard++) {
4553 Double_t fact = iCard*2.+1.;
4554 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4555 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4556 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4557 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4560 //=*********************************
4563 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4564 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4565 // 0, -fgkCarlosSuppAngle, 0);
4567 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4568 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4569 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4570 // position in z of the first Carlos board, coming from inside of the ladder
4572 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4573 fgkEndLadPipeArmBoxDY);
4575 for (Int_t iCard=0; iCard<nCards; iCard++) {
4577 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4578 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4579 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4580 (TGeoRotation*) fCommonTr[0]);
4582 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4585 return endLadderCards;
4588 //________________________________________________________________________
4589 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4591 // return an assembly of the support rings, attaching the ladders to the cone
4597 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4598 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4601 //**********************************
4604 Double_t fgkRubyCageX = 9*fgkmm;
4605 Double_t fgkRubyCageY = 5.5*fgkmm;
4606 Double_t fgkRubyCageZ = 8*fgkmm;
4607 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4608 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4609 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4610 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4611 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4613 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4616 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4618 // pieces common to both square and V cages
4619 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4620 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4622 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4623 fgkRubyCageHoleDX/2+epsilon);
4625 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4626 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4627 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4628 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4629 trScrewHole->RegisterYourself();
4631 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4632 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4633 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4634 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4635 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4636 trScrewHoleFoot->RegisterYourself();
4639 // pieces which differ
4640 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4642 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4643 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4645 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4646 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4647 trRubyCageVInternBox->RegisterYourself();
4649 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4650 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4651 fgkRubyCageInternSide/4);
4653 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4654 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4655 +epsilon,0,0, rotV );
4656 trRubyCageVInternTriangl->RegisterYourself();
4659 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4660 "rubyCageBox-(rubyCageInternBox"
4661 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4663 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4664 rubyCageSquare, stainless);
4665 vRubyCageSquare->SetLineColor(10);
4667 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4668 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4669 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4670 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4671 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4672 vRubyCageV->SetLineColor(10);
4674 if(GetDebug(3)) { // Remove compiler warning.
4675 rubyCageBox->InspectShape();
4676 rubyCageInternBox->InspectShape();
4677 screwHole->InspectShape();
4678 screwHoleFoot->InspectShape();
4679 rubyCageVInternBox->InspectShape();
4680 rubyCageVInternTriangl->InspectShape();
4683 supportRing->AddNode(vRubyCageSquare, 0, 0);
4684 //supportRing->AddNode(vRubyCageV, 0, 0);
4690 //________________________________________________________________________
4691 void AliITSv11GeometrySDD::CreateSDDsensor() {
4693 // return a box containing the SDD sensor
4696 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4697 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4698 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4699 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4700 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4701 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4704 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4705 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4706 // width : in the beam direction !
4708 Double_t sensoxBoxLength = ( fgkWaferLength +
4709 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4710 // Makes life easier to include the space for the WA HV cable on both sides
4711 Double_t sensoxBoxThick = fgkWaferThickness +
4712 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4714 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4715 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4717 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4718 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4720 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4721 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4724 //****************************
4726 //****************************
4728 // we need 2 different sensor objects, because they have to have different names
4729 // This is required for the step manager
4731 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4732 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4735 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4736 wafer3->SetLineColor(fColorSilicon);
4737 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4738 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4739 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4740 sensVol3->SetLineColor(fColorSilicon+5);
4741 wafer3->AddNode(sensVol3, 1, 0);
4742 fSDDsensor3->AddNode(wafer3, 1, 0);
4744 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4745 wafer4->SetLineColor(fColorSilicon);
4746 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4747 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4748 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4749 sensVol4->SetLineColor(fColorSilicon+5);
4750 wafer4->AddNode(sensVol4, 1, 0);
4751 fSDDsensor4->AddNode(wafer4, 1, 0);
4754 //****************************
4756 //****************************
4757 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4758 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4759 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4760 vGlass->SetLineColor(fColorGlass);
4761 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4762 fgkWaferThickness/2+fgkSensorGlassLY/2,
4763 fgkGlassDZOnSensor);
4764 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4765 fgkWaferThickness/2+fgkSensorGlassLY/2,
4766 fgkGlassDZOnSensor);
4767 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4768 fgkWaferThickness/2+fgkSensorGlassLY/2,
4769 -fgkGlassDZOnSensor);
4770 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4771 fgkWaferThickness/2+fgkSensorGlassLY/2,
4772 -fgkGlassDZOnSensor);
4773 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4774 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4775 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4776 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4778 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4779 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4780 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4781 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4783 //****************************
4784 // Wrap-around cable
4785 //****************************
4787 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4788 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4789 waHVCable.SetNLayers(2);
4790 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4791 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4792 waHVCable.SetInitialNode(fSDDsensor3);
4794 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4795 x1[0] = -fgkWaHVcableLength/2;
4797 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4799 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4802 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4803 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4804 TGeoCombiTrans *ctSegment = 0;
4805 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4806 fSDDsensor4->AddNode(segment, 1, ctSegment);
4810 waHVCable.SetName("ITSsddWaHVCableD");
4811 waHVCable.ResetPoints();
4812 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4813 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4814 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4815 fSDDsensor4->AddNode(segment, 1, ctSegment);
4817 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4819 waHVCableFold.SetPhi(180,360);
4820 waHVCableFold.SetNLayers(2);
4821 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4822 polyhamideSDD, fColorPolyhamide);
4823 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4824 waHVCableFold.SetInitialNode(fSDDsensor3);
4827 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4829 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4830 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4831 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4832 fSDDsensor4->AddNode(segment, 1, ctSegment);
4835 //****************************
4837 //****************************
4838 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4839 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4840 /(2.*fgkTransitHVHeadLZ);
4841 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4842 headRadius-fgkTransitHVHeadLZ)
4845 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
4846 fgkTransitHVPolyThick/2,
4848 headPoly->SetName("headPoly");
4849 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
4850 -fgkTransitHVPolyThick/2);
4851 headPolyTr->SetName("headPolyTr");
4852 headPolyTr->RegisterYourself();
4854 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
4855 fgkTransitHVAlThick/2,
4857 headAl->SetName("headAl");
4858 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
4859 -fgkTransitHVPolyThick
4860 -fgkTransitHVAlThick/2);
4861 headAlTr->SetName("headAlTr");
4862 headAlTr->RegisterYourself();
4864 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
4865 (headRadius-fgkTransitHVHeadLZ)/2,
4866 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
4867 cache->SetName("cache");
4869 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
4870 (headRadius-fgkTransitHVHeadLZ)/2,
4871 -(fgkTransitHVPolyThick
4872 +fgkTransitHVAlThick)/2);
4873 headCacheTr->SetName("cacheTr");
4874 headCacheTr->RegisterYourself();
4876 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
4877 "headPoly:headPolyTr-cache:cacheTr");
4878 TGeoVolume *vHeadPolyComp = new TGeoVolume(
4879 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
4880 vHeadPolyComp->SetLineColor(fColorPolyhamide);
4881 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
4882 "headAl:headAlTr-cache:cacheTr");
4883 TGeoVolume *vHeadAlComp = new TGeoVolume(
4884 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
4885 vHeadAlComp->SetLineColor(fColorAl);
4888 // TGeoRotation rotHead("",0,90,0);
4889 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
4890 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
4892 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
4893 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
4894 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
4897 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
4898 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
4899 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
4900 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
4903 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
4904 fgkTransitHVBondingLZ,
4905 fgkTransitHVPolyThick+fgkTransitHVAlThick);
4906 transitHVCable.SetNLayers(2);
4907 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
4909 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
4910 transitHVCable.SetInitialNode(fSDDsensor3);
4912 x1[0] = -fgkTransitHVHeadLX/2;
4914 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
4918 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4919 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4920 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
4921 fSDDsensor4->AddNode(segment, 1, ctSegment);
4923 transitHVCable.ResetPoints();
4924 transitHVCable.SetName("ITSsddHVtransitTail");
4925 transitHVCable.SetWidth(fgkTransitHVtailWidth);
4926 x1[0] = fgkTransitHVtailXpos;
4927 x2[0] = fgkTransitHVtailXpos;
4928 x1[2] = -fgkTransitHVBondingLZ/2;
4929 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
4930 Double_t vZ[3] = {0,0,1};
4931 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
4932 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
4933 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
4934 fSDDsensor4->AddNode(segment, 1, ctSegment);
4937 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
4938 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4939 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4940 fgkTransitHVsideLZ);
4941 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4942 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
4943 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4944 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4945 fgkTransitHVsideLZ);
4946 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4947 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
4949 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
4950 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4951 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4952 fgkTransitHVsideLZ);
4953 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4954 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
4955 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4956 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4957 fgkTransitHVsideLZ);
4958 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4959 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
4961 // sideRight is not there actually
4962 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
4963 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
4964 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
4965 // fgkTransitHVsideLZ);
4966 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
4967 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
4968 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
4969 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
4970 // fgkTransitHVsideLZ);
4971 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
4972 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
4974 // TGeoRotation rotSide("",0,-90,0);
4975 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
4976 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4977 // -fgkTransitHVBondingLZ/2,&rotSide);
4978 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
4979 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4980 // -fgkTransitHVBondingLZ/2, &rotSide);
4981 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
4982 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
4983 // -fgkTransitHVBondingLZ/2, &rotSide);
4984 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
4985 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
4986 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4987 // -fgkTransitHVBondingLZ/2,rotSide);
4988 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
4989 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4990 -fgkTransitHVBondingLZ/2, rotSide);
4991 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
4992 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
4993 -fgkTransitHVBondingLZ/2, rotSide);
4995 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
4996 sideLeft,polyhamideSDD);
4997 vSideLeft->SetLineColor(fColorPolyhamide);
4998 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5000 vSideLeftAl->SetLineColor(fColorAl);
5002 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5003 // sideRight,polyhamideSDD);
5004 // vSideRight->SetLineColor(fColorPolyhamide);
5006 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5007 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5008 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5010 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5011 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5012 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5015 //****************************
5017 fSDDsensor3->CheckOverlaps(0.01);
5018 fSDDsensor4->CheckOverlaps(0.01);
5021 fSDDsensor3->SetVisibility(kFALSE);
5022 fSDDsensor4->SetVisibility(kFALSE);
5026 //________________________________________________________________________
5027 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5029 // return a box volume containing the detectors
5032 TGeoMedium *airSDD = GetMedium("SDD AIR$");
5034 Int_t nDetectors = fgkLay3Ndet;
5035 Double_t ladderLength = fgkLay3LadderLength;
5036 Double_t *sensorZPos = fLay3sensorZPos;
5040 nDetectors = fgkLay4Ndet;
5041 ladderLength = fgkLay4LadderLength;
5042 sensorZPos = fLay4sensorZPos;
5044 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5048 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5049 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5051 sprintf(name,"ITSsddDetBox%i",iLay);
5052 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5053 ladderLength*((nDetectors-0.5)/nDetectors)/2);
5054 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5056 for (Int_t i=0; i<nDetectors; i++) {
5057 Double_t localZ = sensorZPos[i];
5058 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5059 if (iLay==3) if (i%2!=0) localY = -localY;
5060 if (iLay==4) if (i%2==0) localY = -localY;
5061 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5063 if (i >= nDetectors/2) {
5064 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5065 sensorPos->SetName(name);
5066 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5069 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5070 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5072 sensorPos->SetName(name);
5073 virtualDet->AddNode(fSDDsensor, i, sensorPos);
5077 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5078 virtualDet->SetVisibility(kFALSE);
5083 //________________________________________________________________________
5084 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5086 // return a box volume containing the detectors
5089 Int_t nDetectors = fgkLay3Ndet;
5090 Double_t ladderLength = fgkLay3LadderLength;
5091 Double_t *sensorZPos = fLay3sensorZPos;
5092 TGeoVolume *sensorSDD = fSDDsensor3;
5096 nDetectors = fgkLay4Ndet;
5097 ladderLength = fgkLay4LadderLength;
5098 sensorZPos = fLay4sensorZPos;
5099 sensorSDD = fSDDsensor4;
5101 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5105 sprintf(name,"ITSsddDetBox%i",iLay);
5107 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5109 for (Int_t i=0; i<nDetectors; i++) {
5110 Double_t localZ = sensorZPos[i];
5111 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5112 if (iLay==3) if (i%2!=0) localY = -localY;
5113 if (iLay==4) if (i%2==0) localY = -localY;
5114 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5116 if (i >= nDetectors/2) {
5117 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5118 sensorPos->SetName(name);
5119 virtualDet->AddNode(sensorSDD, i, sensorPos);
5122 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5123 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5125 sensorPos->SetName(name);
5126 virtualDet->AddNode(sensorSDD, i, sensorPos);
5130 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5135 //________________________________________________________________________
5136 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
5139 // export the geometry in a AliITSgeom object
5144 printf("error:Try to fill null (AliITSgeom *) object");
5148 printf("error:Try to set sensor geometry while geometry is not defined\n");
5152 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
5153 fgkWaferLengthSens/2.};
5154 if(!(geom->IsShapeDefined(kSDD)))
5155 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
5158 char ladderName[30];
5159 char sensorName[30];
5160 char senstivName[30];
5161 const Int_t kNLay = 2;
5162 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
5163 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
5166 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
5168 Int_t firstSDDmod = startMod;
5169 for (Int_t iLay=0; iLay<kNLay; iLay++) {
5170 /////////////////////////////////////////
5171 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
5172 TGeoNode *layNode = fMotherVol->GetNode(layerName);
5174 if (GetDebug(1)) printf("%s\n",layNode->GetName());
5175 TGeoVolume *layVolume = layNode->GetVolume();
5176 TGeoHMatrix layMatrix(*layNode->GetMatrix());
5178 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
5179 /////////////////////////////////////////
5180 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
5181 TGeoNode *laddNode = layVolume->GetNode(ladderName);
5183 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
5184 TGeoVolume *laddVolume = laddNode->GetVolume();
5185 TGeoHMatrix laddMatrix(layMatrix);
5186 laddMatrix.Multiply(laddNode->GetMatrix());
5188 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
5189 /////////////////////////////////////////
5190 sprintf(sensorName, "ITSsddSensor_%i",iDet);
5191 TGeoNode *detNode = laddVolume->GetNode(sensorName);
5193 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
5194 TGeoVolume *detVolume = detNode->GetVolume();
5195 TGeoHMatrix detMatrix(laddMatrix);
5196 detMatrix.Multiply(detNode->GetMatrix());
5198 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
5200 TGeoVolume *wafVolume = wafNode->GetVolume();
5201 TGeoHMatrix wafMatrix(detMatrix);
5202 detMatrix.Multiply(wafNode->GetMatrix());
5203 //--------------------------------------------------------
5204 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
5205 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
5207 TGeoHMatrix sensMatrix(wafMatrix);
5208 sensMatrix.Multiply(sensitivNode->GetMatrix());
5210 // Sticking to the convention for local wafer coordinate
5212 if (iDet >= kNDet[iLay]/2) {
5213 // TGeoRotation rotY("",0,180,0);
5214 TGeoRotation rotY("",-180,-180,0);
5215 sensMatrix.Multiply(&rotY);
5217 // Creating the matrix in AliITSgeom for
5218 // this sensitive volume :
5219 Double_t *trans = sensMatrix.GetTranslation();
5220 Double_t *r = sensMatrix.GetRotationMatrix();
5221 Double_t rot[10] = {r[0],r[1],r[2],
5223 r[6],r[7],r[8], 1.0};
5224 //rot[9]!=0.0 => not a unity matrix
5225 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
5227 // iLadd+1, iDet+1 because ladd. and det. start at +1
5232 printf("Error (ExportSensorGeometry) %s not found !\n",
5235 printf("Error (ExportSensorGeometry) %s not found !\n",
5238 printf("Error (ExportSensorGeometry) %s not found !\n",
5242 printf("Error (ExportSensorGeometry) %s not found !\n",
5246 printf("Error (ExportSensorGeometry) %s not found !\n",
5250 return (startMod-firstSDDmod);
5254 //________________________________________________________________________
5255 Int_t AliITSv11GeometrySDD::
5256 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5258 // Function which gives the layer, ladder and det.
5259 // index of the current volume. To be used in
5260 // AliITS::StepManager()
5263 if (gGeoManager->GetLevel()<3) return kFALSE;
5264 // Get the det index :
5265 TGeoNode *node = gGeoManager->GetMother(2);
5266 if (!node) return kFALSE;
5267 det = node->GetNumber()+1;
5269 // Get the ladder index :
5270 node = gGeoManager->GetMother(3);
5271 if (!node) return kFALSE;
5272 ladd = node->GetNumber()+1;
5274 // Get the layer index :
5275 if (node->GetNdaughters()==fgkLay3Ndet)
5276 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!