Line data Source code
1 : /**************************************************************************
2 : * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 : * *
4 : * Author: The ALICE Off-line Project. *
5 : * Contributors are mentioned in the code where appropriate. *
6 : * *
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 : **************************************************************************/
15 :
16 :
17 : //*************************************************************************
18 : //
19 : // SDD geometry, based on ROOT geometrical modeler
20 : //
21 : //
22 : // This geometry has no dependence with aliroot, you can run it with root
23 : // only, provided that the AliITSv11GeomCable classes are also compiled
24 : //
25 : // Ludovic Gaudichet gaudichet@to.infn.it
26 : //*************************************************************************
27 :
28 :
29 : // $Id$
30 :
31 :
32 : // General Root includes
33 : #include <Riostream.h>
34 : #include <TMath.h>
35 :
36 : // Root Geometry includes
37 : #include <TGeoManager.h>
38 : #include <TGeoVolume.h>
39 : #include <TGeoCone.h>
40 : #include <TGeoTube.h>
41 : #include <TGeoTrd1.h>
42 : #include <TGeoArb8.h>
43 : #include <TGeoXtru.h>
44 : #include <TGeoCompositeShape.h>
45 : #include <TGeoMatrix.h>
46 : #include <TGeoNode.h>
47 : #include <TGeoPcon.h>
48 : #include <TGeoTorus.h>
49 :
50 : #include "AliITSv11GeometrySDD.h"
51 : #include "AliITSv11GeomCableFlat.h"
52 : #include "AliITSv11GeomCableRound.h"
53 :
54 : const char* AliITSv11GeometrySDD::fgkSDDsensitiveVolName3 = "ITSsddSensitivL3";
55 : const char* AliITSv11GeometrySDD::fgkSDDsensitiveVolName4 = "ITSsddSensitivL4";
56 116 : const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.21*2*fgkmm;
57 116 : const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm;
58 116 : const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm;
59 116 : const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 7.5*fgkmm;
60 116 : const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 7.1*fgkmm;
61 :
62 116 : const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
63 116 : const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
64 116 : const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
65 116 : const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
66 116 : const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
67 116 : const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
68 :
69 : const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
70 : const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
71 :
72 116 : const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
73 116 : const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
74 116 : const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
75 116 : const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
76 116 : const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
77 116 : const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
78 116 : const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
79 : const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
80 116 : const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
81 116 : const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
82 116 : const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
83 :
84 : // parameters from ALR-0752/3
85 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
86 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
87 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
88 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
89 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
90 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
91 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
92 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
93 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
94 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
95 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
96 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
97 :
98 116 : const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
99 116 : const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
100 116 : const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
101 116 : const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
102 116 : const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 2.2*fgkmm;
103 116 : const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
104 116 : const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
105 116 : const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
106 116 : const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
107 116 : const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
108 116 : const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
109 :
110 116 : const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 129.*fgkmm;
111 116 : const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 205.*fgkmm;
112 116 : const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
113 116 : const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
114 116 : const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
115 116 : const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
116 116 : const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
117 : const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
118 : const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
119 116 : const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
120 :
121 116 : const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 220.*fgkmm;
122 116 : const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 291.*fgkmm;
123 116 : const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
124 116 : const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
125 116 : const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
126 116 : const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
127 116 : const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
128 : const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
129 : const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
130 116 : const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
131 :
132 116 : const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay3 = fgkLay3DetShortRadius;
133 116 : const Double_t AliITSv11GeometrySDD::fgkEndLaddCardsShortRadiusLay4 = fgkLay4DetShortRadius;
134 116 : const Double_t AliITSv11GeometrySDD::fgkDistEndLaddCardsLadd = 0.*fgkmm;
135 :
136 : //hybrid
137 : const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 48.5; // approx !!!
138 : // Origine taken at the hybrid corner :
139 116 : const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
140 116 : const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
141 116 : const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
142 116 : const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
143 116 : const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
144 :
145 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
146 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
147 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
148 : // center of ships to the border
149 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
150 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
151 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
152 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
153 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
154 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
155 116 : const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
156 116 : const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
157 116 : const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
158 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
159 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
160 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
161 116 : const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
162 :
163 116 : const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorLen = 9.500*fgkmm;
164 116 : const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorWid = 1.490*fgkcm; //???
165 : const Double_t AliITSv11GeometrySDD::fgkHybCC2SensorAng = 15.0;
166 :
167 116 : const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
168 116 : const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
169 116 : const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
170 116 : const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
171 116 : const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
172 116 : const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
173 116 : const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
174 116 : const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
175 116 : const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
176 116 : const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
177 116 : const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
178 116 : const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
179 : const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
180 : const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
181 1276 : {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
182 290 : 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
183 348 : 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
184 290 : 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
185 290 : 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
186 : const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
187 1276 : { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
188 290 : 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
189 348 : 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
190 290 : 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
191 290 : 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
192 116 : const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
193 116 : const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
194 116 : const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
195 116 : const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
196 116 : const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
197 :
198 116 : const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
199 116 : const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
200 116 : const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
201 116 : const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
202 116 : const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
203 : // 256 anodes times 294 microns of pitch
204 116 : const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 256*294*fgkmicron;
205 :
206 116 : const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
207 116 : const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
208 116 : const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
209 :
210 116 : const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
211 116 : const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
212 116 : const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
213 116 : const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
214 116 : const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
215 :
216 116 : const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
217 116 : const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
218 116 : const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
219 116 : const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
220 116 : const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
221 :
222 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
223 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
224 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
225 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
226 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
227 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
228 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
229 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
230 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
231 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
232 116 : const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
233 :
234 116 : const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
235 116 : const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
236 116 : const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
237 :
238 116 : const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
239 116 : const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
240 116 : const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
241 :
242 : // the stesalite ladder foot at its end
243 116 : const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
244 116 : const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
245 116 : const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
246 116 : const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
247 116 : const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
248 116 : const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
249 116 : const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
250 116 : const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
251 116 : const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
252 116 : const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
253 116 : const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
254 116 : const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
255 116 : const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
256 :
257 : const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
258 : const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
259 :
260 : // the U cooling pipe and its heat exchanger in end-ladder cards system
261 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
262 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
263 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
264 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
265 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
266 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
267 : //--- The al body of the cooling syst.of the heat exchanger :
268 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
269 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
270 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
271 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
272 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
273 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm;// shift in X of the arms from the axis
274 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
275 :
276 : // LV card :
277 116 : const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
278 116 : const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
279 116 : const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
280 116 : const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
281 :
282 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
283 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
284 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
285 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
286 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
287 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
288 :
289 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
290 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
291 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
292 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
293 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
294 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
295 :
296 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
297 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
298 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
299 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
300 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
301 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
302 :
303 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
304 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
305 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
306 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
307 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
308 116 : const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
309 :
310 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
311 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
312 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
313 :
314 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
315 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
316 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
317 :
318 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
319 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
320 116 : const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
321 :
322 : // HV card :
323 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
324 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
325 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
326 :
327 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
328 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
329 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
330 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
331 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
332 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
333 :
334 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
335 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
336 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
337 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
338 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
339 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
340 :
341 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
342 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
343 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
344 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
345 :
346 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
347 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
348 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
349 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
350 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
351 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
352 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
353 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
354 :
355 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
356 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
357 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
358 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
359 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
360 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
361 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
362 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
363 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
364 116 : const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
365 :
366 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
367 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
368 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
369 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
370 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
371 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
372 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
373 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
374 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
375 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
376 :
377 : // screws fixing boards to the end-ladder on the U tube
378 116 : const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
379 116 : const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
380 116 : const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
381 116 : const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
382 116 : const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
383 :
384 : // CARLOS board
385 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
386 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
387 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
388 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
389 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
390 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
391 :
392 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
393 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
394 :
395 : // size and position of various chips on carlos end-ladder board
396 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
397 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
398 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
399 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
400 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
401 :
402 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
403 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
404 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
405 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
406 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
407 :
408 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
409 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
410 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
411 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
412 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
413 :
414 : // U4 like U3
415 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
416 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
417 :
418 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
419 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
420 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
421 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
422 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
423 :
424 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
425 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
426 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
427 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
428 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
429 :
430 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
431 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
432 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
433 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
434 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
435 :
436 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
437 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
438 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
439 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
440 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
441 :
442 : // distance from the heat bridge center to the card center :
443 116 : const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
444 :
445 : // some pieces at the end of the carbon fiber ladder
446 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
447 116 : const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
448 116 : const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
449 116 : const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
450 116 : const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
451 116 : const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
452 116 : const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
453 116 : const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
454 :
455 : // Cooling connector between phynox and plastic cooling water tubes
456 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
457 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
458 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
459 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
460 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
461 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
462 116 : const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
463 :
464 :
465 : // parameters for coding SDD cables on SDD and SSD cones
466 : const Double_t AliITSv11GeometrySDD::fgkSectionCuPerMod = 3*2*0.006 + 3*2*0.0005 + 2*0.002;
467 : // copper : LV + signal + HV(HV ???)
468 174 : const Double_t AliITSv11GeometrySDD::fgkSectionPlastPerMod = (TMath::Pi()*(3*0.36*0.36/4 + 3*0.21*0.21/4 + 2*0.115*0.115/4)
469 116 : - fgkSectionCuPerMod);
470 :
471 : const Double_t AliITSv11GeometrySDD::fgkSectionGlassPerMod = 3*0.006; // ???
472 : const Double_t AliITSv11GeometrySDD::fgkSectionCoolPolyuEL = 0.4672;
473 : const Double_t AliITSv11GeometrySDD::fgkSectionCoolWaterEL = 0.3496;
474 116 : const Double_t AliITSv11GeometrySDD::fgkEndLadderEarthCableR = 0.5*fgkmm;
475 : // (sections are given in cm square)
476 : const Double_t AliITSv11GeometrySDD::fgkCableBendRatio = 1.3; // ??? this factor account for the bending of cables
477 116 : const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilThick = 0.1*fgkmm; // Thickness of Al foil on hybrid side - TO BE CHECKED
478 116 : const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilWide = 4.2*fgkmm; // Width of Al foil on hybrid side - from digitCableA
479 116 : const Double_t AliITSv11GeometrySDD::fgkHybridAlFoilSide = 2.0*fgkmm; // Side length of Al foil on hybrid side
480 :
481 116 : const Double_t AliITSv11GeometrySDD::fgkConeSDDr1 = 11.87574*fgkcm;
482 116 : const Double_t AliITSv11GeometrySDD::fgkConeSDDr2 = 26.07574*fgkcm;
483 116 : const Double_t AliITSv11GeometrySDD::fgkConeSDDz1 = 3.36066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
484 116 : const Double_t AliITSv11GeometrySDD::fgkConeSDDz2 = 17.56066*fgkcm + 186.0*fgkmm + 0.5*790.0*fgkmm - 19.18934*fgkcm - 1.6;
485 : // These last parameters come from cone's code and define the slope
486 : // and position of the SDD cone end. For some unknown reason, this doesn't
487 : // allow to stick on the SDD cone. This has to be checked when a correct
488 : // version of the cone is available ... For now 'm applying some approximative
489 : // corrections
490 :
491 116 : const Double_t AliITSv11GeometrySDD::fgkSDDCableR1 = 16*fgkcm; // ??? // part 1 of "cable cone"
492 116 : const Double_t AliITSv11GeometrySDD::fgkSDDCableR2 = 23*fgkcm; // ??? // part 1/2 of "cable cone"
493 116 : const Double_t AliITSv11GeometrySDD::fgkSDDCableR3 = 26*fgkcm; // ??? // part 2 of "cable cone"
494 :
495 116 : const Double_t AliITSv11GeometrySDD::fgkSDDCableDZint = 3.5*fgkcm;
496 116 : const Double_t AliITSv11GeometrySDD::fgkSDDCableR5 = 37*fgkcm; // third part of "cable cone"
497 116 : const Double_t AliITSv11GeometrySDD::fgkSDDCableZ5 = 65*fgkcm; // third part of "cable cone"
498 :
499 :
500 : using std::endl;
501 : using std::cout;
502 116 : ClassImp(AliITSv11GeometrySDD)
503 :
504 : //________________________________________________________________________
505 : AliITSv11GeometrySDD::AliITSv11GeometrySDD():
506 0 : AliITSv11Geometry(),
507 0 : fPinSupport(0),
508 0 : fCoolPipeSupportL(0),
509 0 : fCoolPipeSupportR(0),
510 0 : fSDDsensor3(0),
511 0 : fSDDsensor4(0),
512 0 : fBaseThermalBridge(0),
513 0 : fHybrid(0),
514 0 : fLadderFoot(0),
515 0 : fCardLVR(0),
516 0 : fCardLVL(0),
517 0 : fCardHV(0),
518 0 : fCardCarlos(0),
519 0 : fRaccordoL(0),
520 0 : fDigitCableLay3A(0),
521 0 : fDigitCableLay3B(0),
522 0 : fDigitCableLay4A(0),
523 0 : fDigitCableLay4B(0),
524 0 : fMotherVol(0),
525 0 : fAddHybrids(kTRUE),
526 0 : fAddSensors(kTRUE),
527 0 : fAddHVcables(kTRUE),
528 0 : fAddCables(kTRUE),
529 0 : fAddCoolingSyst(kTRUE),
530 0 : fCoolingOn(kTRUE),
531 0 : fAddOnlyLadder3min(-1),
532 0 : fAddOnlyLadder3max(-1),
533 0 : fAddOnlyLadder4min(-1),
534 0 : fAddOnlyLadder4max(-1),
535 0 : fColorCarbonFiber(4),
536 0 : fColorRyton(5),
537 0 : fColorPhynox(7),
538 0 : fColorSilicon(3),
539 0 : fColorAl(7),
540 0 : fColorPolyhamide(5),
541 0 : fColorGlass(2),
542 0 : fColorSMD(12),
543 0 : fColorSMDweld(17),
544 0 : fColorStesalite(20),
545 0 : fLay3LadderUnderSegDH(0),
546 0 : fLay4LadderUnderSegDH(0),
547 0 : fLay3LaddShortRadius(0),
548 0 : fLay3LaddLongRadius(0),
549 0 : fLay4LaddShortRadius(0),
550 0 : fLay4LaddLongRadius(0)
551 0 : {
552 : //
553 : // Standard constructor
554 : //
555 0 : fCommonVol[0] = NULL;
556 0 : fCommonVol[1] = NULL;
557 0 : fCommonTr[0] = NULL;
558 0 : fCommonTr[1] = NULL;
559 0 : for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
560 0 : fLaddSegCommonVol[i] = NULL;
561 0 : fLaddSegCommonTr[i] = NULL;
562 : }
563 0 : SetParameters();
564 0 : }
565 :
566 :
567 : //________________________________________________________________________
568 : AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
569 1 : AliITSv11Geometry(debug),
570 1 : fPinSupport(0),
571 1 : fCoolPipeSupportL(0),
572 1 : fCoolPipeSupportR(0),
573 1 : fSDDsensor3(0),
574 1 : fSDDsensor4(0),
575 1 : fBaseThermalBridge(0),
576 1 : fHybrid(0),
577 1 : fLadderFoot(0),
578 1 : fCardLVR(0),
579 1 : fCardLVL(0),
580 1 : fCardHV(0),
581 1 : fCardCarlos(0),
582 1 : fRaccordoL(0),
583 1 : fDigitCableLay3A(0),
584 1 : fDigitCableLay3B(0),
585 1 : fDigitCableLay4A(0),
586 1 : fDigitCableLay4B(0),
587 1 : fMotherVol(0),
588 1 : fAddHybrids(kTRUE),
589 1 : fAddSensors(kTRUE),
590 1 : fAddHVcables(kTRUE),
591 1 : fAddCables(kTRUE),
592 1 : fAddCoolingSyst(kTRUE),
593 1 : fCoolingOn(kTRUE),
594 1 : fAddOnlyLadder3min(-1),
595 1 : fAddOnlyLadder3max(-1),
596 1 : fAddOnlyLadder4min(-1),
597 1 : fAddOnlyLadder4max(-1),
598 1 : fColorCarbonFiber(4),
599 1 : fColorRyton(5),
600 1 : fColorPhynox(7),
601 1 : fColorSilicon(3),
602 1 : fColorAl(7),
603 1 : fColorPolyhamide(5),
604 1 : fColorGlass(2),
605 1 : fColorSMD(12),
606 1 : fColorSMDweld(17),
607 1 : fColorStesalite(20),
608 1 : fLay3LadderUnderSegDH(0),
609 1 : fLay4LadderUnderSegDH(0),
610 1 : fLay3LaddShortRadius(0),
611 1 : fLay3LaddLongRadius(0),
612 1 : fLay4LaddShortRadius(0),
613 1 : fLay4LaddLongRadius(0)
614 5 : {
615 : //
616 : // Constructor setting debugging level
617 : //
618 1 : fCommonVol[0] = NULL;
619 1 : fCommonVol[1] = NULL;
620 1 : fCommonTr[0] = NULL;
621 1 : fCommonTr[1] = NULL;
622 42 : for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
623 20 : fLaddSegCommonVol[i] = NULL;
624 20 : fLaddSegCommonTr[i] = NULL;
625 : }
626 1 : SetParameters();
627 2 : }
628 :
629 : //________________________________________________________________________
630 : AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
631 0 : AliITSv11Geometry(s.GetDebug()),
632 0 : fPinSupport(s.fPinSupport),
633 0 : fCoolPipeSupportL(s.fCoolPipeSupportL),
634 0 : fCoolPipeSupportR(s.fCoolPipeSupportR),
635 0 : fSDDsensor3(s.fSDDsensor3),
636 0 : fSDDsensor4(s.fSDDsensor4),
637 0 : fBaseThermalBridge(s.fBaseThermalBridge),
638 0 : fHybrid(s.fHybrid),
639 0 : fLadderFoot(s.fLadderFoot),
640 0 : fCardLVR(s.fCardLVR),
641 0 : fCardLVL(s.fCardLVL),
642 0 : fCardHV(s.fCardHV),
643 0 : fCardCarlos(s.fCardCarlos),
644 0 : fRaccordoL(s.fRaccordoL),
645 0 : fDigitCableLay3A(s.fDigitCableLay3A),
646 0 : fDigitCableLay3B(s.fDigitCableLay3B),
647 0 : fDigitCableLay4A(s.fDigitCableLay4A),
648 0 : fDigitCableLay4B(s.fDigitCableLay4B),
649 0 : fMotherVol(s.fMotherVol),
650 0 : fAddHybrids(s.fAddHybrids),
651 0 : fAddSensors(s.fAddSensors),
652 0 : fAddHVcables(s.fAddHVcables),
653 0 : fAddCables(s.fAddCables),
654 0 : fAddCoolingSyst(s.fAddCoolingSyst),
655 0 : fCoolingOn(s.fCoolingOn),
656 0 : fAddOnlyLadder3min(s.fAddOnlyLadder3min),
657 0 : fAddOnlyLadder3max(s.fAddOnlyLadder3max),
658 0 : fAddOnlyLadder4min(s.fAddOnlyLadder4min),
659 0 : fAddOnlyLadder4max(s.fAddOnlyLadder4max),
660 0 : fColorCarbonFiber(s.fColorCarbonFiber),
661 0 : fColorRyton(s.fColorRyton),
662 0 : fColorPhynox(s.fColorPhynox),
663 0 : fColorSilicon(s.fColorSilicon),
664 0 : fColorAl(s.fColorAl),
665 0 : fColorPolyhamide(s.fColorPolyhamide),
666 0 : fColorGlass(s.fColorGlass),
667 0 : fColorSMD(s.fColorSMD),
668 0 : fColorSMDweld(s.fColorSMDweld),
669 0 : fColorStesalite(s.fColorStesalite),
670 0 : fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
671 0 : fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
672 0 : fLay3LaddShortRadius(s.fLay3LaddShortRadius),
673 0 : fLay3LaddLongRadius(s.fLay3LaddLongRadius),
674 0 : fLay4LaddShortRadius(s.fLay4LaddShortRadius),
675 0 : fLay4LaddLongRadius(s.fLay4LaddLongRadius)
676 0 : {
677 : // Copy Constructor
678 : // do only a "shallow copy" ...
679 0 : fCommonVol[0] = s.fCommonVol[0];
680 0 : fCommonVol[1] = s.fCommonVol[1];
681 0 : fCommonTr[0] = s.fCommonTr[0];
682 0 : fCommonTr[1] = s.fCommonTr[1];
683 0 : for (Int_t i=0; i<fgkNladdSegCommonVol; i++){
684 0 : fLaddSegCommonVol[i] = s.fLaddSegCommonVol[i];
685 0 : fLaddSegCommonTr[i] = s.fLaddSegCommonTr[i];
686 : }
687 0 : SetParameters();
688 0 : }
689 :
690 : //________________________________________________________________________
691 : AliITSv11GeometrySDD& AliITSv11GeometrySDD::
692 : operator=(const AliITSv11GeometrySDD &s) {
693 : // Assignment operator
694 0 : if(&s == this) return *this;
695 0 : fMotherVol = s.fMotherVol;
696 0 : fAddHybrids = s.fAddHybrids;
697 0 : fAddSensors = s.fAddSensors;
698 0 : fAddHVcables = s.fAddHVcables;
699 0 : fAddCables = s.fAddCables;
700 0 : fAddCoolingSyst = s.fAddCoolingSyst;
701 0 : fCoolingOn = s.fCoolingOn;
702 0 : fAddOnlyLadder3min = s.fAddOnlyLadder3min;
703 0 : fAddOnlyLadder3max = s.fAddOnlyLadder3max;
704 0 : fAddOnlyLadder4min = s.fAddOnlyLadder4min;
705 0 : fAddOnlyLadder4max = s.fAddOnlyLadder4max;
706 0 : return *this;
707 0 : }
708 :
709 : //________________________________________________________________________
710 6 : AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
711 : // Look like a destructor
712 : // Smell like a destructor
713 : // And actually is the destructor
714 10 : if (fDigitCableLay3A) delete [] fDigitCableLay3A;
715 10 : if (fDigitCableLay3B) delete [] fDigitCableLay3B;
716 12 : if (fDigitCableLay4A) delete [] fDigitCableLay4A;
717 12 : if (fDigitCableLay4B) delete [] fDigitCableLay4B;
718 3 : }
719 :
720 : //________________________________________________________________________
721 : void AliITSv11GeometrySDD::SetParameters() {
722 : //
723 : // Define display colors and the non constant geometry parameters
724 : //
725 :
726 2 : Double_t detLadderDist = 8.4*fgkmm;
727 :
728 1 : fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
729 1 : fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
730 :
731 : // radius from the center to the CF ladder :
732 2 : fLay3LaddShortRadius = (fgkLay3DetShortRadius
733 1 : + fgkLadWaferSep+2*fgkWaferThickness
734 1 : + detLadderDist);
735 2 : fLay3LaddLongRadius = (fgkLay3DetLongRadius
736 1 : + fgkLadWaferSep+2*fgkWaferThickness
737 1 : + detLadderDist);
738 2 : fLay4LaddShortRadius = (fgkLay4DetShortRadius
739 1 : + fgkLadWaferSep+2*fgkWaferThickness
740 1 : + detLadderDist);
741 2 : fLay4LaddLongRadius = (fgkLay4DetLongRadius
742 1 : + fgkLadWaferSep+2*fgkWaferThickness
743 1 : + detLadderDist);
744 :
745 1 : fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
746 1 : fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
747 1 : fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
748 1 : fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
749 1 : fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
750 1 : fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
751 :
752 1 : fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
753 1 : fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
754 1 : fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
755 1 : fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
756 1 : fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
757 1 : fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
758 1 : fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
759 1 : fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
760 1 : }
761 :
762 :
763 : //________________________________________________________________________
764 : TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
765 : //
766 : // Called to get a medium, checks that it exists.
767 : // If not, prints an error and returns 0
768 : //
769 :
770 380 : char ch[30];
771 190 : snprintf(ch, 30, "ITS_%s",mediumName);
772 190 : TGeoMedium* medium = gGeoManager->GetMedium(ch);
773 190 : if (! medium)
774 0 : printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
775 190 : return medium;
776 190 : }
777 :
778 :
779 : //________________________________________________________________________
780 : Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
781 : // Get the actual number of ladder in layer 3
782 0 : if ( (fAddOnlyLadder3min<0) ||
783 0 : (fAddOnlyLadder3min >= fgkLay3Nladd) ||
784 0 : (fAddOnlyLadder3max<0) ||
785 0 : (fAddOnlyLadder3max >= fgkLay3Nladd) )
786 0 : return fgkLay3Nladd;
787 0 : else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
788 0 : }
789 :
790 :
791 : //________________________________________________________________________
792 : Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
793 : // Get the actual number of ladder in layer 4
794 0 : if ( (fAddOnlyLadder4min<0) ||
795 0 : (fAddOnlyLadder4min >= fgkLay4Nladd) ||
796 0 : (fAddOnlyLadder4max<0) ||
797 0 : (fAddOnlyLadder4max >= fgkLay4Nladd) )
798 0 : return fgkLay4Nladd;
799 0 : else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
800 0 : }
801 :
802 :
803 : //________________________________________________________________________
804 : void AliITSv11GeometrySDD::CreateBasicObjects() {
805 : //
806 : // Create basics objets which will be assembled together
807 : // in Layer3 and Layer4 functions
808 : //
809 :
810 :
811 15 : fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
812 14 : fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
813 18 : fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
814 18 : fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
815 :
816 1 : fPinSupport = CreatePinSupport();
817 1 : fCoolPipeSupportL = CreateCoolPipeSupportL();
818 1 : fCoolPipeSupportR = CreateCoolPipeSupportR();
819 1 : CreateSDDsensor();
820 1 : fBaseThermalBridge = CreateBaseThermalBridge();
821 1 : fHybrid = CreateHybrid(0);
822 :
823 1 : TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
824 1 : TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
825 1 : TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
826 1 : TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
827 1 : TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
828 1 : TGeoMedium *raccordMedium = GetMedium("INOX$"); // same as AISI 316-L
829 1 : TGeoMedium *copperMedium = GetMedium("COPPER$");
830 :
831 : //********************************************************************
832 : // pieces of the carbon fiber structure
833 : //********************************************************************
834 1 : Double_t dy = fgkLadderSegBoxDH/2;
835 1 : Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
836 1 : Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
837 1 : Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
838 1 : Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
839 1 : Double_t dYTranslation = (fgkLadderHeight/2.
840 1 : -0.5*fgkLadderWidth*TMath::Tan(beta)
841 1 : -fgkLadderBeamRadius);
842 1 : Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
843 :
844 : //--- the top V of the Carbon Fiber Ladder (segment)
845 1 : TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
846 1 : fgkSegmentLength/2., halfTheta,
847 1 : -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
848 2 : TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
849 1 : cfLaddTop1,carbonFiberLadderStruct);
850 1 : TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
851 1 : fgkSegmentLength/2., halfTheta,
852 1 : 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
853 2 : TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
854 1 : cfLaddTop2, carbonFiberLadderStruct);
855 1 : cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
856 1 : cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
857 1 : TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
858 :
859 : //--- the 2 side V
860 1 : TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
861 1 : fgkSegmentLength/2., beta, -1,
862 1 : fgkLadderLb, fgkLadderHb, fgkLadderl);
863 2 : TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
864 1 : cfLaddSide1,carbonFiberLadderStruct);
865 1 : TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
866 1 : fgkSegmentLength/2., beta, 1,
867 1 : fgkLadderLb, fgkLadderHb, fgkLadderl);
868 2 : TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
869 1 : cfLaddSide2,carbonFiberLadderStruct);
870 1 : cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
871 1 : cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
872 1 : TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
873 1 : alpha*TMath::RadToDeg());
874 1 : AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
875 1 : TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
876 1 : -alpha*TMath::RadToDeg());
877 1 : AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
878 :
879 : //--- The beams
880 : // Beams on the sides
881 3 : Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
882 2 : TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
883 : //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
884 3 : Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
885 1 : ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
886 2 : + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
887 1 : TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
888 : 0, 180);
889 1 : TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
890 : carbonFiberLadderStruct);
891 1 : sideBeam->SetLineColor(fColorCarbonFiber);
892 :
893 : //Euler rotation : about Z, then new X, then new Z
894 2 : TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
895 1 : -beamPhiPrime*TMath::RadToDeg(),-90);
896 2 : TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
897 1 : beamPhiPrime*TMath::RadToDeg(), -90);
898 2 : TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
899 1 : beamPhiPrime*TMath::RadToDeg(), -90);
900 2 : TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
901 1 : -beamPhiPrime*TMath::RadToDeg(),-90);
902 :
903 : TGeoCombiTrans *beamTransf[8];
904 3 : beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
905 1 : TMath::Tan(halfTheta),
906 1 : fgkLadderBeamRadius/2. - dy,
907 1 : -3*fgkSegmentLength/8, beamRot1);
908 :
909 3 : beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
910 1 : TMath::Tan(halfTheta),
911 1 : fgkLadderBeamRadius/2. - dy,
912 1 : -3*fgkSegmentLength/8, beamRot1);
913 1 : AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
914 :
915 3 : beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
916 1 : TMath::Tan(halfTheta),
917 1 : fgkLadderBeamRadius/2. - dy,
918 1 : -fgkSegmentLength/8, beamRot2);
919 :
920 3 : beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
921 1 : TMath::Tan(halfTheta),
922 1 : fgkLadderBeamRadius/2. - dy,
923 1 : -fgkSegmentLength/8, beamRot2);
924 1 : AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
925 :
926 3 : beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
927 1 : TMath::Tan(halfTheta),
928 1 : fgkLadderBeamRadius/2. - dy,
929 1 : -3*fgkSegmentLength/8, beamRot3);
930 :
931 3 : beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
932 1 : TMath::Tan(halfTheta),
933 1 : fgkLadderBeamRadius/2. - dy,
934 1 : -3*fgkSegmentLength/8, beamRot3);
935 1 : AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
936 :
937 3 : beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
938 2 : TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
939 3 : beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
940 2 : TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
941 :
942 : //--- Beams of the bottom
943 2 : TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
944 1 : fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
945 2 : TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
946 1 : bottomBeam1, carbonFiberLadderStruct);
947 1 : bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
948 2 : TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
949 1 : fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
950 2 : TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
951 1 : bottomBeam2, carbonFiberLadderStruct);
952 1 : bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
953 2 : TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
954 2 : 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
955 1 : - fgkLadderLb/3, 0, 180);
956 2 : TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
957 1 : bottomBeam3, carbonFiberLadderStruct);
958 1 : bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
959 : //bottomBeam3Vol->SetLineColor(2);
960 1 : TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
961 1 : TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
962 :
963 2 : TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
964 1 : (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
965 2 : TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
966 1 : -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
967 1 : -fgkSegmentLength/2, bottomBeamRot1);
968 2 : TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
969 1 : -(fgkLadderHeight/2 - fgkLadderBeamRadius)
970 1 : - dy, fgkSegmentLength/2, bottomBeamRot2);
971 : // be careful for beams #3: when "reading" from -z to +z and
972 : // from the bottom of the ladder, it should draw a Lambda, and not a V
973 1 : TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
974 1 : TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
975 2 : TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
976 1 : (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
977 2 : TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
978 1 : (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
979 :
980 : // The ground wire running on the top vertex - M.S. 12 nov 2013
981 1 : TGeoTube *groundWire = new TGeoTube(0, fgkEndLadderEarthCableR, fgkSegmentLength/2);
982 1 : TGeoVolume *groundWireVol = new TGeoVolume("ITSsddGroundWire", groundWire,
983 : copperMedium);
984 1 : groundWireVol->SetLineColor(41); // should be something brown-ish
985 2 : TGeoTranslation *trGroundWire = new TGeoTranslation(0,
986 1 : fgkLadderHeight/2-5*fgkEndLadderEarthCableR, 0);
987 :
988 1 : fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
989 1 : fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
990 1 : fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
991 1 : fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
992 1 : fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
993 1 : fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
994 1 : fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
995 1 : fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
996 1 : fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
997 1 : fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
998 1 : fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
999 1 : fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
1000 1 : fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
1001 1 : fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
1002 1 : fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
1003 1 : fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
1004 1 : fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
1005 1 : fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
1006 1 : fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
1007 1 : fLaddSegCommonVol[19]= groundWireVol; fLaddSegCommonTr[19]= trGroundWire;
1008 :
1009 :
1010 : //********************************************************************
1011 : // cables
1012 : //********************************************************************
1013 1 : char cableName[30];
1014 14 : for (Int_t i=0; i<fgkLay3Ndet; i++) {
1015 6 : snprintf(cableName, 30, "digitCableLay3A_%i",i);
1016 6 : fDigitCableLay3A[i].SetName(cableName);
1017 6 : fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
1018 6 : fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1019 6 : fDigitCableLay3A[i].SetNLayers(2);
1020 12 : fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1021 6 : fColorPolyhamide);
1022 6 : fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1023 6 : snprintf(cableName, 30, "digitCableLay3B_%i",i);
1024 6 : fDigitCableLay3B[i].SetName(cableName);
1025 6 : fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
1026 6 : fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1027 6 : fDigitCableLay3B[i].SetNLayers(2);
1028 12 : fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1029 6 : fColorPolyhamide);
1030 6 : fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1031 : };
1032 18 : for (Int_t i=0; i<fgkLay4Ndet; i++) {
1033 8 : snprintf(cableName, 30, "digitCableLay4A_%i",i);
1034 8 : fDigitCableLay4A[i].SetName(cableName);
1035 8 : fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
1036 8 : fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1037 8 : fDigitCableLay4A[i].SetNLayers(2);
1038 16 : fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1039 8 : fColorPolyhamide);
1040 8 : fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1041 8 : snprintf(cableName, 30, "digitCableLay4B_%i",i);
1042 8 : fDigitCableLay4B[i].SetName(cableName);
1043 8 : fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
1044 8 : fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
1045 8 : fDigitCableLay4B[i].SetNLayers(2);
1046 16 : fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
1047 8 : fColorPolyhamide);
1048 8 : fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
1049 : };
1050 : // Well, those digit cables could also include the analog cables
1051 : // which have the same width and the same path, at least in the ladder.
1052 : // It will gain some computing ressources (less volumes) and some
1053 : // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1054 : // The only thing to do is to change the names and put the correct total
1055 : // thicknesses
1056 :
1057 : // some transformations and volumes used in several places
1058 2 : fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
1059 : 0, -fgkCarlosSuppAngle, 0);
1060 :
1061 2 : TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
1062 1 : fgkLittleScrewHeadH/2);
1063 3 : fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
1064 1 : littleScrewHead, stainless);
1065 1 : fCommonVol[0]->SetLineColor(kGray);
1066 :
1067 1 : fLadderFoot = CreateLadderFoot();
1068 1 : CreateLVCard();
1069 1 : fCardHV = CreateHVCard();
1070 1 : fCardCarlos = CreateCarlosCard(0);
1071 :
1072 : //==================
1073 : // link beteen phynox and plastic cooling tubes
1074 : //==================
1075 :
1076 2 : fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
1077 1 : Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
1078 1 : TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
1079 1 : TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
1080 1 : vwaterRac->SetLineColor(kBlue);
1081 :
1082 2 : TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
1083 1 : fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
1084 2 : TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
1085 1 : fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
1086 2 : TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
1087 1 : fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
1088 1 : TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1089 1 : TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1090 1 : TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1091 1 : vtube1Rac->SetLineColor(kGray);
1092 1 : vtube2Rac->SetLineColor(kGray);
1093 1 : vtube3Rac->SetLineColor(kGray);
1094 :
1095 2 : TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1096 1 : -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1097 2 : TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1098 1 : (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1099 2 : TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1100 2 : (-fullRacLen/2+fgkConnectorCoolTubeL1+
1101 2 : fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1102 1 : fRaccordoL->AddNode(vwaterRac, 1,0);
1103 1 : fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1104 1 : fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1105 1 : fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1106 1 : fRaccordoL->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
1107 1 : }
1108 :
1109 :
1110 : //________________________________________________________________________
1111 : void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1112 : //
1113 : // a debugging function for checking some possible overlaps
1114 : //
1115 0 : if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1116 0 : if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1117 0 : if (fHybrid) fHybrid->CheckOverlaps(precision);
1118 0 : }
1119 :
1120 :
1121 : //________________________________________________________________________
1122 : TGeoCombiTrans *AliITSv11GeometrySDD::
1123 : CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1124 : Bool_t planeSym) {
1125 : //
1126 : // return the TGeoCombiTrans which make a translation in y and z
1127 : // and a rotation in phi in the global coord system
1128 : // If planeSym = true, the rotation places the object symetrically
1129 : // (with respect to the transverse plane) to its position in the
1130 : // case planeSym = false
1131 : //
1132 :
1133 150 : TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1134 150 : TGeoRotation r1("",0.,0.,dphi);
1135 150 : TGeoRotation r2("",90, 180, -90-dphi);
1136 :
1137 300 : TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1138 150 : combiTrans1->SetTranslation(t1);
1139 257 : if (planeSym) combiTrans1->SetRotation(r1);
1140 43 : else combiTrans1->SetRotation(r2);
1141 : return combiTrans1;
1142 150 : }
1143 :
1144 :
1145 : //________________________________________________________________________
1146 : void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1147 : Double_t dx,
1148 : Double_t dy,
1149 : Double_t dz) const{
1150 : // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1151 472 : const Double_t *vect = ct->GetTranslation();
1152 236 : Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1153 236 : ct->SetTranslation(newVect);
1154 236 : }
1155 :
1156 :
1157 : //________________________________________________________________________
1158 : void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1159 : // for code developpment and debugging purposes
1160 :
1161 0 : if (! fSDDsensor3) CreateBasicObjects();
1162 :
1163 : // moth->AddNode(fPinSupport, 1, 0);
1164 : // moth->AddNode(fCoolPipeSupportL, 1, 0);
1165 : // moth->AddNode(fSDDsensor3, 1, 0);
1166 : // moth->AddNode(fSDDsensor4, 1, 0);
1167 : // moth->AddNode(fBaseThermalBridge, 1, 0);
1168 : // moth->AddNode(fHybrid,100,0);
1169 : // moth->AddNode(fLadderFoot,1,0);
1170 : //moth->AddNode(fCardLVL,1,0);
1171 : //moth->AddNode(fCardLVR,1,0);
1172 :
1173 0 : TGeoVolume* seg = CreateLadderSegment( 3, 0);
1174 0 : moth->AddNode(seg, 1, 0);
1175 :
1176 : // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1177 : // moth->AddNode(lay3Ladder, 1, 0);
1178 :
1179 : // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1180 : // moth->AddNode(lay3Detectors, 1, 0);
1181 :
1182 : // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1183 : // moth->AddNode(lay3Detectors, 1, 0);
1184 :
1185 :
1186 : // TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1187 : // moth->AddNode(endLadder, 1, 0);
1188 :
1189 : // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1190 : // moth->AddNode(highVCard, 1, 0);
1191 :
1192 : // TGeoVolumeAssembly *supportRing = CreateSupportRing();
1193 : // moth->AddNode(supportRing, 1, 0);
1194 :
1195 : // TGeoVolume *endLadderCards = CreateEndLadderCardsV( 4 );
1196 : // moth->AddNode(endLadderCards, 1, 0);
1197 :
1198 : // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1199 : // moth->AddNode(carlosCard, 1, 0);
1200 :
1201 :
1202 :
1203 : /*
1204 : //==================================
1205 : //--- test of flat cable curvature
1206 : //==================================
1207 :
1208 : double angle = 90;
1209 : AliITSv11GeomCableFlat cable("test", 3, 0.3);
1210 : cable.SetNLayers(1);
1211 : cable.SetNLayers(2);
1212 : cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
1213 : cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
1214 : cable.SetInitialNode(endLadderCards);
1215 :
1216 : Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
1217 :
1218 : p1[0] = -3;
1219 : p1[1] = 1;
1220 : p1[2] = 10;
1221 :
1222 : p2[0] = 0;
1223 : p2[1] = 1;
1224 : p2[2] = 10;
1225 : cable.AddCheckPoint(endLadderCards, 0, p1, vX);
1226 : cable.AddCheckPoint(endLadderCards, 1, p2, vX);
1227 : cable.CreateAndInsertBoxCableSegment(1,angle);
1228 :
1229 : Double_t p3[3], p4[3];
1230 :
1231 : p3[0] = 2;
1232 : p3[1] = 3;
1233 : p3[2] = 10;
1234 : cable.AddCheckPoint(endLadderCards, 2, p3, vY);
1235 : cable.CreateAndInsertCableCylSegment(2,angle);
1236 :
1237 : p4[0] = 2;
1238 : p4[1] = 6;
1239 : p4[2] = 10;
1240 : cable.AddCheckPoint(endLadderCards, 3, p4, vY);
1241 : cable.CreateAndInsertCableSegment(3,angle);
1242 : */
1243 0 : }
1244 :
1245 :
1246 : //________________________________________________________________________
1247 : void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1248 : //
1249 : // Insert the layer 3 in the mother volume. This is a virtual volume
1250 : // containing ladders of layer 3 and the supporting rings
1251 : //
1252 :
1253 2 : if (! moth) {
1254 0 : printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1255 0 : return;
1256 : };
1257 :
1258 1 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
1259 :
1260 1 : fMotherVol = moth;
1261 2 : if (! fSDDsensor3) CreateBasicObjects();
1262 :
1263 : //====================================
1264 : // First we create the central barrel
1265 : //====================================
1266 :
1267 1 : TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1268 1 : TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1269 1 : TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
1270 : //TGeoVolume *lay3Detectors = CreateDetectors(3);
1271 2 : TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1272 1 : fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1273 2 : TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1274 1 : virtualLayer3Shape, airSDD);
1275 :
1276 : Double_t dPhi = 360./fgkLay3Nladd;
1277 1 : Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1278 : // Placing virtual ladder and detectors volumes following
1279 : // ladder ordering convention
1280 1 : char rotName[30];
1281 : Int_t iLaddMin = 0;
1282 : Int_t iLaddMax = fgkLay3Nladd;
1283 1 : if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1284 : iLaddMin = fAddOnlyLadder3min;
1285 0 : iLaddMax = fAddOnlyLadder3max+1;
1286 0 : };
1287 :
1288 30 : for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1289 :
1290 14 : Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1291 14 : snprintf(rotName, 30, "ITSsddLay3Ladd%i",iLadd);
1292 14 : Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1293 14 : if (iLadd%2 != 0)
1294 7 : minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1295 14 : minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1296 : TGeoCombiTrans *ctLadd;
1297 : //=============================================================
1298 : //
1299 : // Special modification for ladder 2 of layer 3:
1300 : // It has been inverted (pi rotation around y axis)
1301 : //
1302 : //=============================================================
1303 14 : if (iLadd != 2)
1304 13 : ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1305 : 0, ladderPhi, kTRUE);
1306 : else
1307 1 : ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1308 : 0, ladderPhi, kFALSE);
1309 14 : virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1310 : ///////////////////////////////////////////////////
1311 14 : snprintf(rotName, 30, "ITSsddLay3DetBox%i",iLadd);
1312 14 : Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1313 21 : if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1314 14 : minRadiusDetBox += detectorsThick/2;
1315 : TGeoCombiTrans *ctDet;
1316 14 : ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1317 : 0, ladderPhi, kTRUE);
1318 :
1319 14 : if (iLadd != 2)
1320 27 : virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1321 : else
1322 1 : virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
1323 :
1324 : ///////////////////////////////////////////////////
1325 : }
1326 :
1327 : /*
1328 : //====================================
1329 : // Then the forward rapidity pieces
1330 : // (cooling, Carlos, LV, HV ...)
1331 : //====================================
1332 :
1333 : Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1334 : Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1335 : Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1336 :
1337 : TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1338 : TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1339 : fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1340 : fgkForwardLay3Length/2.);
1341 :
1342 : // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1343 : // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1344 : // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1345 :
1346 :
1347 : TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1348 : virtualForward3Shape, airSDD);
1349 : TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1350 : virtualForward3Shape, airSDD);
1351 : // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1352 : // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1353 :
1354 : TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1355 : fgkLay3Length/2+fgkForwardLay3Length/2);
1356 : TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1357 : -fgkLay3Length/2-fgkForwardLay3Length/2);
1358 :
1359 : for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1360 :
1361 : Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1362 : Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1363 : if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1364 : minRadiusDetBox += detectorsThick/2;
1365 :
1366 : sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1367 :
1368 : TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1369 : -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1370 : TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1371 : fgkForwardLay3Length/2, ladderPhi, kFALSE);
1372 :
1373 : virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1374 : virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1375 : }
1376 :
1377 : */
1378 :
1379 :
1380 1 : if(GetDebug(1)) {
1381 0 : virtualLayer3->CheckOverlaps(0.01);
1382 : //virtualForward3Pos->CheckOverlaps(0.01);
1383 : //virtualForward3Neg->CheckOverlaps(0.01);
1384 0 : }
1385 :
1386 1 : virtualLayer3->SetVisibility(kFALSE);
1387 : //virtualForward3Pos->SetVisibility(kFALSE);
1388 : //virtualForward3Neg->SetVisibility(kFALSE);
1389 :
1390 :
1391 1 : moth->AddNode(virtualLayer3, 1, 0);
1392 : //moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1393 : //moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1394 2 : }
1395 :
1396 :
1397 : // //________________________________________________________________________
1398 : // void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1399 : // //
1400 : // // Insert the forward pieces of layer 3 in the mother volume.
1401 : // // (cooling, Carlos, LV, HV ...)
1402 : // //
1403 :
1404 : // if (! moth) {
1405 : // printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1406 : // return;
1407 : // };
1408 :
1409 : // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1410 :
1411 : // if (! fSDDsensor3) CreateBasicObjects();
1412 :
1413 : // Double_t dPhi = 360./fgkLay3Nladd;
1414 : // Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1415 : // Int_t iLaddMin = 0;
1416 : // Int_t iLaddMax = fgkLay3Nladd;
1417 : // if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1418 : // iLaddMin = fAddOnlyLadder3min;
1419 : // iLaddMax = fAddOnlyLadder3max+1;
1420 : // };
1421 : // char rotName[30];
1422 :
1423 :
1424 : // //=================
1425 :
1426 : // Double_t fgkForwardLay3Length = fgkEndLadPipeUlengthLay3+10*fgkmm; // this has to be tune
1427 : // Double_t fgkForwardLay3Rmin = fgkLay3Rmin-7*fgkmm;
1428 : // Double_t fgkForwardLay3Rmax = fgkLay3Rmax-5*fgkmm;
1429 :
1430 : // TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1431 : // TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1432 : // fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1433 : // fgkForwardLay3Length/2.);
1434 :
1435 : // // TGeoPcon *virtualForward3Shape = new TGeoPcon("virtualForward3Shape",0,360,2);
1436 : // // // virtualForward3Shape->DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
1437 : // // virtualForward3Shape->DefineSection(0, Double_t z, Double_t rmin, Double_t rmax);
1438 :
1439 :
1440 : // TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1441 : // virtualForward3Shape, airSDD);
1442 : // TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1443 : // virtualForward3Shape, airSDD);
1444 : // // TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1445 : // // TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1446 :
1447 : // TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1448 : // fgkLay3Length/2+fgkForwardLay3Length/2);
1449 : // TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1450 : // -fgkLay3Length/2-fgkForwardLay3Length/2);
1451 :
1452 : // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1453 :
1454 : // Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1455 : // Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1456 : // if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1457 : // minRadiusDetBox += detectorsThick/2;
1458 :
1459 : // sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1460 :
1461 : // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1462 : // -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1463 : // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1464 : // fgkForwardLay3Length/2, ladderPhi, kFALSE);
1465 :
1466 : // virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1467 : // virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1468 : // }
1469 :
1470 : // if(GetDebug(1)) {
1471 : // virtualForward3Pos->CheckOverlaps(0.01);
1472 : // virtualForward3Neg->CheckOverlaps(0.01);
1473 : // }
1474 :
1475 : // virtualForward3Pos->SetVisibility(kFALSE);
1476 : // virtualForward3Neg->SetVisibility(kFALSE);
1477 :
1478 : // moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1479 : // moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1480 : // }
1481 :
1482 :
1483 :
1484 : //________________________________________________________________________
1485 : void AliITSv11GeometrySDD::ForwardLayer3(TGeoVolume *moth) {
1486 : //
1487 : // Insert the end-ladder of layer 3 in the mother volume.
1488 : // (cooling, Carlos, LV, HV ...)
1489 : //
1490 :
1491 2 : if (! moth) {
1492 0 : printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1493 0 : return;
1494 : };
1495 :
1496 1 : if (! fSDDsensor3) CreateBasicObjects();
1497 :
1498 : Int_t iLaddMin = 0;
1499 : Int_t iLaddMax = fgkLay3Nladd;
1500 1 : if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1501 : iLaddMin = fAddOnlyLadder3min;
1502 0 : iLaddMax = fAddOnlyLadder3max+1;
1503 0 : };
1504 :
1505 2 : TGeoVolume *virtualForward3Neg = new TGeoVolumeAssembly("ITSsddForward3Neg");
1506 2 : TGeoVolume *virtualForward3Pos = new TGeoVolumeAssembly("ITSsddForward3Pos");
1507 :
1508 1 : char rotName[30];
1509 : Double_t dPhi = 360./fgkLay3Nladd;
1510 1 : TGeoVolume* lay3EndLadder = CreateEndLadderCardsV(3);
1511 :
1512 30 : for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1513 :
1514 14 : Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1515 : Double_t dR = 0;
1516 21 : if (iLadd%2 != 0) dR = fgkLay3DetLongRadius-fgkLay3DetShortRadius;
1517 :
1518 14 : snprintf(rotName, 30, "ITSsddLay3EndLadd%i",iLadd);
1519 :
1520 14 : TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1521 14 : fgkLay3Length/2, ladderPhi, kTRUE);
1522 14 : TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1523 14 : -fgkLay3Length/2, ladderPhi, kFALSE);
1524 :
1525 14 : virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1526 14 : virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1527 : }
1528 :
1529 1 : virtualForward3Pos->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
1530 1 : virtualForward3Neg->GetShape()->ComputeBBox();
1531 :
1532 1 : if(GetDebug(1)) {
1533 0 : virtualForward3Pos->CheckOverlaps(0.01);
1534 0 : virtualForward3Neg->CheckOverlaps(0.01);
1535 0 : }
1536 :
1537 : // 180deg Y rotation to compensate the cancellation of ITSD volume
1538 : // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1539 1 : TGeoRotation *y180 = new TGeoRotation();
1540 1 : y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1541 1 : moth->AddNode(virtualForward3Pos, 1, y180);
1542 1 : moth->AddNode(virtualForward3Neg, 1, y180);
1543 2 : }
1544 :
1545 : //________________________________________________________________________
1546 : void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1547 : //
1548 : // Insert the layer 4 in the mother volume. This is a virtual volume
1549 : // containing ladders of layer 4 and the supporting rings
1550 : //
1551 :
1552 2 : if (! moth) {
1553 0 : printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1554 0 : return;
1555 : };
1556 :
1557 1 : fMotherVol = moth;
1558 :
1559 1 : if (! fSDDsensor3) CreateBasicObjects();
1560 :
1561 2 : TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1562 1 : fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1563 1 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
1564 2 : TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1565 1 : virtualLayer4Shape, airSDD);
1566 :
1567 : //====================================
1568 : // First we create the central barrel
1569 : //====================================
1570 :
1571 1 : TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1572 : //TGeoVolume *lay4Detectors = CreateDetectors(4);
1573 1 : TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1574 :
1575 : Double_t dPhi = 360./fgkLay4Nladd;
1576 1 : Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1577 :
1578 : // placing virtual ladder and detectors volumes following ladder
1579 : // ordering convention
1580 1 : char rotName[30];
1581 : Int_t iLaddMin = 0;
1582 : Int_t iLaddMax = fgkLay4Nladd;
1583 1 : if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1584 : iLaddMin = fAddOnlyLadder4min;
1585 0 : iLaddMax = fAddOnlyLadder4max+1;
1586 0 : }
1587 46 : for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1588 :
1589 22 : Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1590 22 : snprintf(rotName, 30, "ITSsddLay4Ladd%i",iLadd);
1591 22 : Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1592 22 : if (iLadd%2 != 0)
1593 11 : minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1594 22 : minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1595 22 : TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1596 : 0, ladderPhi, kTRUE);
1597 22 : virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1598 : ///////////////////////////////////////////////////
1599 22 : snprintf(rotName, 30, "ITSsddLay4DetBox%i",iLadd);
1600 22 : Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1601 22 : if (iLadd%2 != 0)
1602 11 : minRadiusDetBox = fgkLay4DetLongRadius;
1603 22 : minRadiusDetBox += detBoxThickness/2;
1604 22 : TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1605 : 0, ladderPhi, kTRUE);
1606 22 : virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1607 : ///////////////////////////////////////////////////
1608 : }
1609 :
1610 : /*
1611 : //====================================
1612 : // Then the pieces at forward rapidity
1613 : // (cooling, Carlos, LV, HV ...)
1614 : //====================================
1615 :
1616 : Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1617 : Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1618 : Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1619 :
1620 : TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1621 : TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1622 : fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1623 : fgkForwardLay4Length/2.);
1624 : TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1625 : virtualForward4Shape, airSDD);
1626 : TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1627 : virtualForward4Shape, airSDD);
1628 : // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1629 : // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1630 :
1631 : TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1632 : fgkLay4Length/2+fgkForwardLay4Length/2);
1633 : TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1634 : -fgkLay4Length/2-fgkForwardLay4Length/2);
1635 :
1636 : for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1637 :
1638 : Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1639 : Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1640 : if (iLadd%2 != 0)
1641 : minRadiusDetBox = fgkLay4DetLongRadius;
1642 : minRadiusDetBox += detBoxThickness/2;
1643 :
1644 : sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1645 :
1646 : TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1647 : -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1648 : TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1649 : fgkForwardLay4Length/2, ladderPhi, kFALSE);
1650 : virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1651 : virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1652 : }
1653 : */
1654 :
1655 1 : if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1656 :
1657 1 : virtualLayer4->SetVisibility(kFALSE);
1658 : //virtualForward4Pos->SetVisibility(kFALSE);
1659 : //virtualForward4Neg->SetVisibility(kFALSE);
1660 :
1661 1 : moth->AddNode(virtualLayer4,1,0);
1662 : //moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1663 : //moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1664 2 : }
1665 :
1666 :
1667 : // //________________________________________________________________________
1668 : // void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1669 : // //
1670 : // // Insert the layer 4 in the mother volume. This is a virtual volume
1671 : // // containing ladders of layer 4 and the supporting rings
1672 : // // (cooling, Carlos, LV, HV ...)
1673 : // //
1674 :
1675 : // if (! moth) {
1676 : // printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1677 : // return;
1678 : // };
1679 :
1680 : // TGeoMedium *airSDD = GetMedium("SDD AIR$");
1681 :
1682 : // if (! fSDDsensor3) CreateBasicObjects();
1683 :
1684 : // Double_t dPhi = 360./fgkLay4Nladd;
1685 : // Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1686 :
1687 : // // placing virtual ladder and detectors volumes following ladder
1688 : // // ordering convention
1689 : // char rotName[20];
1690 : // Int_t iLaddMin = 0;
1691 : // Int_t iLaddMax = fgkLay4Nladd;
1692 : // if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1693 : // iLaddMin = fAddOnlyLadder4min;
1694 : // iLaddMax = fAddOnlyLadder4max+1;
1695 : // }
1696 :
1697 : // //=================
1698 : // Double_t fgkForwardLay4Length = fgkEndLadPipeUlengthLay4+10*fgkmm; // this has to be tuned
1699 : // Double_t fgkForwardLay4Rmin = fgkLay4Rmin-9*fgkmm;
1700 : // Double_t fgkForwardLay4Rmax = fgkLay4Rmax-5*fgkmm;
1701 :
1702 : // TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1703 : // TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1704 : // fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1705 : // fgkForwardLay4Length/2.);
1706 : // TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1707 : // virtualForward4Shape, airSDD);
1708 : // TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1709 : // virtualForward4Shape, airSDD);
1710 : // // TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1711 : // // TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1712 :
1713 : // TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1714 : // fgkLay4Length/2+fgkForwardLay4Length/2);
1715 : // TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1716 : // -fgkLay4Length/2-fgkForwardLay4Length/2);
1717 :
1718 : // for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1719 :
1720 : // Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1721 : // Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1722 : // if (iLadd%2 != 0)
1723 : // minRadiusDetBox = fgkLay4DetLongRadius;
1724 : // minRadiusDetBox += detBoxThickness/2;
1725 :
1726 : // sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1727 :
1728 : // TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1729 : // -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1730 : // TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1731 : // fgkForwardLay4Length/2, ladderPhi, kFALSE);
1732 : // virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1733 : // virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1734 : // }
1735 :
1736 : // virtualForward4Pos->SetVisibility(kFALSE);
1737 : // virtualForward4Neg->SetVisibility(kFALSE);
1738 :
1739 : // moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1740 : // moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1741 : // }
1742 :
1743 :
1744 : //________________________________________________________________________
1745 : void AliITSv11GeometrySDD::ForwardLayer4(TGeoVolume *moth) {
1746 : //
1747 : // Insert the end-ladder of layer 4 in the mother volume.
1748 : // (cooling, Carlos, LV, HV ...)
1749 : //
1750 :
1751 2 : if (! moth) {
1752 0 : printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1753 0 : return;
1754 : };
1755 :
1756 1 : if (! fSDDsensor3) CreateBasicObjects();
1757 :
1758 : // placing virtual ladder and detectors volumes following ladder
1759 : // ordering convention
1760 : Int_t iLaddMin = 0;
1761 : Int_t iLaddMax = fgkLay4Nladd;
1762 1 : if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1763 : iLaddMin = fAddOnlyLadder4min;
1764 0 : iLaddMax = fAddOnlyLadder4max+1;
1765 0 : }
1766 :
1767 2 : TGeoVolume *virtualForward4Pos = new TGeoVolumeAssembly("ITSsddForward4Pos");
1768 2 : TGeoVolume *virtualForward4Neg = new TGeoVolumeAssembly("ITSsddForward4Neg");
1769 :
1770 1 : char rotName[30];
1771 : Double_t dPhi = 360./fgkLay4Nladd;
1772 1 : TGeoVolume* lay4EndLadder = CreateEndLadderCardsV(4);
1773 :
1774 46 : for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1775 :
1776 22 : Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1777 : Double_t dR = 0;
1778 22 : if (iLadd%2 != 0)
1779 11 : dR = fgkLay4DetLongRadius-fgkLay4DetShortRadius;
1780 :
1781 22 : snprintf(rotName, 30, "ITSsddLay4EndLadd%i",iLadd);
1782 :
1783 22 : TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, dR,
1784 22 : fgkLay4Length/2, ladderPhi, kTRUE);
1785 22 : TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, dR,
1786 22 : -fgkLay4Length/2, ladderPhi, kFALSE);
1787 22 : virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1788 22 : virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2, ctEndLaddNeg);
1789 : }
1790 :
1791 1 : virtualForward4Pos->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
1792 1 : virtualForward4Neg->GetShape()->ComputeBBox();
1793 :
1794 : // 180deg Y rotation to compensate the cancellation of ITSD volume
1795 : // (idortm[199] in AliITSv11Hybrid : z---> -z; x ---> -x; y ---> y)
1796 1 : TGeoRotation *y180 = new TGeoRotation();
1797 1 : y180->SetAngles( 90.,180., 90., 90.,180., 0.);
1798 1 : moth->AddNode(virtualForward4Pos, 1, y180);
1799 1 : moth->AddNode(virtualForward4Neg, 1, y180);
1800 2 : }
1801 :
1802 :
1803 : //________________________________________________________________________
1804 : TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1805 : //
1806 : // return an assembly volume containing the CF ladder
1807 : //
1808 :
1809 : Int_t nDetectors = fgkLay3Ndet;
1810 4 : Double_t ladderLength = fgkLay3LadderLength;
1811 2 : Double_t underSegDH = fLay3LadderUnderSegDH;
1812 2 : Double_t *sensorZPos = fLay3sensorZPos;
1813 2 : AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1814 2 : AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1815 :
1816 2 : if (iLay==3) {}
1817 1 : else if (iLay==4) {
1818 : nDetectors = fgkLay4Ndet;
1819 1 : ladderLength = fgkLay4LadderLength;
1820 1 : digitCableA = fDigitCableLay4A;
1821 1 : digitCableB = fDigitCableLay4B;
1822 1 : underSegDH = fLay4LadderUnderSegDH;
1823 1 : sensorZPos = fLay4sensorZPos;
1824 1 : }
1825 : else {
1826 0 : printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1827 : };
1828 2 : Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1829 2 : TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1830 :
1831 : // placing virtual ladder segment following detector ordering convention
1832 : //=======================================================================
1833 2 : char transName[30];
1834 :
1835 : // adding segment this way to create cable points in the correct order ...
1836 18 : for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1837 :
1838 : //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1839 7 : TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1840 7 : snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1841 7 : Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1842 7 : + fgkSegmentLength/2;
1843 14 : TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1844 7 : underSegDH/2,segmentPos);
1845 : ////
1846 7 : virtualLadder->AddNode(laddSegment, iSegment, segTr);
1847 : };
1848 18 : for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1849 :
1850 7 : TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1851 : //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1852 7 : snprintf(transName, 30, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1853 7 : Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1854 7 : + fgkSegmentLength/2;
1855 14 : TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1856 7 : underSegDH/2,segmentPos);
1857 : ////
1858 7 : virtualLadder->AddNode(laddSegment, iSegment, segTr);
1859 : };
1860 :
1861 : // putting virtual volume corresponding to the end of ladder
1862 : //=======================================================================
1863 2 : TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1864 2 : Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1865 4 : TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1866 2 : fgkSegmentLength*(nDetectors/2)+endLength/2.);
1867 : // Euler rotation : about Z, then new X, then new Z
1868 2 : TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1869 4 : TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1870 2 : -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1871 2 : virtualLadder->AddNode(endLadder, 1, endTrZPos);
1872 2 : virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1873 :
1874 : // creating and inserting cable segments
1875 : // (check points are placed while creating segments)
1876 : //=======================================================================
1877 2 : if (fAddCables)
1878 32 : for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1879 :
1880 14 : digitCableA[iSegment].SetInitialNode(virtualLadder);
1881 14 : digitCableB[iSegment].SetInitialNode(virtualLadder);
1882 :
1883 92 : for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1884 : Double_t rotation = 0;
1885 32 : if (iPt>1) {
1886 : rotation = 90-fgkHybridAngle;
1887 18 : digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1888 18 : } else
1889 14 : digitCableA[iSegment].CreateAndInsertCableSegment(iPt);
1890 :
1891 : };
1892 :
1893 92 : for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1894 : Double_t rotation = 0;
1895 32 : if (iPt>1) {
1896 : rotation = fgkHybridAngle-90;
1897 18 : digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1898 18 : } else
1899 14 : digitCableB[iSegment].CreateAndInsertCableSegment(iPt);
1900 : };
1901 2 : };
1902 :
1903 : // HV cable
1904 : //=======================================================================
1905 2 : if (fAddHVcables) {
1906 2 : TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1907 2 : TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1908 :
1909 34 : AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1910 2 : char cableHVname[30];
1911 32 : for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1912 14 : snprintf(cableHVname,30,"ITSsddHVcable%i", iSegment);
1913 14 : cableHV[iSegment].SetName(cableHVname);
1914 14 : cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1915 14 : cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1916 14 : cableHV[iSegment].SetNLayers(2);
1917 28 : cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1918 14 : fColorPolyhamide);
1919 14 : cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1920 14 : cableHV[iSegment].SetInitialNode(virtualLadder);
1921 : };
1922 4 : Double_t x1[3], x2[3], x3[3],
1923 4 : vY[3] = {0,1,0}, vZ[3] = {0,0,1};
1924 :
1925 2 : x1[0] = -fgkTransitHVtailXpos;
1926 2 : x2[0] = -fgkTransitHVtailXpos;
1927 2 : x3[0] = -fgkTransitHVtailXpos;
1928 18 : for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1929 7 : Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1930 7 : *fgkLongHVcableSeparation;
1931 : // adjust where HV long cable starts in Y
1932 : // useful if you want to let some space for alignment
1933 7 : x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1934 14 : x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1935 7 : - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1936 7 : x3[1] = x2[1];
1937 7 : x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1938 7 : x2[2] = x1[2]+5*fgkmm;
1939 7 : x3[2] = ladderLength/2-endLength;
1940 7 : cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1941 7 : cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1942 7 : cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1943 :
1944 : //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1945 7 : cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1946 : //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1947 7 : cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1948 : };
1949 :
1950 : // vYZ[2] = -1;
1951 2 : x1[0] = fgkTransitHVtailXpos;
1952 2 : x2[0] = fgkTransitHVtailXpos;
1953 2 : x3[0] = fgkTransitHVtailXpos;
1954 :
1955 18 : for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1956 7 : Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1957 7 : *fgkLongHVcableSeparation;
1958 7 : x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1959 14 : x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1960 7 : - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1961 7 : x3[1] = x2[1];
1962 7 : x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1963 7 : x2[2] = x1[2]-5*fgkmm;
1964 7 : x3[2] = -ladderLength/2+endLength;
1965 7 : cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1966 7 : cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1967 7 : cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1968 :
1969 7 : cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1970 7 : cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1971 : };
1972 20 : };
1973 :
1974 : //**********************************
1975 2 : virtualLadder->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
1976 :
1977 2 : if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1978 2 : return virtualLadder;
1979 2 : }
1980 :
1981 :
1982 : //________________________________________________________________________
1983 : TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
1984 : Double_t dz, Double_t angle, Double_t xSign,
1985 : Double_t L, Double_t H, Double_t l) {
1986 : // Create one half of the V shape corner of CF ladder
1987 :
1988 24 : TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1989 12 : cfLaddSide->SetName(name);
1990 :
1991 : // Points must be in clockwise order
1992 12 : cfLaddSide->SetVertex(0, 0, 0);
1993 24 : cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1994 12 : -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1995 12 : cfLaddSide->SetVertex(4, 0, 0);
1996 24 : cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1997 12 : -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1998 24 : if (xSign < 0) {
1999 18 : cfLaddSide->SetVertex(1, 0, -H);
2000 6 : cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2001 6 : cfLaddSide->SetVertex(5, 0, -H);
2002 6 : cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2003 6 : } else {
2004 6 : cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2005 6 : cfLaddSide->SetVertex(3, 0, -H);
2006 6 : cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2007 6 : cfLaddSide->SetVertex(7, 0, -H);
2008 : }
2009 12 : return cfLaddSide;
2010 0 : }
2011 :
2012 :
2013 : //________________________________________________________________________
2014 : TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
2015 : //
2016 : // return a box containing the front-end hybrid
2017 : //
2018 :
2019 2 : Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
2020 :
2021 1 : Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
2022 1 : Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
2023 : // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
2024 1 : Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
2025 1 : +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
2026 1 : Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
2027 : // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
2028 : // + upFLTotalThick + ccUpLayerTotThick);
2029 1 : Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
2030 1 : +fgkHybSMDheight);
2031 1 : Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
2032 1 : +screenTotalThick;
2033 1 : Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
2034 :
2035 : //**************************************************** media :
2036 1 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
2037 1 : TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
2038 1 : TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
2039 1 : TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2040 1 : TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2041 1 : TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
2042 1 : TGeoMedium *niSDD = GetMedium("NICKEL$");
2043 1 : TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2044 1 : TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
2045 1 : TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors
2046 1 : TGeoMedium *medSMDweld = GetMedium("SDD X7R weld$");
2047 :
2048 : //**************************************************** main volume :
2049 : // TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
2050 : // (fgkHybridLength)/2);
2051 1 : Double_t xhybr[6],yhybr[6];
2052 1 : xhybr[0] = -fgkHybridWidth/2;
2053 1 : yhybr[0] = -volumeThick/2;
2054 1 : xhybr[1] = fgkHybridWidth/2;
2055 1 : yhybr[1] = -volumeThick/2;
2056 1 : xhybr[2] = fgkHybridWidth/2;
2057 1 : yhybr[2] = volumeThick/2;
2058 1 : xhybr[3] = -fgkHybridWidth/2;
2059 1 : yhybr[3] = volumeThick/2;
2060 1 : xhybr[4] = xhybr[3] - 1.05*fgkHybCC2SensorLen*SinD(fgkHybCC2SensorAng);
2061 1 : yhybr[4] = yhybr[3] - 1.05*fgkHybCC2SensorLen*CosD(fgkHybCC2SensorAng);
2062 1 : xhybr[5] = xhybr[4];
2063 1 : yhybr[5] = yhybr[4] - volumeThick;
2064 :
2065 1 : TGeoXtru *hybridBox = new TGeoXtru(2);
2066 1 : hybridBox->DefinePolygon(6, xhybr, yhybr);
2067 1 : hybridBox->DefineSection(0,-fgkHybridLength/2);
2068 1 : hybridBox->DefineSection(1, fgkHybridLength/2);
2069 :
2070 1 : TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
2071 : airSDD);
2072 :
2073 2 : TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
2074 1 : fgkHybridThBridgeThick/2,
2075 1 : fgkHybridLength/2);
2076 :
2077 : //**************************************************** Thermal bridge :
2078 2 : TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
2079 1 : sThermalBridge,
2080 : carbonFiberLadderStruct);
2081 1 : vThermalBridge->SetLineColor(fColorCarbonFiber);
2082 2 : TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
2083 1 : +fgkHybridThBridgeThick/2, 0);
2084 1 : hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
2085 :
2086 : //**************************************************** Screen layer :
2087 2 : TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
2088 1 : fgkHybAlThick/2, fgkHybridLength/2);
2089 : //here the upedex and glue layers are both assumed to be polyimide
2090 2 : TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
2091 1 : fgkHybridWidth/2,
2092 1 : (fgkHybUpThick+fgkHybGlueScrnThick)/2,
2093 1 : fgkHybridLength/2);
2094 2 : TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
2095 1 : (screenTotalThick+lowFLTotalThick)/2);
2096 :
2097 2 : TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
2098 1 : -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
2099 :
2100 2 : TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
2101 1 : -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
2102 1 : +fgkHybAlThick/2, 0);
2103 :
2104 2 : TGeoTranslation hybHolePos1Tr(roundHoleX,
2105 1 : -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2106 1 : -fgkHybridLength/2+fgkHybRndHoleZ);
2107 2 : TGeoTranslation hybHolePos2Tr(roundHoleX,
2108 1 : -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
2109 1 : fgkHybridLength/2-fgkHybRndHoleZ);
2110 :
2111 2 : TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
2112 2 : TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
2113 1 : hybHolePos1->SetName("hybHolePos1");
2114 2 : TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
2115 1 : hybHolePos2->SetName("hybHolePos2");
2116 :
2117 1 : upGlueScreenTr->RegisterYourself();
2118 1 : alScreenTr->RegisterYourself();
2119 1 : hybHolePos1->RegisterYourself();
2120 1 : hybHolePos2->RegisterYourself();
2121 2 : delete rotHole;
2122 :
2123 2 : TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
2124 : "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
2125 : "+sRoundHole:hybHolePos2)");
2126 2 : TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
2127 1 : vScreenAl->SetLineColor(fColorAl);
2128 2 : TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
2129 : "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
2130 : "+sRoundHole:hybHolePos2)");
2131 3 : TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
2132 1 : sScreenUpGlue,polyhamideSDD);
2133 1 : vScreenUpGlue->SetLineColor(fColorPolyhamide);
2134 :
2135 1 : hybrid->AddNode(vScreenUpGlue, 1, 0);
2136 1 : hybrid->AddNode(vScreenAl, 1, 0);
2137 :
2138 : //**************************************************** FL low layer :
2139 1 : Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
2140 1 : Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
2141 :
2142 : //here the upedex and glue layers are both assumed to be polyimide
2143 3 : TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
2144 1 : (fgkHybGlueLowThick+fgkHybUpThick)/2,
2145 1 : sideWidth1/2);
2146 3 : TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
2147 1 : fgkHybAlThick/2, sideWidth1/2);
2148 :
2149 3 : TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
2150 1 : lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2151 1 : -(fgkHybridLength-sideWidth1)/2);
2152 3 : TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
2153 1 : lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2154 1 : -(fgkHybridLength-sideWidth1)/2);
2155 1 : upGlueBarTr1->RegisterYourself();
2156 1 : alBarTr1->RegisterYourself();
2157 :
2158 2 : TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
2159 : "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
2160 2 : TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
2161 : "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
2162 3 : TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
2163 1 : sLowUpGlueBar1, polyhamideSDD);
2164 3 : TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
2165 1 : sLowAlBar1, alSDD);
2166 1 : vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
2167 1 : vLowAlBar1->SetLineColor(fColorAl);
2168 1 : hybrid->AddNode(vLowUpGlueBar1,1,0);
2169 1 : hybrid->AddNode(vLowAlBar1,1,0);
2170 :
2171 : //---
2172 : //here the upedex and glue layers are both assumed to be polyimide
2173 3 : TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
2174 1 : (fgkHybGlueLowThick+fgkHybUpThick)/2,
2175 1 : sideWidth2/2);
2176 3 : TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
2177 1 : fgkHybAlThick/2, sideWidth2/2);
2178 :
2179 3 : TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
2180 1 : lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
2181 1 : (fgkHybridLength-sideWidth2)/2);
2182 3 : TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
2183 1 : lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
2184 1 : (fgkHybridLength-sideWidth2)/2);
2185 1 : upGlueBarTr2->RegisterYourself();
2186 1 : alBarTr2->RegisterYourself();
2187 :
2188 2 : TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
2189 : "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
2190 2 : TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
2191 : "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
2192 2 : TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
2193 : polyhamideSDD);
2194 2 : TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
2195 : alSDD);
2196 1 : vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
2197 1 : vLowAlBar2->SetLineColor(fColorAl);
2198 1 : hybrid->AddNode(vLowUpGlueBar2, 1, 0);
2199 1 : hybrid->AddNode(vLowAlBar2, 1, 0);
2200 :
2201 1 : if(GetDebug(3)) { // Remove compiler warning.
2202 0 : sAlScreenLayer->InspectShape();
2203 0 : sUpGlueScreenLayer->InspectShape();
2204 0 : sRoundHole->InspectShape();
2205 0 : sUpGlueBar1->InspectShape();
2206 0 : sUpGlueBar2->InspectShape();
2207 0 : sAlBar1->InspectShape();
2208 0 : sAlBar2->InspectShape();
2209 : };
2210 : //---
2211 : //using class AliITSv11GeomCableFlat to add 2-layer segments ...
2212 1 : Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
2213 1 : AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
2214 : lowFLTotalThick);
2215 1 : lowFLpiece.SetNLayers(2);
2216 2 : lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
2217 1 : fColorPolyhamide);
2218 1 : lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
2219 : // alSDD at 80% : mostly to take into account strips of piece 3
2220 :
2221 3 : Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
2222 1 : lowLayerYmin + lowFLTotalThick/2,
2223 1 : -fgkHybridLength/2 + sideWidth1 };
2224 1 : Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
2225 1 : Double_t vZ[3] = {0,0,1};
2226 1 : lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2227 1 : lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2228 1 : lowFLpiece.SetInitialNode(hybrid);
2229 1 : lowFLpiece.CreateAndInsertBoxCableSegment(1);
2230 1 : lowFLpiece.ResetPoints();
2231 :
2232 1 : Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
2233 1 : -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
2234 :
2235 1 : lowFLpiece.SetWidth(piece2width);
2236 1 : lowFLpiece.SetName("lowFLpiece2");
2237 1 : x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
2238 1 : x2[0] = x1[0];
2239 1 : lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2240 1 : lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2241 1 : lowFLpiece.CreateAndInsertBoxCableSegment(1);
2242 1 : lowFLpiece.ResetPoints();
2243 :
2244 1 : Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
2245 1 : - fgkHybFLlowHoleAmbDX/2;
2246 :
2247 1 : lowFLpiece.SetWidth(piece3width);
2248 1 : lowFLpiece.SetName("lowFLpiece3");
2249 1 : x1[0] = fgkHybridWidth/2-piece3width/2;
2250 1 : x2[0] = x1[0];
2251 1 : lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
2252 1 : lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
2253 1 : lowFLpiece.CreateAndInsertBoxCableSegment(1);
2254 :
2255 3 : Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
2256 2 : fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
2257 1 : Double_t vX[3] = {1,0,0};
2258 8 : for (Int_t i=0; i<3; i++) {
2259 3 : char ch[20];
2260 3 : snprintf(ch, 20, "lowFLpieceA%i", i+4);
2261 3 : lowFLpiece.SetName(ch);
2262 3 : lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
2263 :
2264 3 : lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
2265 3 : x1[0] = -fgkHybridWidth/2 + piece1width;
2266 3 : x2[0] = x1[0] + fgkHybFLlowHolePasDX;
2267 3 : Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
2268 3 : x1[2] = zPiece; x2[2] = zPiece;
2269 3 : lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
2270 3 : lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
2271 3 : lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2272 3 : lowFLpiece.ResetPoints();
2273 :
2274 3 : snprintf(ch, 20, "lowFLpieceB%i", i+4);
2275 3 : lowFLpiece.SetName(ch);
2276 3 : x1[0] = fgkHybridWidth/2 - piece3width;
2277 3 : x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
2278 3 : lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
2279 3 : lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
2280 3 : lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
2281 3 : };
2282 :
2283 : //**************************************************** chips+CC:
2284 1 : AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
2285 1 : chip.SetInitialNode(hybrid);
2286 1 : chip.SetNLayers(5);
2287 1 : chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
2288 1 : chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
2289 1 : chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
2290 2 : chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
2291 1 : fColorPolyhamide);
2292 1 : chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
2293 : // Here the tho CC (low+up) are merged
2294 : // In fact, the last layer has a smaller surface of Al -> I put 80%
2295 :
2296 1 : x1[1] = lowLayerYmin + chipsCCTotThick/2;
2297 1 : x2[1] = x1[1];
2298 1 : char ch[20];
2299 :
2300 10 : for (Int_t i=0; i<4; i++) {
2301 4 : snprintf(ch, 20, "pascalCC%i", i);
2302 4 : chip.SetName(ch);
2303 4 : x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2304 4 : x2[0] = x1[0] + fgkHybPascalDX;
2305 4 : x1[2] = zChips[i] - fgkHybridLength/2;
2306 4 : x2[2] = x1[2];
2307 4 : chip.AddCheckPoint( hybrid, 0, x1, vX );
2308 4 : chip.AddCheckPoint( hybrid, 1, x2, vX );
2309 4 : chip.CreateAndInsertBoxCableSegment(1,-90);
2310 4 : chip.ResetPoints();
2311 :
2312 4 : snprintf(ch, 20, "ambraCC%i", i);
2313 4 : chip.SetName(ch);
2314 4 : x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
2315 4 : x2[0] = x1[0] + fgkHybAmbraDX;
2316 4 : chip.AddCheckPoint( hybrid, 0, x1, vX );
2317 4 : chip.AddCheckPoint( hybrid, 1, x2, vX );
2318 4 : chip.CreateAndInsertBoxCableSegment(1,-90);
2319 4 : chip.ResetPoints();
2320 : };
2321 :
2322 : //**************************************************** CC outside chips:
2323 : // I don't think there is a second aluminium layer here ...
2324 10 : for (Int_t i = 0; i<4; i++) {
2325 4 : snprintf(ch, 20, "ccLayerA%i", i);
2326 :
2327 4 : AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
2328 4 : ccLayer1.SetInitialNode(hybrid);
2329 4 : ccLayer1.SetNLayers(2);
2330 4 : ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2331 4 : ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2332 : // Al at ~50%
2333 :
2334 4 : x1[0] = -fgkHybridWidth/2;
2335 4 : x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
2336 8 : x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
2337 4 : + fgkHybChipThick + ccUpLayerTotThick/2;
2338 4 : x2[1] = x1[1];
2339 4 : x1[2] = zChips[i] - fgkHybridLength/2;
2340 4 : x2[2] = x1[2];
2341 4 : ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
2342 4 : ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
2343 4 : ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
2344 :
2345 4 : snprintf(ch, 20, "ccLayerB%i", i);
2346 4 : AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
2347 4 : ccLayer2.SetInitialNode(hybrid);
2348 4 : ccLayer2.SetNLayers(2);
2349 4 : ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
2350 4 : ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
2351 : // Al at ~50%
2352 :
2353 4 : x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
2354 4 : x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
2355 4 : ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2356 4 : ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2357 4 : ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2358 4 : ccLayer2.ResetPoints();
2359 4 : snprintf(ch, 20, "ccLayerC%i", i);
2360 4 : ccLayer2.SetName(ch);
2361 4 : x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
2362 4 : x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
2363 8 : x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
2364 4 : + ccUpLayerTotThick/2;
2365 4 : x2[1] = x1[1];
2366 :
2367 4 : ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
2368 4 : ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
2369 4 : ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
2370 :
2371 : //**************************************************** CC to sensors:
2372 : // (alas, we cannot use GeomCableFlat here because section is not constant)
2373 4 : Double_t xcc[8],ycc[8];
2374 4 : xcc[0] = -0.5*ccLayer1.GetWidth();
2375 4 : ycc[0] = 0;
2376 4 : xcc[1] = 0.5*ccLayer1.GetWidth();
2377 4 : ycc[1] = 0;
2378 4 : xcc[2] = xcc[1];
2379 4 : ycc[2] = -fgkHybCC2SensorLen*0.8;
2380 4 : xcc[3] = xcc[2] + 0.1*fgkHybCC2SensorWid;
2381 4 : ycc[3] = ycc[2];
2382 4 : xcc[4] = xcc[3];
2383 4 : ycc[4] = -fgkHybCC2SensorLen;
2384 4 : xcc[5] = xcc[4] - fgkHybCC2SensorWid;
2385 4 : ycc[5] = ycc[4];
2386 4 : xcc[6] = xcc[5];
2387 4 : ycc[6] = 0.8*ycc[5];
2388 4 : xcc[7] = xcc[0];
2389 4 : ycc[7] = 0.2*ycc[5];
2390 :
2391 8 : TGeoXtru* ccToSensPoliSh = new TGeoXtru(2);
2392 4 : ccToSensPoliSh->DefinePolygon(8, xcc, ycc);
2393 4 : ccToSensPoliSh->DefineSection(0, 0.);
2394 4 : ccToSensPoliSh->DefineSection(1, ccLayer1.GetThickness());
2395 :
2396 4 : snprintf(ch, 20, "ccToSens%i", i);
2397 8 : TGeoVolume* ccToSensPoliVol = new TGeoVolume(ch, ccToSensPoliSh, polyhamideSDD);
2398 4 : ccToSensPoliVol->SetLineColor(fColorPolyhamide);
2399 :
2400 8 : TGeoXtru* ccToSensAlSh = new TGeoXtru(2);
2401 4 : xcc[6] += 0.001;
2402 4 : ycc[7] -= 0.001;
2403 4 : ccToSensAlSh->DefinePolygon(8, xcc, ycc);
2404 4 : ccToSensAlSh->DefineSection(0, 0.);
2405 4 : ccToSensAlSh->DefineSection(1, fgkHybAlCCThick);
2406 :
2407 4 : snprintf(ch, 20, "ccToSensAl%i", i);
2408 8 : TGeoVolume* ccToSensAlVol = new TGeoVolume(ch, ccToSensAlSh, alSDD50p100);
2409 4 : ccToSensAlVol->SetLineColor(fColorAl);
2410 :
2411 4 : ccToSensPoliVol->AddNode(ccToSensAlVol, 1, 0);
2412 :
2413 4 : Double_t coord[3];
2414 4 : ccLayer1.GetPoint(0,coord);
2415 8 : hybrid->AddNode(ccToSensPoliVol, i+1,
2416 16 : new TGeoCombiTrans(coord[0], coord[1], coord[2],
2417 8 : new TGeoRotation("",-90-fgkHybCC2SensorAng, 90, 90)));
2418 4 : };
2419 :
2420 : //**************************************************** FL UP:
2421 : // (last Al layer will be a special triangular shape)
2422 3 : TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
2423 1 : fgkHybFLUpperWidth/2, flUpThick/2,
2424 1 : fgkHybFLUpperLength/2);
2425 3 : TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
2426 1 : sFLupPolyhamide, polyhamideSDD);
2427 1 : vFLupPolyhamide->SetLineColor(fColorPolyhamide);
2428 : TGeoTranslation *trFLupPolyhamide =
2429 3 : new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
2430 1 : lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
2431 :
2432 1 : hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
2433 :
2434 2 : TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
2435 1 : aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2436 1 : aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2437 1 : aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2438 1 : aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
2439 1 : aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2440 1 : aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
2441 1 : aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
2442 1 : aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
2443 2 : TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
2444 : // Al at ~50%
2445 :
2446 1 : vAluStrip->SetLineColor(fColorAl);
2447 : //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
2448 2 : TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
2449 :
2450 : Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
2451 1 : +flUpThick+fgkHybAlThick/2;
2452 3 : TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
2453 1 : fgkHybridWidth/2,yRotAluStrip,
2454 1 : fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
2455 2 : TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
2456 1 : AddTranslationToCombiTrans(aluStripTr2,0,0,
2457 1 : fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
2458 2 : TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
2459 1 : AddTranslationToCombiTrans(aluStripTr3,0,0,
2460 1 : fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
2461 2 : TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
2462 1 : AddTranslationToCombiTrans(aluStripTr4,0,0,
2463 1 : fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
2464 :
2465 1 : hybrid->AddNode(vAluStrip, 1, aluStripTr1);
2466 1 : hybrid->AddNode(vAluStrip, 2, aluStripTr2);
2467 1 : hybrid->AddNode(vAluStrip, 3, aluStripTr3);
2468 1 : hybrid->AddNode(vAluStrip, 4, aluStripTr4);
2469 : //**************************************************** SMD:
2470 3 : TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
2471 1 : fgkHybSMDmiddleL/2+fgkHybSMDendL,
2472 1 : fgkHybSMDheight/2,fgkHybSMDendW/2);
2473 2 : TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
2474 :
2475 3 : TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
2476 1 : fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
2477 1 : fgkHybSMDmiddleW/2);
2478 3 : TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
2479 1 : hybSMDmiddle,medSMD);
2480 1 : vHybSMDmiddle->SetLineColor(fColorSMD);
2481 3 : TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
2482 1 : fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
2483 3 : TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
2484 1 : hybSMDend,medSMDweld);
2485 1 : vHybSMDend->SetLineColor(fColorSMDweld);
2486 3 : TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
2487 1 : (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2488 3 : TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
2489 1 : -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
2490 1 : vHybSMD->AddNode(vHybSMDmiddle,1,0);
2491 1 : vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
2492 1 : vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
2493 52 : for (Int_t i=0; i<fgkNHybSMD; i++) {
2494 75 : TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
2495 25 : -fgkHybridWidth/2+fgkHybSMDposX[i],
2496 25 : lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
2497 25 : -fgkHybridLength/2+fgkHybSMDposZ[i]);
2498 25 : hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
2499 : };
2500 :
2501 : if (iLRSide == 0) {
2502 : };
2503 :
2504 1 : if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
2505 1 : hybrid->SetVisibility(kFALSE);
2506 : return hybrid;
2507 1 : }
2508 :
2509 : //________________________________________________________________________
2510 : TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
2511 : //
2512 : // Return a TGeoVolume* containing a segment of a ladder.
2513 : //
2514 :
2515 28 : TGeoMedium *phynoxSDD = GetMedium("INOX$");
2516 14 : TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2517 14 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
2518 14 : TGeoMedium *alSDD = GetMedium("AL$");
2519 :
2520 14 : Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2521 14 : Double_t segmentLength = fgkSegmentLength;
2522 14 : Double_t spaceBetweenCables = 500*fgkmicron;
2523 :
2524 : //*****************************************
2525 : // Set parameters according to (iLay,iSeg):
2526 : //*****************************************
2527 : Int_t nDetectors = fgkLay3Ndet;
2528 14 : Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2529 28 : Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2530 28 : (fgkSegmentLength*fgkLay3Ndet/2. -
2531 28 : fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2532 : // sensorCenterZPos = z in segment local coord syst.
2533 :
2534 14 : AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2535 14 : AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2536 :
2537 14 : if (iLay==3) {
2538 8 : } else if (iLay==4) {
2539 : nDetectors = fgkLay4Ndet;
2540 8 : coolPipeSuppH = fgkLay4CoolPipeSuppH;
2541 16 : sensorCenterZPos = fLay4sensorZPos[iSeg]-
2542 8 : (fgkSegmentLength*fgkLay4Ndet/2. -
2543 8 : fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2544 8 : digitCableA = fDigitCableLay4A;
2545 8 : digitCableB = fDigitCableLay4B;
2546 8 : } else
2547 0 : printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2548 :
2549 :
2550 : Double_t cableSideSign = -1;
2551 14 : if (iSeg<nDetectors/2) cableSideSign = 1;
2552 14 : Double_t spaceForCables = spaceBetweenCables*
2553 28 : (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2554 14 : +0.1*fgkmicron;
2555 : // gives [0-1-2-2-1-0]*spaceBetweenCables
2556 : // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2557 : Int_t iUpdateCableMin;
2558 : Int_t iUpdateCableMax;
2559 14 : if (cableSideSign==-1) {
2560 : iUpdateCableMin = nDetectors/2;
2561 7 : iUpdateCableMax = iSeg-1;
2562 7 : } else {
2563 7 : iUpdateCableMin = iSeg+1;
2564 7 : iUpdateCableMax = nDetectors/2-1;
2565 : };
2566 :
2567 14 : if(GetDebug(1)){
2568 0 : cout << "Segment ("<< iLay <<',' << iSeg
2569 0 : << ") : sensor z shift in local segment coord.="
2570 0 : << sensorCenterZPos << endl;
2571 0 : };
2572 :
2573 : //****************************
2574 : // The segment volume
2575 : //****************************
2576 :
2577 : // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2578 : // likely slows down the transport of particles through the geometry
2579 :
2580 : //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2581 :
2582 : // TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2583 : // fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2584 : // fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2585 : // segmentLength/2);
2586 : // A shaped Xtru instead of a simple BBox to avoid overlaps and extrusions
2587 14 : TGeoXtru *segBox = new TGeoXtru(2);
2588 14 : segBox->SetName("ITSsddSegBox");
2589 :
2590 14 : Double_t xseg[12],yseg[12];
2591 14 : xseg[ 0] = -(fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW);
2592 14 : yseg[ 0] = fgkLadderHeight/2+fgkLadderSegBoxDH/2;
2593 14 : xseg[ 1] = xseg[0];
2594 14 : yseg[ 1] = -yseg[0];
2595 14 : xseg[ 2] = 0.87*xseg[1];
2596 14 : yseg[ 2] = yseg[1];
2597 14 : xseg[ 3] = 0.77*xseg[1];
2598 14 : yseg[ 3] = -yseg[0] - 0.62*fgkHybCC2SensorLen;
2599 14 : xseg[ 4] = 0.72*xseg[1];
2600 14 : yseg[ 4] = yseg[3];
2601 14 : xseg[ 5] = 0.83*xseg[1];
2602 14 : yseg[ 5] = yseg[1];
2603 :
2604 196 : for (Int_t j=0; j<6; j++) {
2605 84 : xseg[6+j] = -xseg[5-j];
2606 84 : yseg[6+j] = yseg[5-j];
2607 : }
2608 :
2609 14 : segBox->DefinePolygon(12, xseg, yseg);
2610 14 : segBox->DefineSection(0,-segmentLength/2);
2611 14 : segBox->DefineSection(1, segmentLength/2);
2612 :
2613 28 : TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2614 14 : segBox, airSDD);
2615 14 : virtualSeg->SetVisibility(kFALSE);
2616 :
2617 : //******************************
2618 : // Carbon fiber structure :
2619 : //******************************
2620 :
2621 14 : virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2622 : Int_t volumeIndex = 1;
2623 560 : for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2624 266 : if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2625 154 : volumeIndex++;
2626 : else
2627 : volumeIndex = 1;
2628 532 : virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2629 266 : fLaddSegCommonTr[i]);
2630 : };
2631 :
2632 : //**********************************
2633 : // Pine support of the sensors :
2634 : //**********************************
2635 14 : TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2636 14 : TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2637 :
2638 : // The use of the following constructor type allow to use rotPS1 and rotPS2
2639 : // (and not copy them) therefore we gain some memory
2640 28 : TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2641 14 : - fgkLadderHeight/2.-tDY
2642 14 : + fgkPinSuppHeight/2.,
2643 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2644 :
2645 28 : TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2646 14 : - fgkLadderHeight/2.-tDY
2647 14 : + fgkPinSuppHeight/2.,
2648 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2649 14 : AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2650 :
2651 28 : TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2652 14 : - fgkLadderHeight/2.-tDY
2653 14 : + fgkPinSuppHeight/2.,
2654 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2655 14 : AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2656 :
2657 28 : TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2658 14 : - fgkLadderHeight/2.-tDY
2659 14 : + fgkPinSuppHeight/2.,
2660 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2661 14 : AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2662 :
2663 28 : TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2664 14 : - fgkLadderHeight/2. - tDY
2665 14 : + fgkPinSuppHeight/2.,
2666 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2667 :
2668 28 : TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2669 14 : - fgkLadderHeight/2. - tDY
2670 14 : + fgkPinSuppHeight/2.,
2671 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2672 14 : AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2673 :
2674 28 : TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2675 14 : - fgkLadderHeight/2. - tDY
2676 14 : + fgkPinSuppHeight/2.,
2677 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2678 14 : AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2679 :
2680 28 : TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2681 14 : - fgkLadderHeight/2. - tDY
2682 14 : + fgkPinSuppHeight/2.,
2683 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2684 14 : AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2685 :
2686 14 : virtualSeg->AddNode(fPinSupport, 1, transPS1);
2687 14 : virtualSeg->AddNode(fPinSupport, 2, transPS2);
2688 14 : virtualSeg->AddNode(fPinSupport, 3, transPS3);
2689 14 : virtualSeg->AddNode(fPinSupport, 4, transPS4);
2690 14 : virtualSeg->AddNode(fPinSupport, 5, transPS5);
2691 14 : virtualSeg->AddNode(fPinSupport, 6, transPS6);
2692 14 : virtualSeg->AddNode(fPinSupport, 7, transPS7);
2693 14 : virtualSeg->AddNode(fPinSupport, 8, transPS8);
2694 :
2695 14 : TGeoMedium *pinMed = GetMedium("RYTON$");
2696 14 : Double_t fgkPinHeight = 4.5*fgkmm;
2697 28 : TGeoTube *pineS = new TGeoTube("ITSsddPin",0,fgkPinR,
2698 14 : fgkPinHeight/2.);
2699 14 : TGeoVolume *pineV = new TGeoVolume("ITSsddPinVol", pineS, pinMed);
2700 :
2701 28 : TGeoCombiTrans *transPS2b = new TGeoCombiTrans( fgkPinDYOnSensor,
2702 14 : - fgkLadderHeight/2.-tDY
2703 14 : + fgkPinHeight/2.,
2704 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2705 14 : AddTranslationToCombiTrans(transPS2b, 0, 0, fgkPinPinDDXOnSensor);
2706 14 : virtualSeg->AddNode(pineV, 1, transPS2b);
2707 :
2708 28 : TGeoCombiTrans *transPS6b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2709 14 : - fgkLadderHeight/2. - tDY
2710 14 : + fgkPinHeight/2.,
2711 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2712 14 : AddTranslationToCombiTrans(transPS6b, 0, 0, fgkPinPinDDXOnSensor);
2713 14 : virtualSeg->AddNode(pineV, 2, transPS6b);
2714 :
2715 :
2716 28 : TGeoCombiTrans *transPS4b = new TGeoCombiTrans( fgkPinDYOnSensor,
2717 14 : - fgkLadderHeight/2.-tDY
2718 14 : + fgkPinHeight/2.,
2719 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2720 14 : AddTranslationToCombiTrans(transPS4b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2721 14 : virtualSeg->AddNode(pineV, 3, transPS4b);
2722 :
2723 28 : TGeoCombiTrans *transPS8b = new TGeoCombiTrans( -fgkPinDYOnSensor,
2724 14 : - fgkLadderHeight/2. - tDY
2725 14 : + fgkPinHeight/2.,
2726 14 : sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2727 14 : AddTranslationToCombiTrans(transPS8b, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2728 14 : virtualSeg->AddNode(pineV, 4, transPS8b);
2729 :
2730 :
2731 : //******************************
2732 : // Cooling pipe supports :
2733 : //******************************
2734 14 : Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2735 14 : Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2736 28 : Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2737 28 : fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2738 :
2739 28 : Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2740 14 : (triangleHeight+triangleCPaxeDist/
2741 28 : TMath::Sin(halfTheta)-coolPipeSuppH);
2742 14 : if (fAddCoolingSyst) {
2743 14 : TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2744 14 : TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2745 28 : TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2746 14 : -fgkLadderHeight/2. - tDY
2747 14 : +coolPipeSuppH+fgkLadderBeamRadius,
2748 : -segmentLength/2., rotCPS1);
2749 :
2750 28 : TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2751 14 : -fgkLadderHeight/2. - tDY
2752 14 : +coolPipeSuppH+fgkLadderBeamRadius,
2753 : -segmentLength/2., rotCPS1);
2754 14 : AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2755 :
2756 28 : TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2757 14 : -fgkLadderHeight/2.- tDY
2758 14 : +coolPipeSuppH+fgkLadderBeamRadius,
2759 : segmentLength/2., rotCPS2);
2760 :
2761 28 : TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2762 14 : -fgkLadderHeight/2.- tDY
2763 14 : +coolPipeSuppH+fgkLadderBeamRadius,
2764 : segmentLength/2., rotCPS2);
2765 14 : AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2766 :
2767 14 : virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2768 14 : virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2769 14 : virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2770 14 : virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2771 14 : };
2772 :
2773 : //************************
2774 : // Cooling pipes :
2775 : //************************
2776 28 : TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2777 28 : -fgkLadderHeight/2. - tDY +
2778 28 : fgkLadderBeamRadius+coolPipeSuppH, 0);
2779 28 : TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2780 28 : -fgkLadderHeight/2.- tDY +
2781 28 : fgkLadderBeamRadius+coolPipeSuppH, 0);
2782 :
2783 14 : if (fAddCoolingSyst) {
2784 28 : TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2785 14 : fgkCoolPipeOuterDiam/2,
2786 : segmentLength/2);
2787 14 : TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2788 : segmentLength/2);
2789 :
2790 28 : TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2791 14 : coolingPipeShape, phynoxSDD );
2792 14 : coolingPipe->SetLineColor(fColorPhynox);
2793 14 : TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2794 : coolerMediumSDD );
2795 :
2796 :
2797 14 : virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2798 14 : virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2799 14 : if (fCoolingOn) {
2800 14 : virtualSeg->AddNode(cooler, 1, pipeTr1);
2801 14 : virtualSeg->AddNode(cooler, 2, pipeTr2);
2802 14 : };
2803 14 : };
2804 :
2805 : //**********************************
2806 : // Bases of hybrid thermal bridges
2807 : //**********************************
2808 : Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2809 : // approx !!! not clear on 0752/14-A
2810 14 : if (fAddCoolingSyst) {
2811 14 : TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2812 14 : TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2813 28 : TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2814 28 : TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2815 :
2816 14 : virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2817 14 : virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2818 14 : };
2819 :
2820 : //*************************
2821 : // the 2 hybrids :
2822 : //*************************
2823 14 : Double_t hybDy = ((TGeoXtru*)fHybrid->GetShape())->GetY(2);
2824 14 : Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2825 :
2826 14 : Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2827 14 : - shiftHyb*SinD(fgkHybridAngle) );
2828 14 : Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2829 14 : + shiftHyb*CosD(fgkHybridAngle) );
2830 14 : if (fAddHybrids) {
2831 14 : TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2832 14 : TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2833 28 : TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2834 28 : TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2835 14 : AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2836 14 : AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2837 :
2838 14 : virtualSeg->AddNode(fHybrid, 1, hybTr1);
2839 14 : virtualSeg->AddNode(fHybrid, 2, hybTr2);
2840 14 : };
2841 :
2842 : //***********
2843 : // cables
2844 : //***********
2845 14 : if (fAddCables) {
2846 : // Starting from this segment
2847 14 : Double_t hybDz = ((TGeoXtru*)fHybrid->GetShape())->GetZ(1);
2848 14 : Double_t hybDx = ((TGeoXtru*)fHybrid->GetShape())->GetX(1);
2849 14 : Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2850 14 : - digitCableA->GetWidth()/2;
2851 14 : Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2852 14 : - digitCableA->GetThickness()/2;
2853 :
2854 : Double_t digitCableX = ( coolPipeSuppL
2855 14 : + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2856 14 : - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2857 14 : Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2858 14 : + fgkLadderBeamRadius+coolPipeSuppH
2859 14 : + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2860 14 : + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2861 :
2862 :
2863 28 : Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2864 14 : digitCableY, cableSideSign*hybDz };
2865 56 : Double_t digitCableCenterA1[3] = {
2866 14 : -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2867 14 : digitCableY+spaceForCables*SinD(fgkHybridAngle),
2868 14 : cableSideSign*segmentLength/2 };
2869 :
2870 14 : Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2871 : digitCableY,cableSideSign*hybDz};
2872 42 : Double_t digitCableCenterB1[3]={
2873 14 : cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2874 14 : digitCableY+spaceForCables*SinD(fgkHybridAngle),
2875 : cableSideSign*segmentLength/2 };
2876 :
2877 14 : Double_t vZ[3] = {0,0,1};
2878 14 : digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2879 14 : digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2880 14 : digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2881 14 : digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2882 :
2883 : // Updating the other cables
2884 64 : for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2885 :
2886 18 : Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2887 18 : Double_t coord[3];
2888 18 : digitCableA[iCable].GetPoint( 1, coord);
2889 18 : digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2890 18 : digitCableB[iCable].GetPoint( 1, coord);
2891 18 : digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2892 18 : };
2893 :
2894 : // Now the small Al foil on the same hybrid side
2895 14 : Double_t xfoil[5],yfoil[5];
2896 14 : hybDx *= 0.95;
2897 14 : xfoil[0] = -fgkHybridAlFoilWide/2;
2898 14 : yfoil[0] = hybDx;
2899 14 : xfoil[1] = fgkHybridAlFoilWide/2;
2900 14 : yfoil[1] = yfoil[0];
2901 14 : xfoil[2] = xfoil[1];
2902 14 : yfoil[2] = -hybDx + (fgkHybridAlFoilWide - fgkHybridAlFoilSide);
2903 14 : xfoil[3] = xfoil[0] + fgkHybridAlFoilSide;
2904 14 : yfoil[3] = -hybDx;
2905 14 : xfoil[4] = xfoil[0];
2906 14 : yfoil[4] = yfoil[3];
2907 :
2908 14 : TGeoXtru* alFoilSh = new TGeoXtru(2);
2909 14 : alFoilSh->DefinePolygon(5, xfoil, yfoil);
2910 14 : alFoilSh->DefineSection(0,-fgkHybridAlFoilThick/2);
2911 14 : alFoilSh->DefineSection(1, fgkHybridAlFoilThick/2);
2912 :
2913 14 : TGeoVolume* alFoilVol = new TGeoVolume("ITSsddAlFoilHybSide", alFoilSh, alSDD);
2914 14 : alFoilVol->SetLineColor(fColorAl);
2915 :
2916 14 : Double_t zFoilTrans = cableSideSign*(hybDz + alFoilSh->GetX(1));
2917 14 : TGeoRotation rotFoil3;
2918 14 : TGeoRotation rotFoil4;
2919 14 : if (cableSideSign > 0) {
2920 21 : rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, -90, -90);
2921 21 : rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, 90, 90);
2922 7 : } else {
2923 21 : rotFoil3 = TGeoRotation("", 90-fgkHybridAngle, 90, -90);
2924 21 : rotFoil4 = TGeoRotation("",-90+fgkHybridAngle, -90, 90);
2925 : }
2926 28 : TGeoCombiTrans *foiTr1 = new TGeoCombiTrans(*pipeTr2, rotFoil3);
2927 28 : TGeoCombiTrans *foiTr2 = new TGeoCombiTrans(*pipeTr1, rotFoil4);
2928 14 : AddTranslationToCombiTrans( foiTr1, -hybrVolX, hybrVolY, zFoilTrans);
2929 14 : AddTranslationToCombiTrans( foiTr2, hybrVolX, hybrVolY, zFoilTrans);
2930 :
2931 14 : virtualSeg->AddNode(alFoilVol, 1, foiTr1);
2932 14 : virtualSeg->AddNode(alFoilVol, 2, foiTr2);
2933 14 : };
2934 :
2935 : //**********************************
2936 14 : if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2937 14 : return virtualSeg;
2938 14 : }
2939 :
2940 :
2941 : //________________________________________________________________________
2942 : TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2943 : //
2944 : // Create a pine support and its pine
2945 : // axis of rotation is the cone axis, center in its middle
2946 : //
2947 2 : TGeoMedium *rytonSDD = GetMedium("RYTON$");
2948 :
2949 2 : TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2950 2 : 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2951 2 : fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2952 2 : TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2953 1 : fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2954 2 : TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2955 1 : fgkPinSuppHeight/2.+0.00001);
2956 : // 0.00001 is for seing the actual hole (avoid viewer artefact)
2957 :
2958 1 : if(GetDebug(3)){// Remove compiler warning.
2959 0 : cone->InspectShape();
2960 0 : tong->InspectShape();
2961 0 : hole->InspectShape();
2962 0 : };
2963 :
2964 2 : TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2965 1 : fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2966 1 : tongTrans->RegisterYourself();
2967 1 : TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2968 : "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2969 : "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2970 :
2971 1 : TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport", pinSupportShape,
2972 : rytonSDD);
2973 1 : pinSupport->SetLineColor(fColorRyton);
2974 :
2975 1 : return pinSupport;
2976 0 : }
2977 :
2978 :
2979 : //________________________________________________________________________
2980 : TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2981 : //
2982 : // Create half of the cooling pipe support (ALR-0752/3)
2983 : //
2984 :
2985 2 : Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2986 :
2987 1 : TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2988 1 : side1->SetName("ITSsddCPSside1");
2989 1 : side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2990 1 : side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
2991 2 : side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2992 1 : fgkCoolPipeSuppWidthExt/2.);
2993 2 : side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
2994 1 : -fgkCoolPipeSuppWidthExt/2.);
2995 1 : side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2996 1 : side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
2997 2 : side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2998 1 : fgkCoolPipeSuppWidthExt/2.);
2999 2 : side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
3000 1 : -fgkCoolPipeSuppWidthExt/2.);
3001 :
3002 2 : TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
3003 1 : - fgkCoolPipeSuppAxeDist
3004 1 : + fgkCoolPipeSuppWidthExt/2., 0);
3005 1 : side1Tr->RegisterYourself();
3006 2 : TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
3007 1 : - fgkCoolPipeSuppAxeDist
3008 1 : + fgkCoolPipeSuppWidthExt*3/2.
3009 1 : + fgkCoolPipeSuppWidthIn,0);
3010 1 : side2Tr->RegisterYourself();
3011 :
3012 2 : TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
3013 1 : (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
3014 1 : fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
3015 : TGeoTranslation *middleTr =
3016 2 : new TGeoTranslation("ITSsddCPStr3",
3017 1 : (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
3018 1 : -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
3019 1 : +fgkCoolPipeSuppWidthIn/2., 0);
3020 1 : middleTr->RegisterYourself();
3021 :
3022 2 : TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
3023 1 : fgkCoolPipeSuppTongW/4.,
3024 1 : (fgkCoolPipeSuppFulWidth
3025 1 : - 2*fgkCoolPipeSuppWidthExt
3026 1 : - fgkCoolPipeSuppWidthIn)/2,
3027 1 : fgkCoolPipeSuppHeight/2.);
3028 :
3029 2 : TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
3030 1 : fgkCoolPipeSuppTongW/4.,
3031 1 : - fgkCoolPipeSuppAxeDist
3032 1 : + fgkCoolPipeSuppFulWidth
3033 2 : - axeBox->GetDY(), 0);
3034 1 : axeBoxTr->RegisterYourself();
3035 :
3036 2 : TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
3037 1 : fgkCoolPipeSuppTongW/4.);
3038 :
3039 1 : TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
3040 2 : TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
3041 1 : fgkCoolPipeSuppTongW/4.,0,0,axeRot);
3042 1 : axeTrans->RegisterYourself();
3043 : //delete axeRot; // make the code crash, no idea of why !!!
3044 :
3045 1 : if(GetDebug(3)){
3046 0 : middle->InspectShape();
3047 0 : axe->InspectShape();
3048 0 : };
3049 :
3050 1 : TGeoMedium *rytonSDD = GetMedium("RYTON$");
3051 :
3052 1 : TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
3053 : "ITSsddCoolPipeSuppShapeL",
3054 : "ITSsddCPSmiddle:ITSsddCPStr3"
3055 : "+ITSsddCPSside1:ITSsddCPStr1"
3056 : "+ITSsddCPSside1:ITSsddCPStr2"
3057 : "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
3058 : "-ITSsddCPSaxe:ITSsddCPSaxeTr");
3059 2 : TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
3060 1 : coolPipeSuppShape, rytonSDD);
3061 :
3062 1 : coolPipeSupp->SetLineColor(fColorRyton);
3063 :
3064 1 : return coolPipeSupp;
3065 0 : }
3066 :
3067 :
3068 : //________________________________________________________________________
3069 : TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
3070 : //
3071 : //Create half of the cooling pipe support (ALR-0752/3)
3072 : //
3073 :
3074 2 : Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
3075 :
3076 1 : TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
3077 1 : side1->SetName("ITSsddCPSside1R");
3078 1 : side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
3079 2 : side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
3080 1 : -fgkCoolPipeSuppWidthExt/2.);
3081 2 : side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
3082 1 : fgkCoolPipeSuppWidthExt/2.);
3083 1 : side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
3084 1 : side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
3085 2 : side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
3086 1 : -fgkCoolPipeSuppWidthExt/2.);
3087 2 : side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
3088 1 : fgkCoolPipeSuppWidthExt/2.);
3089 1 : side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
3090 :
3091 2 : TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
3092 1 : - fgkCoolPipeSuppAxeDist
3093 1 : + fgkCoolPipeSuppWidthExt/2., 0);
3094 1 : side1Tr->RegisterYourself();
3095 2 : TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
3096 1 : - fgkCoolPipeSuppAxeDist
3097 1 : + fgkCoolPipeSuppWidthExt*3/2.
3098 1 : + fgkCoolPipeSuppWidthIn, 0);
3099 1 : side2Tr->RegisterYourself();
3100 :
3101 2 : TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
3102 1 : (fgkCoolPipeSuppMaxLength/2.
3103 1 : - fgkCoolPipeSuppSlitL)/2.,
3104 1 : fgkCoolPipeSuppWidthIn/2.,
3105 1 : fgkCoolPipeSuppHeight/2.);
3106 : TGeoTranslation *middleTr =
3107 2 : new TGeoTranslation("ITSsddCPStr3R",
3108 2 : -( fgkCoolPipeSuppMaxLength/2.
3109 2 : -fgkCoolPipeSuppSlitL)/2.,
3110 1 : -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
3111 1 : + fgkCoolPipeSuppWidthIn/2.,0);
3112 1 : middleTr->RegisterYourself();
3113 :
3114 2 : TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
3115 1 : fgkCoolPipeSuppTongW/4.,
3116 1 : (fgkCoolPipeSuppFulWidth
3117 1 : - 2*fgkCoolPipeSuppWidthExt
3118 1 : - fgkCoolPipeSuppWidthIn)/2,
3119 1 : fgkCoolPipeSuppHeight/2.);
3120 :
3121 2 : TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
3122 1 : - fgkCoolPipeSuppTongW/4.,
3123 1 : - fgkCoolPipeSuppAxeDist
3124 1 : + fgkCoolPipeSuppFulWidth
3125 2 : - axeBox->GetDY(),0);
3126 1 : axeBoxTr->RegisterYourself();
3127 :
3128 2 : TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
3129 1 : fgkCoolPipeSuppTongW/4.);
3130 :
3131 1 : TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
3132 2 : TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
3133 1 : -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
3134 1 : axeTrans->RegisterYourself();
3135 : //delete axeRot;
3136 :
3137 1 : if(GetDebug(3)){
3138 0 : middle->InspectShape();
3139 0 : axe->InspectShape();
3140 0 : };
3141 :
3142 1 : TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
3143 : "ITSsddCoolPipeSuppShapeR",
3144 : "ITSsddCPSmiddleR:ITSsddCPStr3R"
3145 : "+ITSsddCPSside1R:ITSsddCPStr1R"
3146 : "+ITSsddCPSside1R:ITSsddCPStr2R"
3147 : "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
3148 : "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
3149 :
3150 1 : TGeoMedium *rytonSDD = GetMedium("RYTON$");
3151 2 : TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
3152 1 : coolPipeSuppShape, rytonSDD);
3153 1 : coolPipeSupp->SetLineColor(fColorRyton);
3154 :
3155 1 : return coolPipeSupp;
3156 0 : }
3157 :
3158 : //________________________________________________________________________
3159 : TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
3160 : //
3161 : // based on ALR 0752/8
3162 : //
3163 :
3164 2 : Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
3165 :
3166 1 : Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
3167 1 : - (fgkRadiusAminBTB+fgkBTBthick);
3168 2 : TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
3169 1 : fgkBTBthick/2., fgkBTBlength/2.);
3170 2 : TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
3171 1 : fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
3172 1 : -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3173 1 : base1Tr->RegisterYourself();
3174 :
3175 1 : Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
3176 1 : - fgkRadiusBminBTB;
3177 2 : TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
3178 1 : fgkBTBthick/2., fgkBTBlength/2.);
3179 2 : TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
3180 1 : fgkBTBaxisAtoBottom - base2width/2.,
3181 1 : -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
3182 1 : base2Tr->RegisterYourself();
3183 :
3184 2 : TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
3185 1 : fgkBTBthick/2., dy/2., fgkBTBlength/2.);
3186 2 : TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
3187 1 : -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
3188 2 : TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
3189 1 : fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
3190 1 : sideTr1->RegisterYourself();
3191 1 : sideTr2->RegisterYourself();
3192 :
3193 2 : TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
3194 1 : fgkBTBthick/2., fgkBTBHoleLength/2.);
3195 2 : TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
3196 1 : - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3197 1 : - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3198 1 : fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
3199 2 : TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
3200 1 : - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
3201 1 : - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
3202 1 : - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
3203 1 : holeTr1->RegisterYourself();
3204 1 : holeTr2->RegisterYourself();
3205 :
3206 1 : Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
3207 2 : TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
3208 1 : fgkRadiusAminBTB, radiusAmaxBTB,
3209 1 : fgkBTBlength/2., 0., 180.);
3210 2 : TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
3211 1 : fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3212 1 : fgkBTBlength/2., 270., 360.);
3213 2 : TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
3214 1 : -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3215 : -dy, 0);
3216 1 : roundTr1->RegisterYourself();
3217 :
3218 2 : TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
3219 1 : fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
3220 1 : fgkBTBlength/2., 180., 270.);
3221 2 : TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
3222 1 : (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
3223 : -dy, 0);
3224 1 : roundTr2->RegisterYourself();
3225 :
3226 1 : TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
3227 : "ITSsddBaseThermalBridgeShape",
3228 : "ITSsddBTBbase1:ITSsddBTBtr1"
3229 : "+ ITSsddBTBbase2:ITSsddBTBtr2"
3230 : "+ ITSsddBTBround1:ITSsddBTBround1Tr"
3231 : "+ ITSsddBTBround2:ITSsddBTBround2Tr"
3232 : "+ ITSsddBTBside:ITSsddBTBsideTr1"
3233 : "+ ITSsddBTBside:ITSsddBTBsideTr2"
3234 : "- ITSsddBTBhole:ITSsddBTBholeTr1"
3235 : "- ITSsddBTBhole:ITSsddBTBholeTr2"
3236 : "+ ITSsddBTBmainAxis");
3237 :
3238 1 : if(GetDebug(3)){// Remove compiler warning.
3239 0 : base1->InspectShape();
3240 0 : base2->InspectShape();
3241 0 : side->InspectShape();
3242 0 : hole->InspectShape();
3243 0 : mainAxis->InspectShape();
3244 0 : round1->InspectShape();
3245 0 : round2->InspectShape();
3246 0 : };
3247 :
3248 1 : TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
3249 2 : TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
3250 1 : sBaseThermalBridge,
3251 : carbonFiberLadderStruct);
3252 :
3253 1 : vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
3254 1 : return vBaseThermalBridge;
3255 0 : }
3256 :
3257 :
3258 : //________________________________________________________________________
3259 : TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
3260 : //
3261 : // Return an assembly containing a end of a CF ladder.
3262 : //
3263 :
3264 4 : TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
3265 2 : TGeoMedium *stesalite = GetMedium("G10FR4$");
3266 2 : TGeoMedium *phynoxSDD = GetMedium("INOX$");
3267 2 : TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3268 :
3269 2 : Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
3270 2 : Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
3271 2 : Double_t underSegDH = fLay3LadderUnderSegDH;
3272 2 : Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
3273 : // footDZ is also where to place the ruby's center in local Z
3274 2 : Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
3275 :
3276 2 : if (iLay==3) {
3277 1 : } else if (iLay==4) {
3278 1 : length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
3279 1 : coolPipeSuppH = fgkLay4CoolPipeSuppH;
3280 1 : underSegDH = fLay4LadderUnderSegDH;
3281 1 : footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
3282 1 : coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
3283 : } else {
3284 0 : printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
3285 0 : return 0;
3286 : };
3287 :
3288 2 : Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
3289 2 : + underSegDH/2); //space under ladder segment
3290 : // here tDY is not the same as for the segment because the end ladder
3291 : // does not have a space under it, inside the general ladder volume.
3292 2 : Double_t segmentLength = fgkSegmentLength;
3293 2 : Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
3294 :
3295 2 : TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
3296 :
3297 : //**********************************
3298 : // coding real matter :
3299 : //**********************************
3300 2 : Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
3301 2 : Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
3302 2 : Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
3303 2 : Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
3304 :
3305 : //--- The 3 V shape corners of the Carbon Fiber Ladder
3306 : //--- the top V
3307 2 : TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
3308 2 : topCornerLength/2., halfTheta, -1,
3309 2 : fgkLadderLa, fgkLadderHa, fgkLadderl);
3310 4 : TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
3311 2 : cfLaddTop1,carbonFiberLadderStruct);
3312 2 : cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
3313 2 : TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
3314 : topCornerLength/2., halfTheta, 1,
3315 2 : fgkLadderLa, fgkLadderHa, fgkLadderl);
3316 4 : TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
3317 2 : cfLaddTop2,carbonFiberLadderStruct);
3318 2 : cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
3319 4 : TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
3320 2 : -(length-topCornerLength)/2.);
3321 2 : virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
3322 2 : virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
3323 :
3324 : //--- the 2 side V
3325 2 : TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
3326 2 : length/2., beta, -1,
3327 2 : fgkLadderLb, fgkLadderHb, fgkLadderl);
3328 4 : TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
3329 2 : cfLaddSide1,carbonFiberLadderStruct);
3330 2 : cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
3331 2 : TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
3332 : length/2., beta, 1,
3333 2 : fgkLadderLb, fgkLadderHb, fgkLadderl);
3334 4 : TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
3335 2 : cfLaddSide2,carbonFiberLadderStruct);
3336 2 : cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
3337 4 : Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
3338 4 : TMath::Tan(beta) - fgkLadderBeamRadius );
3339 :
3340 : // because center of the triangle doesn't correspond to virtual vol. center
3341 2 : Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
3342 2 : TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
3343 2 : alpha*TMath::RadToDeg());
3344 2 : AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
3345 2 : TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
3346 2 : -alpha*TMath::RadToDeg());
3347 2 : AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
3348 2 : virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
3349 2 : virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
3350 2 : virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
3351 2 : virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
3352 :
3353 : //--- The beams
3354 : // Beams on the sides
3355 6 : Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
3356 4 : TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
3357 :
3358 : //Euler rotation : about Z, then new X, then new Z
3359 4 : TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3360 2 : -beamPhiPrime*TMath::RadToDeg(), -90);
3361 4 : TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
3362 2 : beamPhiPrime*TMath::RadToDeg(), -90);
3363 4 : TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3364 2 : beamPhiPrime*TMath::RadToDeg(), -90);
3365 4 : TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
3366 2 : -beamPhiPrime*TMath::RadToDeg(), -90);
3367 6 : TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
3368 2 : TMath::Tan(halfTheta),
3369 2 : fgkLadderBeamRadius/2. + tDY,
3370 2 : -length/2 + segmentLength/8, beamRot1);
3371 6 : TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
3372 2 : TMath::Tan(halfTheta),
3373 2 : fgkLadderBeamRadius/2.+tDY,
3374 2 : -length/2 + 3*segmentLength/8, beamRot2);
3375 6 : TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
3376 2 : TMath::Tan(halfTheta),
3377 2 : fgkLadderBeamRadius/2.+tDY,
3378 : -length/2 + segmentLength/8, beamRot3);
3379 6 : TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
3380 2 : TMath::Tan(halfTheta),
3381 2 : fgkLadderBeamRadius/2. + tDY,
3382 : -length/2+3*segmentLength/8, beamRot4);
3383 :
3384 2 : virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
3385 2 : virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
3386 2 : virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
3387 2 : virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
3388 :
3389 : //--- Beams of the bottom
3390 2 : TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
3391 :
3392 : /* Not there actually
3393 : TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3394 : fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
3395 : TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
3396 : bottomBeam1, carbonFiberLadderStruct);
3397 : bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
3398 :
3399 : TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
3400 : -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
3401 : -length/2+fgkSegmentLength/2, bottomBeamRot1);
3402 : virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
3403 : */
3404 4 : TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
3405 2 : fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
3406 4 : TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
3407 2 : bottomBeam2, carbonFiberLadderStruct);
3408 2 : bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
3409 4 : TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
3410 2 : -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
3411 2 : virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
3412 :
3413 : //**********************************
3414 : //the cooling pipe supports
3415 4 : Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
3416 4 : fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
3417 :
3418 4 : Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
3419 2 : (triangleHeight+triangleCPaxeDist/
3420 4 : TMath::Sin(halfTheta)-coolPipeSuppH);
3421 :
3422 2 : if (fAddCoolingSyst) {
3423 2 : TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
3424 2 : TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
3425 4 : TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
3426 2 : -fgkLadderHeight/2.+ tDY +
3427 2 : coolPipeSuppH+fgkLadderBeamRadius,
3428 : -length/2., rotCPS1);
3429 4 : TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
3430 2 : -fgkLadderHeight/2.+ tDY +
3431 2 : coolPipeSuppH+fgkLadderBeamRadius,
3432 : -length/2., rotCPS2);
3433 :
3434 2 : virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
3435 2 : virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
3436 2 : };
3437 :
3438 : //**********************************
3439 : //--- The stesalite foot of the ladder
3440 :
3441 2 : Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
3442 2 : - fgkLadFootY/2+fgkLadFingerPrintY;
3443 :
3444 2 : TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
3445 2 : virtualEnd->AddNode(fLadderFoot, 1, footTr);
3446 :
3447 : //=====================================
3448 : //--- cooling pipe
3449 :
3450 2 : if (fAddCoolingSyst) {
3451 :
3452 4 : TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
3453 2 : -fgkLadderHeight/2.+ tDY +
3454 2 : coolPipeSuppH + fgkLadderBeamRadius,
3455 2 : -length/2.+coolPipeEndLen/2.);
3456 4 : TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
3457 4 : -fgkLadderHeight/2. + tDY +
3458 4 : fgkLadderBeamRadius + coolPipeSuppH,
3459 : -length/2.+coolPipeEndLen/2.);
3460 :
3461 4 : TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
3462 2 : fgkCoolPipeOuterDiam/2,
3463 : coolPipeEndLen/2);
3464 2 : TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
3465 : coolPipeEndLen/2);
3466 :
3467 4 : TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
3468 2 : coolingPipeShape, phynoxSDD );
3469 2 : coolingPipe->SetLineColor(fColorPhynox);
3470 2 : TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
3471 : coolerMediumSDD );
3472 :
3473 2 : virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
3474 2 : virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
3475 2 : if (fCoolingOn) {
3476 2 : virtualEnd->AddNode(cooler, 1, pipeTr1);
3477 2 : virtualEnd->AddNode(cooler, 2, pipeTr2);
3478 2 : };
3479 2 : };
3480 :
3481 : //=====================================
3482 : //--- HV cable guide
3483 :
3484 :
3485 4 : TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
3486 2 : fgkHVguideY1/2,fgkHVguideZ1/2);
3487 2 : TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite);
3488 :
3489 4 : TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
3490 2 : -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
3491 2 : footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
3492 2 : virtualEnd->AddNode(guideHV, 1, guideHVtr);
3493 :
3494 : //=====================================
3495 : //--- raccordo
3496 2 : Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
3497 4 : TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
3498 2 : -fgkLadderHeight/2.+ tDY +
3499 2 : coolPipeSuppH+fgkLadderBeamRadius,
3500 2 : -length/2.+coolPipeEndLen+raccordFullLen/2);
3501 4 : TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
3502 2 : -fgkLadderHeight/2.+ tDY +
3503 2 : coolPipeSuppH+fgkLadderBeamRadius,
3504 : -length/2.+coolPipeEndLen+raccordFullLen/2);
3505 :
3506 2 : virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
3507 2 : virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
3508 :
3509 2 : virtualEnd->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
3510 :
3511 2 : if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
3512 :
3513 : return virtualEnd;
3514 2 : }
3515 :
3516 : //________________________________________________________________________
3517 : TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
3518 :
3519 : //--- The stesalite foot of the ladder
3520 : // Are missing :
3521 : // The 2 screw holes on the left part
3522 : // the small holes at each corner of the ruby cage (diam 2mm)
3523 : // the really small level difference of 0.3mm on the bottom
3524 :
3525 :
3526 2 : TGeoMedium *stesalite = GetMedium("G10FR4$");
3527 :
3528 1 : TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
3529 :
3530 : Double_t epsilon = 2e-10;
3531 2 : TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
3532 1 : fgkLadFootZ/2);
3533 2 : TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
3534 1 : fgkLadFootX/2-fgkLadBox1X/2,0,0);
3535 2 : TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
3536 1 : fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
3537 :
3538 2 : TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
3539 1 : fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
3540 1 : fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
3541 : 0);
3542 :
3543 2 : TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
3544 1 : fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
3545 :
3546 2 : TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
3547 1 : fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
3548 1 : fgkLadFootY/2-fgkRubyCageHoleY/2,0);
3549 :
3550 1 : double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
3551 2 : TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
3552 1 : rubyScrewHoleLen/2);
3553 :
3554 1 : TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
3555 2 : TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
3556 1 : fgkLadFootX/2-rubyScrewHoleLen/2,
3557 : -fgkRubyScrewShiftToCenterY, 0, rot9090);
3558 :
3559 1 : Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
3560 2 : TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
3561 1 : rubyHoleLen/2);
3562 :
3563 1 : TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
3564 2 : TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
3565 1 : -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
3566 :
3567 1 : ladFootBox1Tr->RegisterYourself();
3568 1 : ladFingerPrintTr->RegisterYourself();
3569 1 : rubyCageHoleTr->RegisterYourself();
3570 1 : rubyScrewHoleTr->RegisterYourself();
3571 1 : rubyHoleTr->RegisterYourself();
3572 :
3573 1 : TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
3574 : "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
3575 : "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
3576 : "+rubyHole:rubyHoleTr)");
3577 2 : TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
3578 1 : footRightPart,stesalite);
3579 1 : vFootRightPart->SetLineColor(fColorStesalite);
3580 :
3581 1 : virtualFoot->AddNode(vFootRightPart, 1, 0);
3582 :
3583 :
3584 : //--- This was the right part of the foot, now let's do the middle
3585 : //--- and the right parts
3586 :
3587 1 : Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
3588 2 : TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
3589 1 : fgkLadFootZ/2);
3590 2 : TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
3591 1 : fgkLadFootX/2-fgkLadBox1X-middleX/2,
3592 1 : fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
3593 :
3594 1 : TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
3595 1 : vFootMiddle->SetLineColor(fColorStesalite);
3596 1 : virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
3597 :
3598 : //--
3599 2 : TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
3600 1 : (fgkLadFootY-fgkLadFingerPrintY)/2,
3601 1 : fgkLadFootZ/2);
3602 2 : TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
3603 1 : -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
3604 1 : -fgkLadFingerPrintY/2, 0);
3605 1 : TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
3606 : stesalite);
3607 1 : vFootLeftLadFinger->SetLineColor(fColorStesalite);
3608 1 : virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
3609 :
3610 : //--
3611 2 : TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
3612 1 : fgkLadFootY/2,
3613 1 : fgkLadFootZ/2);
3614 2 : TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
3615 1 : -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
3616 : 0, 0);
3617 1 : TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
3618 1 : vFootLeft->SetLineColor(fColorStesalite);
3619 1 : virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
3620 :
3621 1 : virtualFoot->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
3622 :
3623 1 : if(GetDebug(3)){ // Remove compiler warning.
3624 0 : ladFingerPrint->InspectShape();
3625 0 : ladFootBox1->InspectShape();
3626 0 : rubyCageHole->InspectShape();
3627 0 : rubyScrewHole->InspectShape();
3628 0 : rubyHole->InspectShape();
3629 0 : }
3630 :
3631 1 : return virtualFoot;
3632 0 : }
3633 :
3634 : //________________________________________________________________________
3635 : TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3636 : //
3637 : // return an assembly containing the CARLOS end-ladder board
3638 : // and the heat bridge
3639 : //
3640 :
3641 : (void) iLay;
3642 2 : TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber
3643 1 : TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3644 1 : TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3645 1 : TGeoMedium *copper = GetMedium("COPPER$");
3646 1 : TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
3647 1 : TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
3648 :
3649 : //=========================================
3650 : // cooling support of the Carlos card (HeatBridge):
3651 1 : TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3652 :
3653 2 : TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3654 1 : fgkCarlosSuppZ/2);
3655 2 : TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3656 1 : fgkCarlosSuppZ/2);
3657 2 : TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3658 1 : supCarlosBoard1, alCu12SDD);
3659 2 : TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3660 1 : supCarlosBoard2, alCu12SDD);
3661 1 : vSupCarlosBoard1->SetLineColor(4);
3662 1 : vSupCarlosBoard2->SetLineColor(4);
3663 :
3664 :
3665 1 : Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3666 : // shift of the main planes in the direction of their width
3667 : // the center is fixed at the center of the 2 small fixing arms on each sides.
3668 : //shiftGlob=0.5;
3669 :
3670 1 : shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3671 1 : shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3672 1 : Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3673 1 : Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3674 :
3675 2 : TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3676 1 : (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3677 : +shiftGlobZ);
3678 :
3679 1 : TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3680 : shiftGlobY,
3681 : shiftGlobZ);
3682 :
3683 1 : assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3684 1 : assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3685 :
3686 : //=========================================
3687 : // fixing arm of the cooling support :
3688 2 : TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3689 1 : fgkCarlosSuppZ3/2);
3690 2 : TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3691 1 : supCarlosBoard3, alCu12SDD);
3692 1 : vSupCarlosBoard3->SetLineColor(4);
3693 :
3694 : // screw inside :
3695 2 : TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3696 1 : fgkCarlosSuppY3/2);
3697 2 : TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3698 1 : littleScrew, stainless);
3699 1 : TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3700 3 : TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3701 2 : fgkLittleScrewHeadR-0.07, rotScrew);
3702 3 : TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3703 2 : fgkLittleScrewHeadR+0.07, rotScrew);
3704 1 : vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3705 1 : vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3706 :
3707 1 : TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3708 : 0, fgkCarlosSuppAngle, 0);
3709 3 : TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3710 2 : fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3711 4 : TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3712 3 : fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3713 1 : assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3714 1 : assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3715 :
3716 :
3717 : //=========================================
3718 : // screws fixing the board on the U tube
3719 1 : Double_t aaa = fgkCarlosSuppY3; // ???
3720 : //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3721 1 : Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3722 2 : Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3723 1 : bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3724 2 : Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3725 2 : bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3726 :
3727 1 : TGeoRotation *carlosSuppRot = (TGeoRotation *)fCommonTr[0];
3728 :
3729 3 : TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3730 2 : fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3731 : screw1y,screw1z, carlosSuppRot);
3732 :
3733 3 : TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3734 2 : fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3735 : screw1z,screw1y, carlosSuppRot);
3736 :
3737 4 : TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3738 3 : fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3739 : screw1y,screw1z, carlosSuppRot);
3740 :
3741 4 : TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3742 3 : fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3743 : screw1z,screw1y, carlosSuppRot);
3744 :
3745 1 : assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3746 1 : assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3747 1 : assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3748 1 : assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3749 :
3750 : //=========================================
3751 : // board
3752 1 : Double_t p1[3], p2[3], vX[3] = {1,0,0};
3753 1 : AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3754 1 : card1.SetNLayers(2);
3755 1 : card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3756 1 : card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3757 1 : card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3758 1 : p1[0] = -fgkCarlosCardX1/2;
3759 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3760 1 : p1[2] = fgkCarlosCardShift;
3761 1 : p2[0] = fgkCarlosCardX1/2;
3762 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3763 1 : p2[2] = fgkCarlosCardShift;
3764 1 : card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3765 1 : card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3766 1 : card1.CreateAndInsertBoxCableSegment(1,90);
3767 :
3768 1 : AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3769 1 : card2.SetNLayers(2);
3770 1 : card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3771 1 : card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3772 1 : card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3773 :
3774 1 : p1[0] = -fgkCarlosCardX1/2;
3775 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3776 1 : p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3777 :
3778 1 : p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3779 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3780 1 : p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3781 1 : card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3782 1 : card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3783 1 : card2.CreateAndInsertBoxCableSegment(1,90);
3784 :
3785 : //=========================================
3786 : // some chips on the board
3787 :
3788 1 : AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3789 1 : u1.SetNLayers(2);
3790 1 : u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3791 1 : u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3792 1 : u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3793 :
3794 1 : p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3795 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3796 1 : p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3797 :
3798 1 : p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3799 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3800 1 : p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3801 1 : u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3802 1 : u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3803 1 : u1.CreateAndInsertBoxCableSegment(1,90);
3804 :
3805 : //---
3806 1 : AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3807 1 : u2.SetNLayers(2);
3808 1 : u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3809 1 : u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3810 1 : u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3811 :
3812 1 : p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3813 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3814 1 : p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3815 :
3816 1 : p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3817 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3818 1 : p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3819 1 : u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3820 1 : u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3821 1 : u2.CreateAndInsertBoxCableSegment(1,90);
3822 :
3823 : //---
3824 1 : AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3825 1 : u3.SetNLayers(2);
3826 1 : u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3827 1 : u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3828 1 : u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3829 :
3830 1 : Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3831 1 : p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3832 1 : p1[1] = u3Y;
3833 1 : p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3834 :
3835 1 : p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3836 1 : p2[1] = u3Y;
3837 1 : p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3838 1 : u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3839 1 : u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3840 1 : TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3841 :
3842 : //--- U4 is like U3 (?)
3843 2 : TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3844 1 : u4Trans->RotateX(90);
3845 2 : u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3846 1 : fgkCarlosCardShift + fgkCarlosU4posZ);
3847 1 : assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3848 :
3849 : //---
3850 1 : AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3851 1 : u17.SetNLayers(2);
3852 1 : u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3853 1 : u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3854 1 : u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3855 :
3856 1 : p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3857 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3858 1 : p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3859 :
3860 1 : p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3861 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3862 1 : p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3863 1 : u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3864 1 : u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3865 1 : u17.CreateAndInsertBoxCableSegment(1,90);
3866 :
3867 : //---
3868 1 : AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3869 1 : u35.SetNLayers(2);
3870 1 : u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3871 1 : u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3872 1 : u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3873 :
3874 1 : p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3875 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3876 1 : p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3877 :
3878 1 : p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3879 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3880 1 : p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3881 1 : u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3882 1 : u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3883 1 : u35.CreateAndInsertBoxCableSegment(1,90);
3884 :
3885 : //---
3886 1 : AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3887 1 : u36.SetNLayers(2);
3888 1 : u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3889 1 : u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3890 1 : u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3891 :
3892 1 : p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3893 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3894 1 : p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3895 :
3896 1 : p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3897 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3898 1 : p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3899 1 : u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3900 1 : u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3901 1 : u36.CreateAndInsertBoxCableSegment(1,90);
3902 :
3903 : //--- QZ1
3904 1 : AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3905 1 : qz1.SetNLayers(2);
3906 1 : qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3907 1 : qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3908 1 : qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3909 :
3910 1 : p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3911 1 : p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3912 1 : p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3913 :
3914 1 : p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3915 1 : p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3916 1 : p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3917 1 : qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3918 1 : qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3919 1 : qz1.CreateAndInsertBoxCableSegment(1,90);
3920 :
3921 1 : assemblySupCarlos->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
3922 :
3923 : return assemblySupCarlos;
3924 1 : }
3925 :
3926 : //________________________________________________________________________
3927 : Int_t AliITSv11GeometrySDD::CreateLVCard() {
3928 : //
3929 : // Creates the assemblies containing the LV cards (left and right)
3930 : //
3931 :
3932 2 : TGeoMedium *glassFiber = GetMedium("GLASS FIBER$");// glassFiber
3933 1 : TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3934 1 : TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3935 1 : TGeoMedium *copper = GetMedium("COPPER$");
3936 1 : TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
3937 1 : TGeoMedium *stainless = GetMedium("AISI304L$"); // for screws
3938 :
3939 2 : fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3940 2 : fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3941 :
3942 : // we are going to use flat cable class to create multilayer box,
3943 : // then we can use the pointers to created volumes to place them elsewhere
3944 1 : Double_t p1[3], p2[3], vX[3] = {1,0,0};
3945 :
3946 1 : Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3947 1 : AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3948 1 : cardLV.SetNLayers(2);
3949 1 : cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3950 1 : cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3951 1 : cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3952 1 : p1[0] = 0;
3953 1 : p1[1] = fgkLVcardY/2;
3954 1 : p1[2] = 0;
3955 1 : p2[0] = fgkLVcardX;
3956 1 : p2[1] = fgkLVcardY/2;
3957 1 : p2[2] = 0;
3958 1 : cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3959 1 : cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3960 1 : TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3961 2 : TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3962 2 : TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3963 1 : fCardLVR->AddNode(boxVol, 1, trCard);
3964 :
3965 1 : Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3966 1 : AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3967 1 : chipO.SetNLayers(2);
3968 1 : chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3969 1 : chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3970 1 : chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3971 1 : p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3972 1 : p1[1] = fgkLVChip0PosY;
3973 1 : p1[2] = carLVfullThick/2 + chip0fullThick/2;
3974 :
3975 1 : p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3976 1 : p2[1] = fgkLVChip0PosY;
3977 1 : p2[2] = carLVfullThick/2 + chip0fullThick/2;
3978 1 : chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3979 1 : chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3980 1 : boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3981 3 : trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3982 1 : fgkLVChip0PosY,
3983 : carLVfullThick/2+chip0fullThick/2, rotAdd);
3984 1 : fCardLVR->AddNode(boxVol, 1, trCard);
3985 :
3986 : // put also this chip on the other side of the card
3987 3 : trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3988 1 : fgkLVChip0PosY,
3989 1 : -carLVfullThick/2-chip0fullThick/2, rotAdd);
3990 1 : fCardLVL->AddNode(boxVol, 2, trCard);
3991 3 : trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3992 1 : fgkLVChip0PosY,
3993 : -carLVfullThick/2-chip0fullThick/2, rotAdd);
3994 1 : fCardLVR->AddNode(boxVol, 2, trCard);
3995 :
3996 1 : Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3997 1 : AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3998 1 : chip1.SetNLayers(2);
3999 1 : chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
4000 1 : chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
4001 1 : chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
4002 1 : p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
4003 1 : p1[1] = fgkLVChip1PosY;
4004 1 : p1[2] = carLVfullThick/2 + chip1fullThick/2;
4005 :
4006 1 : p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
4007 1 : p2[1] = fgkLVChip1PosY;
4008 1 : p2[2] = carLVfullThick/2 + chip1fullThick/2;
4009 1 : chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4010 1 : chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4011 1 : boxVol = chip1.CreateAndInsertBoxCableSegment(1);
4012 3 : trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
4013 1 : fgkLVChip1PosY,
4014 : carLVfullThick/2 + chip1fullThick/2, rotAdd);
4015 1 : fCardLVR->AddNode(boxVol, 1, trCard);
4016 :
4017 1 : Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
4018 1 : AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
4019 1 : chip2.SetNLayers(2);
4020 1 : chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
4021 1 : chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
4022 1 : chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
4023 1 : p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
4024 1 : p1[1] = fgkLVChip2PosY;
4025 1 : p1[2] = carLVfullThick/2 + chip2fullThick/2;
4026 1 : p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
4027 1 : p2[1] = fgkLVChip2PosY;
4028 1 : p2[2] = carLVfullThick/2 + chip2fullThick/2;
4029 1 : chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4030 1 : chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4031 1 : boxVol = chip2.CreateAndInsertBoxCableSegment(1);
4032 3 : trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
4033 1 : fgkLVChip2PosY,
4034 : carLVfullThick/2 + chip2fullThick/2, rotAdd);
4035 1 : fCardLVR->AddNode(boxVol, 1, trCard);
4036 :
4037 1 : Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
4038 1 : AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
4039 1 : chip3.SetNLayers(2);
4040 1 : chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
4041 1 : chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
4042 1 : chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
4043 1 : p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
4044 1 : p1[1] = fgkLVChip3PosY;
4045 1 : p1[2] = -carLVfullThick/2 - chip3fullThick/2;
4046 1 : p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
4047 1 : p2[1] = fgkLVChip3PosY;
4048 1 : p2[2] = -carLVfullThick/2 - chip3fullThick/2;
4049 1 : chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
4050 1 : chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
4051 1 : boxVol = chip3.CreateAndInsertBoxCableSegment(1);
4052 3 : trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
4053 1 : fgkLVChip3PosY,
4054 : -carLVfullThick/2 - chip3fullThick/2, rotAdd);
4055 1 : fCardLVR->AddNode(boxVol, 1, trCard);
4056 :
4057 : // the Al pieces for heat exchange :
4058 3 : TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
4059 1 : fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
4060 :
4061 3 : TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
4062 1 : (fgkLVcoolX1/2+fgkLVcoolX2),
4063 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4064 1 : carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
4065 3 : TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
4066 1 : (fgkLVcoolX1/2+fgkLVcoolX2),
4067 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4068 1 : -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
4069 :
4070 2 : TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
4071 : alCu12SDD);
4072 1 : vAlLVcooling1->SetLineColor(2);
4073 :
4074 : //--
4075 3 : TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
4076 1 : fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
4077 3 : TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
4078 1 : (fgkLVcoolX2/2),
4079 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4080 1 : carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
4081 3 : TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
4082 1 : (fgkLVcoolX2/2),
4083 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4084 1 : -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
4085 :
4086 2 : TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
4087 : alCu12SDD);
4088 1 : vAlLVcooling2->SetLineColor(2);
4089 :
4090 : //--
4091 1 : Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4092 1 : +fgkLVcoolZ1*2.);
4093 3 : TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
4094 1 : fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
4095 3 : TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
4096 1 : (-fgkLVcoolX3/2),
4097 1 : fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
4098 : 0);
4099 2 : TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
4100 1 : vAlLVcooling3->SetLineColor(2);
4101 :
4102 : //=== screw fixing th LV card to the U cooling tube :
4103 3 : TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
4104 1 : fgkLVcoolY3/2);
4105 3 : TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
4106 1 : littleScrew, stainless);
4107 2 : TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
4108 :
4109 2 : TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
4110 : rotScrew);
4111 1 : vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
4112 :
4113 3 : TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
4114 1 : 0, fgkLittleLVScrewHeadR,
4115 1 : fgkLittleScrewHeadH/2);
4116 3 : TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
4117 1 : littleScrewHead, stainless);
4118 1 : vLittleScrewHead->SetLineColor(kGray);
4119 3 : TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
4120 1 : fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
4121 1 : fgkShiftLittleScrewLV,
4122 : rotScrew);
4123 1 : fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
4124 :
4125 3 : TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
4126 1 : fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
4127 1 : fgkShiftLittleScrewLV,
4128 : rotScrew);
4129 1 : fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
4130 :
4131 : // adding the cooling pieces to the left card
4132 1 : fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
4133 1 : fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
4134 1 : fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
4135 1 : fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
4136 1 : fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
4137 :
4138 3 : TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
4139 1 : -(fgkLVcoolX1/2+fgkLVcoolX2),
4140 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4141 1 : carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
4142 3 : TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
4143 1 : -(fgkLVcoolX1/2+fgkLVcoolX2),
4144 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4145 1 : -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
4146 3 : TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
4147 1 : -(fgkLVcoolX2/2),
4148 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4149 1 : carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
4150 3 : TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
4151 1 : -(fgkLVcoolX2/2),
4152 1 : fgkLVcoolPosY+fgkLVcoolY1/2,
4153 1 : -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
4154 :
4155 3 : TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
4156 1 : fgkLVcoolX3/2,
4157 1 : fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
4158 : 0);
4159 : // and to the right card
4160 1 : fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
4161 1 : fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
4162 1 : fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
4163 1 : fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
4164 1 : fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
4165 :
4166 1 : fCardLVL->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4167 1 : fCardLVR->GetShape()->ComputeBBox();
4168 :
4169 : return kTRUE;
4170 1 : }
4171 :
4172 : //________________________________________________________________________
4173 : TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(){
4174 : //
4175 : // return an assembly containing the HV card
4176 : //
4177 :
4178 2 : TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
4179 1 : TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // check if different
4180 1 : TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // check if different
4181 1 : TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
4182 1 : TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
4183 1 : TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4184 :
4185 1 : TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
4186 :
4187 : //====================================
4188 : //--- the card itself
4189 2 : TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
4190 1 : fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
4191 1 : TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
4192 1 : vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
4193 :
4194 1 : highVCard->AddNode(vCeramicCard, 1, 0);
4195 :
4196 :
4197 : //====================================
4198 : //--- capacitors
4199 :
4200 : // capa1
4201 2 : TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
4202 1 : fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
4203 1 : TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
4204 : medSMDcapaMiddle);
4205 :
4206 2 : TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
4207 1 : fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
4208 1 : TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
4209 : medSMDcapaEnd);
4210 1 : vCapa1End->SetLineColor(18);// grey silver
4211 2 : TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
4212 1 : (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4213 2 : TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
4214 1 : -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
4215 :
4216 2 : TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
4217 1 : fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
4218 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
4219 :
4220 1 : TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
4221 1 : capa1->AddNode(vCapa1Middle, 1,0);
4222 1 : capa1->AddNode(vCapa1End, 1, capa1EndTr1);
4223 1 : capa1->AddNode(vCapa1End, 2, capa1EndTr2);
4224 :
4225 1 : capa1->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4226 :
4227 :
4228 1 : highVCard->AddNode(capa1, 1, capa1PosTr);
4229 :
4230 : // capa2
4231 2 : TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
4232 1 : fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
4233 1 : TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
4234 : medSMDcapaMiddle);
4235 :
4236 2 : TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
4237 1 : fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
4238 1 : TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
4239 : medSMDcapaEnd);
4240 1 : vCapa2End->SetLineColor(18);// grey silver
4241 2 : TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
4242 1 : (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4243 2 : TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
4244 1 : -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
4245 :
4246 2 : TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
4247 1 : fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
4248 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
4249 :
4250 1 : TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
4251 1 : capa2->AddNode(vCapa2Middle, 1,0);
4252 1 : capa2->AddNode(vCapa2End, 1, capa2EndTr1);
4253 1 : capa2->AddNode(vCapa2End, 2, capa2EndTr2);
4254 :
4255 1 : capa2->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4256 :
4257 :
4258 1 : highVCard->AddNode(capa2, 1, capa2PosTr);
4259 :
4260 : // capa3
4261 2 : TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
4262 1 : fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4263 1 : TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
4264 : medSMDcapaMiddle);
4265 :
4266 2 : TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
4267 1 : fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
4268 1 : TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
4269 : medSMDcapaEnd);
4270 1 : vCapa3End->SetLineColor(18);// grey silver
4271 :
4272 2 : TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
4273 1 : (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4274 2 : TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
4275 1 : -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
4276 :
4277 1 : TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
4278 1 : capa3->AddNode(vCapa3Middle, 1,0);
4279 1 : capa3->AddNode(vCapa3End, 1, capa3EndTr1);
4280 1 : capa3->AddNode(vCapa3End, 2, capa3EndTr2);
4281 :
4282 2 : TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
4283 1 : fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
4284 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4285 :
4286 2 : TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
4287 1 : fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
4288 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4289 :
4290 2 : TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
4291 1 : fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
4292 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4293 :
4294 2 : TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
4295 1 : fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
4296 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4297 :
4298 2 : TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
4299 1 : fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
4300 1 : -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
4301 :
4302 1 : highVCard->AddNode(capa3, 1, capa3PosTr1);
4303 1 : highVCard->AddNode(capa3, 2, capa3PosTr2);
4304 1 : highVCard->AddNode(capa3, 3, capa3PosTr3);
4305 1 : highVCard->AddNode(capa3, 4, capa3PosTr4);
4306 1 : highVCard->AddNode(capa3, 5, capa3PosTr5);
4307 :
4308 1 : capa3->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4309 : //====================================
4310 : //--- connexions to LV card
4311 :
4312 1 : Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
4313 1 : Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
4314 1 : Double_t fgkConnexLVHVlen = 6.2*fgkmm;
4315 1 : Double_t fgkConnexLVHVx = 3*fgkmm;
4316 1 : Double_t fgkConnexLVHVy1 = 8*fgkmm;
4317 1 : Double_t fgkConnexLVHVdy = 2.5*fgkmm;
4318 :
4319 2 : TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
4320 1 : fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
4321 2 : TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
4322 : fgkConnexLVHVdiam1/2,
4323 1 : fgkConnexLVHVdiam2/2,
4324 : fgkConnexLVHVlen/2);
4325 2 : TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
4326 1 : connexLVHVmetal, stainless);
4327 2 : TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
4328 1 : connexLVHVplastic, plastic);
4329 1 : vConnexLVHVmetal->SetLineColor(10);// white
4330 1 : vConnexLVHVplast->SetLineColor(12); // dark grey
4331 :
4332 1 : TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
4333 1 : connexion->AddNode(vConnexLVHVmetal, 1, 0);
4334 1 : connexion->AddNode(vConnexLVHVplast, 1, 0);
4335 :
4336 2 : TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
4337 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4338 2 : TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
4339 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4340 :
4341 2 : TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
4342 1 : fgkConnexLVHVy1+fgkConnexLVHVdy,
4343 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4344 2 : TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
4345 : fgkConnexLVHVy1+fgkConnexLVHVdy,
4346 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4347 :
4348 2 : TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
4349 1 : fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4350 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4351 2 : TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
4352 : fgkConnexLVHVy1+2*fgkConnexLVHVdy,
4353 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4354 :
4355 2 : TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
4356 1 : fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4357 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4358 2 : TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
4359 : fgkConnexLVHVy1+3*fgkConnexLVHVdy,
4360 1 : -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
4361 :
4362 1 : connexion->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4363 :
4364 :
4365 1 : highVCard->AddNode(connexion, 1, trConnexion1);
4366 1 : highVCard->AddNode(connexion, 2, trConnexion2);
4367 1 : highVCard->AddNode(connexion, 3, trConnexion3);
4368 1 : highVCard->AddNode(connexion, 4, trConnexion4);
4369 1 : highVCard->AddNode(connexion, 5, trConnexion5);
4370 1 : highVCard->AddNode(connexion, 6, trConnexion6);
4371 1 : highVCard->AddNode(connexion, 7, trConnexion7);
4372 1 : highVCard->AddNode(connexion, 8, trConnexion8);
4373 :
4374 : //====================================
4375 : //--- cooling pieces
4376 :
4377 2 : TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
4378 1 : fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
4379 :
4380 :
4381 2 : TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
4382 1 : fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
4383 :
4384 2 : TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
4385 1 : fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
4386 :
4387 1 : TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
4388 : alCu12SDD);
4389 1 : TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
4390 : alCu12SDD);
4391 1 : TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
4392 : alCu12SDD);
4393 : // This last volume contains the screw used for fixing
4394 : // the card to the cooling tube ...
4395 2 : TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
4396 1 : fgkHVCardCool3Y/2);
4397 2 : TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
4398 1 : littleScrewHV, stainless);
4399 :
4400 1 : TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
4401 1 : vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
4402 :
4403 1 : vCardHVcool1->SetLineColor(2); //red
4404 1 : vCardHVcool2->SetLineColor(2); //red
4405 1 : vCardHVcool3->SetLineColor(2); //red
4406 :
4407 2 : TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
4408 1 : fgkHVCardCeramX/2-fgkHVCardCool1X/2,
4409 1 : -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4410 1 : fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4411 2 : TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
4412 1 : -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
4413 1 : -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
4414 1 : fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
4415 :
4416 1 : highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
4417 1 : highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
4418 :
4419 2 : TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4420 1 : fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
4421 1 : -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4422 1 : fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4423 :
4424 2 : TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4425 1 : -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
4426 1 : -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
4427 1 : fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
4428 :
4429 1 : highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
4430 1 : highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
4431 :
4432 2 : TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
4433 1 : fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4434 1 : -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4435 1 : fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4436 :
4437 2 : TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
4438 1 : -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4439 1 : -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
4440 1 : fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
4441 :
4442 1 : highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
4443 1 : highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
4444 :
4445 : //====================================
4446 : //--- screws
4447 2 : TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
4448 1 : fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
4449 1 : -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4450 1 : fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4451 : rotScrewHead);
4452 2 : TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
4453 1 : -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
4454 1 : -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
4455 1 : fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
4456 : rotScrewHead);
4457 :
4458 1 : highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
4459 1 : highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
4460 :
4461 1 : highVCard->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4462 :
4463 1 : return highVCard;
4464 0 : }
4465 :
4466 : //________________________________________________________________________
4467 : TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
4468 : //
4469 : // return an assembly containing the LV, HV and Carlos cards of one ladder
4470 : // and their cooling system
4471 : //
4472 :
4473 0 : TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4474 0 : TGeoMedium *phynoxSDD = GetMedium("INOX$");
4475 0 : TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4476 :
4477 0 : TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
4478 :
4479 : //=*********************************
4480 : //--- The rounded pipe for the end ladder card coooling
4481 :
4482 0 : Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4483 0 : Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4484 : Int_t nCards = 3;
4485 :
4486 0 : if (iLay==4) {
4487 0 : endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4488 0 : endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4489 : nCards = 4;
4490 0 : }
4491 :
4492 0 : AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4493 0 : endLadderPipe.SetNLayers(2);
4494 0 : endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4495 0 : endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4496 :
4497 0 : Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
4498 : // of the U colling pipe in its center
4499 :
4500 0 : Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
4501 0 : Double_t vectA[3] = {0,0,1};
4502 :
4503 0 : Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
4504 0 : Double_t vectB[3] = {0,0,1};
4505 :
4506 0 : Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
4507 0 : Double_t vectC[3] = {1,0,0};
4508 :
4509 0 : Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
4510 0 : Double_t vectD[3] = {-1,0,0};
4511 :
4512 0 : Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
4513 0 : Double_t vectE[3] = {0,0,-1};
4514 :
4515 0 : Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
4516 0 : Double_t vectF[3] = {0,0,-1};
4517 :
4518 0 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4519 0 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4520 0 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4521 0 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4522 0 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4523 0 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4524 :
4525 0 : endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4526 : //endLadderPipe.CreateAndInsertCableSegment( 1);
4527 0 : endLadderPipe.CreateAndInsertTubeSegment( 1);
4528 : //endLadderPipe.CreateAndInsertCableSegment( 2);
4529 0 : endLadderPipe.CreateAndInsertTorusSegment( 2);
4530 : //endLadderPipe.CreateAndInsertCableSegment( 3);
4531 0 : endLadderPipe.CreateAndInsertTubeSegment( 3);
4532 : //endLadderPipe.CreateAndInsertCableSegment( 4);
4533 0 : endLadderPipe.CreateAndInsertTorusSegment( 4);
4534 : //endLadderPipe.CreateAndInsertCableSegment( 5);
4535 0 : endLadderPipe.CreateAndInsertTubeSegment( 5);
4536 :
4537 0 : TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4538 0 : fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4539 0 : TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4540 0 : fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4541 :
4542 0 : TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4543 0 : - fgkEndLadPipeArmBoxDX,
4544 0 : fgkEndLadPipeArmBoxDY,0);
4545 0 : TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4546 0 : fgkEndLadPipeArmBoxDX,
4547 0 : fgkEndLadPipeArmBoxDY,0);
4548 0 : endLadPipeArmBoxDY1->RegisterYourself();
4549 0 : endLadPipeArmBoxDY2->RegisterYourself();
4550 :
4551 0 : if(GetDebug(3)) { // Remove compiler warning.
4552 0 : endLadPipeArmBox->InspectShape();
4553 0 : endLadPipeArmTube->InspectShape();
4554 : }
4555 :
4556 0 : TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4557 : "endLadPipeArmBox:endLadPipeArmBoxDY1"
4558 : "- endLadPipeArmTube");
4559 0 : TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4560 : "endLadPipeArmBox:endLadPipeArmBoxDY2"
4561 : "- endLadPipeArmTube");
4562 :
4563 0 : TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4564 0 : endLadPipeArm1, alCu12SDD);
4565 0 : TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4566 0 : endLadPipeArm2, alCu12SDD);
4567 0 : vEndLadPipeArm1->SetLineColor(2);
4568 0 : vEndLadPipeArm2->SetLineColor(2);
4569 :
4570 0 : Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4571 0 : +fgkEndLadPipeArmZpos);
4572 :
4573 0 : TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4574 0 : -fgkEndLadPipeUwidth/2,0,armZ);
4575 0 : TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4576 0 : fgkEndLadPipeUwidth/2,0,armZ);
4577 :
4578 0 : endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4579 0 : endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4580 :
4581 : //=*********************************
4582 : //--- LV cards
4583 0 : TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4584 0 : TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4585 :
4586 0 : Double_t spaceBetweenCards = 0.2*fgkmm;
4587 :
4588 0 : Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4589 0 : +fgkEndLadPipeArmBoxDX);
4590 0 : Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4591 0 : +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4592 :
4593 0 : Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4594 0 : +fgkLVcoolZ1*2.);
4595 :
4596 0 : Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4597 0 : +coolUzPos+1.25*fgkmm;
4598 : // Position in z of the first LVB with respect to the start of the cooling
4599 : // rectangular arm, coming (from inside of the ladder)
4600 : // The cards are added one after the other
4601 :
4602 0 : for (Int_t iCard=0; iCard<nCards; iCard++) {
4603 :
4604 0 : Double_t cardLVzShift = firstLVCardZ +
4605 0 : Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4606 :
4607 0 : TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4608 : cardLVyShift, cardLVzShift);
4609 0 : TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4610 : cardLVyShift, cardLVzShift);
4611 :
4612 0 : endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4613 0 : endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4614 : }
4615 :
4616 : //=*********************************
4617 : //--- HV cards
4618 0 : TGeoVolumeAssembly *cardHV = fCardHV;
4619 :
4620 0 : Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4621 0 : + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4622 :
4623 0 : Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4624 0 : -(fgkHVCardCeramZ)/2);
4625 :
4626 0 : for (Int_t iCard=0; iCard<nCards; iCard++) {
4627 :
4628 0 : Double_t fact = iCard*2.+1.;
4629 0 : Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4630 0 : + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4631 0 : TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
4632 0 : endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4633 : }
4634 :
4635 : //=*********************************
4636 : //--- Carlos card
4637 :
4638 0 : TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4639 : // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4640 : // 0, -fgkCarlosSuppAngle, 0);
4641 :
4642 0 : Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4643 0 : Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4644 0 : fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4645 : // position in z of the first Carlos board, coming from inside of the ladder
4646 :
4647 0 : Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4648 0 : fgkEndLadPipeArmBoxDY);
4649 :
4650 0 : for (Int_t iCard=0; iCard<nCards; iCard++) {
4651 :
4652 0 : Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4653 0 : iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4654 0 : TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4655 0 : (TGeoRotation*) fCommonTr[0]);
4656 :
4657 0 : endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4658 : }
4659 :
4660 0 : endLadderCards->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
4661 :
4662 : return endLadderCards;
4663 0 : }
4664 :
4665 :
4666 : //________________________________________________________________________
4667 : TGeoVolume* AliITSv11GeometrySDD::CreateEndLadderCardsV(Int_t iLay) {
4668 : //
4669 : // return an Pcon containing the LV, HV and Carlos cards of one ladder
4670 : // and their cooling system
4671 : // This is the code actually used for the end ladder cards
4672 : //
4673 :
4674 4 : TGeoMedium *alCu12SDD = GetMedium("ALCU12$"); // ITSsddAlCu12
4675 2 : TGeoMedium *phynoxSDD = GetMedium("INOX$");
4676 2 : TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
4677 2 : TGeoMedium *copper = GetMedium("COPPER$");
4678 2 : TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ???
4679 2 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
4680 2 : TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
4681 2 : TGeoMedium *polyurethane = GetMedium("POLYURETHANE$");
4682 :
4683 2 : Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
4684 2 : Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
4685 : Int_t nCards = 3;
4686 2 : Double_t rREF = fgkEndLaddCardsShortRadiusLay3;
4687 : Double_t deltaZcables = 0;
4688 : // reference radius corresponding to local y=0
4689 :
4690 2 : if (iLay==4) {
4691 1 : endLadPipeUlength = fgkEndLadPipeUlengthLay4;
4692 1 : endLadPipeArmZ = fgkEndLadPipeArmZLay4;
4693 : nCards = 4;
4694 1 : rREF = fgkEndLaddCardsShortRadiusLay4;
4695 1 : deltaZcables = 2.8*fgkmm;
4696 1 : }
4697 :
4698 2 : Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
4699 2 : +fgkEndLadPipeArmBoxDX);
4700 2 : Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
4701 2 : +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
4702 :
4703 2 : Double_t rMin = rREF + cardLVyShift;
4704 : // (The LV card is defining rMin because it is the lower object)
4705 :
4706 : Double_t thickTotCable = 0.5;
4707 :
4708 : //==================================
4709 : //--- The Pcon container
4710 :
4711 : // minimum angle of the Pcon :
4712 4 : Double_t tanDPhi = ((fgkEndLadPipeUwidth/2+fgkEndLadPipeArmX/2) /
4713 2 : (rREF-fgkEndLadPipeArmY/2) );
4714 2 : Double_t dphi = 2*TMath::ATan(tanDPhi)*TMath::RadToDeg();
4715 2 : Double_t phi0 = 90-dphi/2;
4716 2 : Double_t coolUzPos = fgkEndLadPipeOuterDiam/2 + fgkDistEndLaddCardsLadd; // it is the z coord of the axis
4717 : // of the U colling pipe in its center
4718 2 : Double_t zMax = endLadPipeUlength+coolUzPos;
4719 2 : Double_t rMax = rMin + fgkLVcardY;
4720 2 : rMax = TMath::Sqrt(rMax*rMax + cardLVxShift*cardLVxShift);
4721 2 : Double_t cablesRadius = rMax-0.5;
4722 :
4723 2 : TGeoPcon *containerShape = new TGeoPcon("EndLadderCcontainerShape", phi0, dphi, 10);
4724 : //DefineSection(Int_t snum, Double_t z, Double_t rmin, Double_t rmax);
4725 : // hard coded numbers are fine tuning to avoid overlaps with other volume in the old geometry
4726 2 : containerShape->DefineSection(0, fgkDistEndLaddCardsLadd, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4727 2 : containerShape->DefineSection(1, fgkDistEndLaddCardsLadd+1.4, rREF-fgkEndLadPipeOuterDiam/2-0.2, rMax);
4728 2 : containerShape->DefineSection(2, fgkDistEndLaddCardsLadd+1.4, rMin, rMax);
4729 2 : containerShape->DefineSection(3, endLadPipeArmZ+2*fgkEndLadPipeRadius, rMin, rMax);
4730 2 : containerShape->DefineSection(4, endLadPipeArmZ+2*fgkEndLadPipeRadius, rREF-1.*fgkmm, rMax);
4731 2 : containerShape->DefineSection(5, zMax, rREF-1.*fgkmm, rMax);
4732 : // the following is quite dirty but works for the moment ...
4733 2 : containerShape->DefineSection(6, zMax, rREF+fgkCarlosCardZ1/2, rMax);
4734 2 : containerShape->DefineSection(7, zMax+1, cablesRadius-thickTotCable/2, rMax);
4735 :
4736 : // The next parameters define the shape of the Pcon at its end and where cables
4737 : // are escaping...
4738 : Double_t cableSectionR1 = cablesRadius-thickTotCable/2;
4739 : Double_t cableSectionR2 = rMax;
4740 2 : Double_t cableSectionZ1 = zMax + 23.6*fgkmm + 3.0*fgkcm + deltaZcables;
4741 2 : Double_t cableSectionZ2 = zMax + 23.6*fgkmm + 4.0*fgkcm + deltaZcables;
4742 : // Those numbers are to be fixed to stick the maximum to the SDD cone
4743 : // (hardcoded numbers are ugly, but it's easier to find where to stop)
4744 :
4745 2 : containerShape->DefineSection(8, cableSectionZ1, cableSectionR1, rMax);
4746 2 : containerShape->DefineSection(9, cableSectionZ2, cableSectionR2, rMax);
4747 :
4748 2 : TGeoVolume *endLadderCards = new TGeoVolume("endLadderCards",containerShape,airSDD);
4749 : //endLadderCards->SetVisibility(kFALSE);
4750 :
4751 : //=*********************************
4752 : //--- The rounded pipe for the end ladder card cooling
4753 :
4754 2 : AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
4755 2 : endLadderPipe.SetNLayers(2);
4756 2 : endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
4757 2 : endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
4758 :
4759 2 : Double_t coordA[3] = { fgkEndLadPipeUwidth/2, rREF, endLadPipeUlength+coolUzPos};
4760 2 : Double_t vectA[3] = {0,0,1};
4761 :
4762 2 : Double_t coordB[3] = { fgkEndLadPipeUwidth/2,rREF, fgkEndLadPipeRadius+coolUzPos};
4763 2 : Double_t vectB[3] = {0,0,1};
4764 :
4765 2 : Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, rREF, coolUzPos};
4766 2 : Double_t vectC[3] = {1,0,0};
4767 :
4768 2 : Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, rREF, coolUzPos};
4769 2 : Double_t vectD[3] = {-1,0,0};
4770 :
4771 2 : Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, rREF, fgkEndLadPipeRadius+coolUzPos};
4772 2 : Double_t vectE[3] = {0,0,-1};
4773 :
4774 2 : Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,rREF, endLadPipeUlength+coolUzPos};
4775 2 : Double_t vectF[3] = {0,0,-1};
4776 :
4777 2 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
4778 2 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
4779 2 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
4780 2 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
4781 2 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
4782 2 : endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
4783 :
4784 2 : endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
4785 : //endLadderPipe.CreateAndInsertCableSegment( 1);
4786 2 : endLadderPipe.CreateAndInsertTubeSegment( 1);
4787 : //endLadderPipe.CreateAndInsertCableSegment( 2);
4788 2 : endLadderPipe.CreateAndInsertTorusSegment( 2);
4789 : //endLadderPipe.CreateAndInsertCableSegment( 3);
4790 2 : endLadderPipe.CreateAndInsertTubeSegment( 3);
4791 : //endLadderPipe.CreateAndInsertCableSegment( 4);
4792 2 : endLadderPipe.CreateAndInsertTorusSegment( 4);
4793 : //endLadderPipe.CreateAndInsertCableSegment( 5);
4794 2 : endLadderPipe.CreateAndInsertTubeSegment( 5);
4795 :
4796 6 : TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
4797 2 : fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
4798 6 : TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
4799 2 : fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
4800 :
4801 6 : TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
4802 2 : - fgkEndLadPipeArmBoxDX,
4803 2 : fgkEndLadPipeArmBoxDY,0);
4804 6 : TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
4805 2 : fgkEndLadPipeArmBoxDX,
4806 2 : fgkEndLadPipeArmBoxDY,0);
4807 2 : endLadPipeArmBoxDY1->RegisterYourself();
4808 2 : endLadPipeArmBoxDY2->RegisterYourself();
4809 :
4810 2 : if(GetDebug(3)) { // Remove compiler warning.
4811 0 : endLadPipeArmBox->InspectShape();
4812 0 : endLadPipeArmTube->InspectShape();
4813 : }
4814 :
4815 4 : TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
4816 : "endLadPipeArmBox:endLadPipeArmBoxDY1"
4817 : "- endLadPipeArmTube");
4818 4 : TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
4819 : "endLadPipeArmBox:endLadPipeArmBoxDY2"
4820 : "- endLadPipeArmTube");
4821 :
4822 6 : TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
4823 2 : endLadPipeArm1, alCu12SDD);
4824 6 : TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
4825 2 : endLadPipeArm2, alCu12SDD);
4826 2 : vEndLadPipeArm1->SetLineColor(2);
4827 2 : vEndLadPipeArm2->SetLineColor(2);
4828 :
4829 2 : Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
4830 2 : +fgkEndLadPipeArmZpos);
4831 :
4832 6 : TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
4833 2 : -fgkEndLadPipeUwidth/2,rREF,armZ);
4834 6 : TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
4835 2 : fgkEndLadPipeUwidth/2,rREF,armZ);
4836 :
4837 2 : endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
4838 2 : endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
4839 :
4840 : //=*********************************
4841 : //--- LV cards
4842 2 : TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
4843 2 : TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
4844 :
4845 2 : Double_t spaceBetweenCards = 0.2*fgkmm;
4846 :
4847 :
4848 2 : Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
4849 2 : +fgkLVcoolZ1*2.);
4850 :
4851 2 : Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
4852 2 : +coolUzPos+1.25*fgkmm;
4853 : // Position in z of the first LVB with respect to the start of the cooling
4854 : // rectangular arm, coming (from inside of the ladder)
4855 : // The cards are added one after the other
4856 :
4857 18 : for (Int_t iCard=0; iCard<nCards; iCard++) {
4858 :
4859 7 : Double_t cardLVzShift = firstLVCardZ +
4860 7 : Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
4861 :
4862 14 : TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
4863 : cardLVyShift+rREF, cardLVzShift);
4864 14 : TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
4865 : cardLVyShift+rREF, cardLVzShift);
4866 :
4867 7 : endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
4868 7 : endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
4869 : }
4870 :
4871 : //=*********************************
4872 : //--- HV cards
4873 2 : TGeoVolumeAssembly *cardHV = fCardHV;
4874 :
4875 2 : Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
4876 2 : + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
4877 : // shift of the HV card in local y w.r.t the local y=0 (center of cooling tube)
4878 :
4879 2 : Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
4880 2 : -(fgkHVCardCeramZ)/2);
4881 :
4882 18 : for (Int_t iCard=0; iCard<nCards; iCard++) {
4883 :
4884 7 : Double_t fact = iCard*2.+1.;
4885 7 : Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
4886 7 : + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
4887 14 : TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy+rREF, coolHVdz);
4888 7 : endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
4889 : }
4890 :
4891 : //=*********************************
4892 : //--- Carlos card
4893 :
4894 2 : TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
4895 : // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
4896 : // 0, -fgkCarlosSuppAngle, 0);
4897 :
4898 2 : Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
4899 4 : Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4900 4 : fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4901 : // position in z of the first Carlos board, coming from inside of the ladder
4902 :
4903 4 : Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4904 2 : fgkEndLadPipeArmBoxDY);
4905 :
4906 18 : for (Int_t iCard=0; iCard<nCards; iCard++) {
4907 :
4908 14 : Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4909 7 : iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4910 21 : TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy+rREF,carloszPos,
4911 7 : (TGeoRotation*) fCommonTr[0]);
4912 :
4913 7 : endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4914 : }
4915 :
4916 :
4917 : //=*********************************
4918 : //--- Cables
4919 :
4920 :
4921 2 : Double_t sectionV = (fgkSectionCuPerMod+fgkSectionPlastPerMod
4922 2 : + fgkSectionGlassPerMod)*nCards
4923 2 : + fgkSectionCoolPolyuEL + fgkSectionCoolWaterEL;
4924 : // We fix thickness, then width is calculated accordingly
4925 2 : Double_t width = sectionV/thickTotCable;
4926 : Double_t thickCu = thickTotCable*fgkSectionCuPerMod
4927 2 : / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4928 2 : Double_t thickPlast = thickTotCable*fgkSectionPlastPerMod
4929 2 : / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4930 : Double_t thickGlass = thickTotCable*fgkSectionGlassPerMod
4931 2 : / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4932 :
4933 : Double_t thickCoolPolyu = thickTotCable*fgkSectionCoolPolyuEL
4934 2 : / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4935 : Double_t thickCoolWater = thickTotCable*fgkSectionCoolWaterEL
4936 2 : / (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod+fgkSectionCoolPolyuEL+fgkSectionCoolWaterEL);
4937 :
4938 2 : AliITSv11GeomCableFlat cable("SDDcableEndLadder",width,thickTotCable);
4939 2 : cable.SetNLayers(5);
4940 2 : cable.SetLayer(0, thickCu, copper, kRed);
4941 2 : cable.SetLayer(1, thickPlast, plastic, kYellow);
4942 2 : cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
4943 2 : cable.SetLayer(3, thickCoolPolyu, polyurethane, kGray);
4944 2 : cable.SetLayer(4, thickCoolWater, coolerMediumSDD, kBlue);
4945 :
4946 2 : Double_t zVect[3]={0,0,1};
4947 6 : Double_t xMinCable = firstCarlosCardZ+nCards*(fgkCarlosSuppZ3
4948 6 : +spaceBetweenCarlsoCards)/2 + 2.9;
4949 : // the 2.9cm is for taking into account carlos card angle...
4950 :
4951 2 : Double_t zEndCable = GetConeZ(cablesRadius-thickTotCable/2, cableSectionR1,
4952 : cableSectionR2,cableSectionZ1,cableSectionZ2);
4953 :
4954 2 : Double_t pos1[3] = {0, cablesRadius, xMinCable};
4955 2 : Double_t pos2[3] = {0, cablesRadius, zEndCable};
4956 2 : cable.AddCheckPoint( endLadderCards, 0, pos1, zVect );
4957 2 : cable.AddCheckPoint( endLadderCards, 1, pos2, zVect );
4958 2 : cable.SetInitialNode(endLadderCards);
4959 2 : cable.CreateAndInsertCableSegment(1);
4960 :
4961 : // The earth cable
4962 4 : TGeoTorus *earthShape = new TGeoTorus(rMax-fgkEndLadderEarthCableR,
4963 : 0., fgkEndLadderEarthCableR,
4964 : phi0, dphi); // same as containerShape
4965 :
4966 6 : TGeoVolume *earthCable = new TGeoVolume("SDDcableEndLadderEarthCable",
4967 2 : earthShape, copper);
4968 :
4969 4 : endLadderCards->AddNode(earthCable, 1,
4970 6 : new TGeoTranslation(0, 0, fgkDistEndLaddCardsLadd+1));
4971 :
4972 : return endLadderCards;
4973 2 : }
4974 :
4975 : //________________________________________________________________________
4976 : TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing() {
4977 : //
4978 : // return an assembly of the support rings, attaching the ladders to the cone
4979 : //
4980 :
4981 :
4982 :
4983 0 : TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4984 0 : TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4985 :
4986 :
4987 : //**********************************
4988 : // ruby cage
4989 :
4990 0 : Double_t fgkRubyCageX = 9*fgkmm;
4991 0 : Double_t fgkRubyCageY = 5.5*fgkmm;
4992 0 : Double_t fgkRubyCageZ = 8*fgkmm;
4993 0 : Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4994 0 : Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4995 0 : Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4996 0 : Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4997 0 : Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4998 :
4999 0 : TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
5000 0 : fgkRubyCageZ/2);
5001 :
5002 : Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
5003 :
5004 : // pieces common to both square and V cages
5005 0 : TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
5006 0 : fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
5007 :
5008 0 : TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
5009 0 : fgkRubyCageHoleDX/2+epsilon);
5010 :
5011 0 : TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
5012 0 : TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
5013 0 : fgkRubyCageX/2-fgkRubyCageHoleDX/2,
5014 0 : -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
5015 0 : trScrewHole->RegisterYourself();
5016 :
5017 0 : TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
5018 0 : fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
5019 0 : TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
5020 : fgkRubyCageX/2-fgkRubyCageHoleDX/2,
5021 0 : -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
5022 0 : trScrewHoleFoot->RegisterYourself();
5023 :
5024 :
5025 : // pieces which differ
5026 0 : Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
5027 :
5028 0 : TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
5029 : fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
5030 :
5031 0 : TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
5032 0 : fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
5033 0 : trRubyCageVInternBox->RegisterYourself();
5034 :
5035 0 : TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
5036 : fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
5037 0 : fgkRubyCageInternSide/4);
5038 :
5039 0 : TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
5040 0 : fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
5041 0 : +epsilon,0,0, rotV );
5042 0 : trRubyCageVInternTriangl->RegisterYourself();
5043 :
5044 : //---
5045 0 : TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
5046 : "rubyCageBox-(rubyCageInternBox"
5047 : "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
5048 :
5049 0 : TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
5050 0 : rubyCageSquare, stainless);
5051 0 : vRubyCageSquare->SetLineColor(10);
5052 :
5053 0 : TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
5054 : "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
5055 : "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
5056 : "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
5057 0 : TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
5058 0 : vRubyCageV->SetLineColor(10);
5059 :
5060 0 : if(GetDebug(3)) { // Remove compiler warning.
5061 0 : rubyCageBox->InspectShape();
5062 0 : rubyCageInternBox->InspectShape();
5063 0 : screwHole->InspectShape();
5064 0 : screwHoleFoot->InspectShape();
5065 0 : rubyCageVInternBox->InspectShape();
5066 0 : rubyCageVInternTriangl->InspectShape();
5067 0 : }
5068 :
5069 0 : supportRing->AddNode(vRubyCageSquare, 0, 0);
5070 : //supportRing->AddNode(vRubyCageV, 0, 0);
5071 :
5072 0 : supportRing->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
5073 :
5074 0 : return supportRing;
5075 0 : }
5076 :
5077 :
5078 :
5079 : //________________________________________________________________________
5080 : void AliITSv11GeometrySDD::CreateSDDsensor() {
5081 : //
5082 : // return a box containing the SDD sensor
5083 : //
5084 :
5085 2 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
5086 1 : TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
5087 1 : TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
5088 1 : TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
5089 1 : TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
5090 1 : TGeoMedium *glassSDD = GetMedium("STDGLASS$"); // StdGlass
5091 :
5092 :
5093 1 : Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
5094 1 : Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
5095 : // width : in the beam direction !
5096 :
5097 2 : Double_t sensoxBoxLength = ( fgkWaferLength +
5098 1 : 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
5099 : // Makes life easier to include the space for the WA HV cable on both sides
5100 2 : Double_t sensoxBoxThick = fgkWaferThickness +
5101 1 : 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
5102 :
5103 : // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
5104 : // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
5105 :
5106 2 : TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
5107 1 : fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
5108 :
5109 2 : fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
5110 2 : fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
5111 :
5112 :
5113 : //****************************
5114 : // silicon wafer
5115 : //****************************
5116 1 : if (fAddSensors) {
5117 : // we need 2 different sensor objects, because they have to have different names
5118 : // This is required for the step manager
5119 :
5120 2 : TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
5121 1 : fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
5122 :
5123 :
5124 1 : TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
5125 1 : wafer3->SetLineColor(fColorSilicon);
5126 2 : TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
5127 1 : fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
5128 1 : TGeoVolume *sensVol3 = new TGeoVolume(fgkSDDsensitiveVolName3,sensBox3, siliconSDDsens);
5129 1 : sensVol3->SetLineColor(fColorSilicon+5);
5130 1 : wafer3->AddNode(sensVol3, 1, 0);
5131 1 : fSDDsensor3->AddNode(wafer3, 1, 0);
5132 :
5133 1 : TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
5134 1 : wafer4->SetLineColor(fColorSilicon);
5135 2 : TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
5136 1 : fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
5137 1 : TGeoVolume *sensVol4 = new TGeoVolume(fgkSDDsensitiveVolName4,sensBox4, siliconSDDsens);
5138 1 : sensVol4->SetLineColor(fColorSilicon+5);
5139 1 : wafer4->AddNode(sensVol4, 1, 0);
5140 1 : fSDDsensor4->AddNode(wafer4, 1, 0);
5141 1 : };
5142 :
5143 : //****************************
5144 : // glass
5145 : //****************************
5146 2 : TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
5147 1 : fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
5148 1 : TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
5149 1 : vGlass->SetLineColor(fColorGlass);
5150 2 : TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
5151 1 : fgkWaferThickness/2+fgkSensorGlassLY/2,
5152 1 : fgkGlassDZOnSensor);
5153 2 : TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
5154 1 : fgkWaferThickness/2+fgkSensorGlassLY/2,
5155 1 : fgkGlassDZOnSensor);
5156 2 : TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
5157 1 : fgkWaferThickness/2+fgkSensorGlassLY/2,
5158 1 : -fgkGlassDZOnSensor);
5159 2 : TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
5160 1 : fgkWaferThickness/2+fgkSensorGlassLY/2,
5161 1 : -fgkGlassDZOnSensor);
5162 1 : fSDDsensor3->AddNode(vGlass, 1, glassTr1);
5163 1 : fSDDsensor3->AddNode(vGlass, 2, glassTr2);
5164 1 : fSDDsensor3->AddNode(vGlass, 3, glassTr3);
5165 1 : fSDDsensor3->AddNode(vGlass, 4, glassTr4);
5166 :
5167 1 : fSDDsensor4->AddNode(vGlass, 1, glassTr1);
5168 1 : fSDDsensor4->AddNode(vGlass, 2, glassTr2);
5169 1 : fSDDsensor4->AddNode(vGlass, 3, glassTr3);
5170 1 : fSDDsensor4->AddNode(vGlass, 4, glassTr4);
5171 :
5172 : //****************************
5173 : // Wrap-around cable
5174 : //****************************
5175 1 : if (fAddHVcables) {
5176 2 : AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
5177 1 : fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
5178 1 : waHVCable.SetNLayers(2);
5179 1 : waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
5180 1 : waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5181 1 : waHVCable.SetInitialNode(fSDDsensor3);
5182 :
5183 1 : Double_t x1[3], x2[3], vX[3] = {1,0,0};
5184 1 : x1[0] = -fgkWaHVcableLength/2;
5185 1 : x2[0] = -x1[0];
5186 1 : x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
5187 1 : x2[1] = x1[1];
5188 1 : x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
5189 1 : x2[2] = x1[2];
5190 :
5191 1 : waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5192 1 : waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5193 1 : TGeoCombiTrans *ctSegment = 0;
5194 1 : TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
5195 1 : fSDDsensor4->AddNode(segment, 1, ctSegment);
5196 :
5197 1 : x1[1] = -x1[1];
5198 1 : x2[1] = x1[1];
5199 1 : waHVCable.SetName("ITSsddWaHVCableD");
5200 1 : waHVCable.ResetPoints();
5201 1 : waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5202 1 : waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5203 1 : segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
5204 1 : fSDDsensor4->AddNode(segment, 1, ctSegment);
5205 :
5206 1 : AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
5207 : rWraping);
5208 1 : waHVCableFold.SetPhi(180,360);
5209 1 : waHVCableFold.SetNLayers(2);
5210 2 : waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
5211 1 : polyhamideSDD, fColorPolyhamide);
5212 1 : waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
5213 1 : waHVCableFold.SetInitialNode(fSDDsensor3);
5214 1 : x1[1] = 0;
5215 1 : x2[1] = 0;
5216 1 : x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
5217 1 : x2[2] = x1[2];
5218 1 : waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5219 1 : waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5220 1 : segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
5221 1 : fSDDsensor4->AddNode(segment, 1, ctSegment);
5222 :
5223 :
5224 : //****************************
5225 : // transition cable
5226 : //****************************
5227 2 : Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
5228 1 : fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
5229 1 : /(2.*fgkTransitHVHeadLZ);
5230 2 : Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
5231 1 : headRadius-fgkTransitHVHeadLZ)
5232 1 : *TMath::RadToDeg();
5233 :
5234 3 : TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
5235 1 : fgkTransitHVPolyThick/2,
5236 1 : 90-theta,90+theta);
5237 1 : headPoly->SetName("headPoly");
5238 3 : TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
5239 1 : -fgkTransitHVPolyThick/2);
5240 1 : headPolyTr->SetName("headPolyTr");
5241 1 : headPolyTr->RegisterYourself();
5242 :
5243 3 : TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
5244 1 : fgkTransitHVAlThick/2,
5245 : 90-theta,90+theta);
5246 1 : headAl->SetName("headAl");
5247 3 : TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
5248 1 : -fgkTransitHVPolyThick
5249 1 : -fgkTransitHVAlThick/2);
5250 1 : headAlTr->SetName("headAlTr");
5251 1 : headAlTr->RegisterYourself();
5252 :
5253 3 : TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
5254 1 : (headRadius-fgkTransitHVHeadLZ)/2,
5255 1 : (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
5256 1 : cache->SetName("cache");
5257 :
5258 3 : TGeoTranslation *headCacheTr = new TGeoTranslation(0,
5259 1 : (headRadius-fgkTransitHVHeadLZ)/2,
5260 2 : -(fgkTransitHVPolyThick
5261 2 : +fgkTransitHVAlThick)/2);
5262 1 : headCacheTr->SetName("cacheTr");
5263 1 : headCacheTr->RegisterYourself();
5264 :
5265 2 : TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
5266 : "headPoly:headPolyTr-cache:cacheTr");
5267 3 : TGeoVolume *vHeadPolyComp = new TGeoVolume(
5268 1 : "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
5269 1 : vHeadPolyComp->SetLineColor(fColorPolyhamide);
5270 2 : TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
5271 : "headAl:headAlTr-cache:cacheTr");
5272 3 : TGeoVolume *vHeadAlComp = new TGeoVolume(
5273 1 : "ITSsddHVtransitHeadAl",headAlComp, alSDD);
5274 1 : vHeadAlComp->SetLineColor(fColorAl);
5275 :
5276 :
5277 : // TGeoRotation rotHead("",0,90,0);
5278 : // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5279 : // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5280 : // &rotHead);
5281 2 : TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
5282 3 : TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
5283 1 : -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
5284 : rotHead);
5285 :
5286 1 : fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
5287 1 : fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
5288 1 : fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
5289 1 : fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
5290 :
5291 : //---
5292 2 : AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
5293 1 : fgkTransitHVBondingLZ,
5294 1 : fgkTransitHVPolyThick+fgkTransitHVAlThick);
5295 1 : transitHVCable.SetNLayers(2);
5296 2 : transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
5297 1 : fColorPolyhamide);
5298 1 : transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
5299 1 : transitHVCable.SetInitialNode(fSDDsensor3);
5300 :
5301 1 : x1[0] = -fgkTransitHVHeadLX/2;
5302 1 : x2[0] = -x1[0];
5303 1 : x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
5304 1 : x2[1] = x1[1];
5305 1 : x1[2] = 0;
5306 1 : x2[2] = 0;
5307 1 : transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
5308 1 : transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
5309 1 : segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
5310 1 : fSDDsensor4->AddNode(segment, 1, ctSegment);
5311 :
5312 1 : transitHVCable.ResetPoints();
5313 1 : transitHVCable.SetName("ITSsddHVtransitTail");
5314 1 : transitHVCable.SetWidth(fgkTransitHVtailWidth);
5315 1 : x1[0] = fgkTransitHVtailXpos;
5316 1 : x2[0] = fgkTransitHVtailXpos;
5317 1 : x1[2] = -fgkTransitHVBondingLZ/2;
5318 1 : x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
5319 1 : Double_t vZ[3] = {0,0,1};
5320 1 : transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
5321 1 : transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
5322 1 : segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
5323 1 : fSDDsensor4->AddNode(segment, 1, ctSegment);
5324 :
5325 : //---
5326 2 : TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
5327 1 : sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5328 2 : sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5329 1 : fgkTransitHVsideLZ);
5330 1 : sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5331 1 : sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5332 1 : sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5333 2 : sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5334 1 : fgkTransitHVsideLZ);
5335 1 : sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5336 1 : sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5337 :
5338 2 : TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
5339 1 : sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5340 2 : sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5341 1 : fgkTransitHVsideLZ);
5342 1 : sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5343 1 : sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
5344 1 : sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
5345 2 : sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
5346 1 : fgkTransitHVsideLZ);
5347 1 : sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
5348 1 : sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
5349 :
5350 : // sideRight is not there actually
5351 : // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
5352 : // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5353 : // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5354 : // fgkTransitHVsideLZ);
5355 : // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5356 : // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
5357 : // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
5358 : // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
5359 : // fgkTransitHVsideLZ);
5360 : // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
5361 : // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
5362 :
5363 : // TGeoRotation rotSide("",0,-90,0);
5364 : // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5365 : // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5366 : // -fgkTransitHVBondingLZ/2,&rotSide);
5367 : // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5368 : // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5369 : // -fgkTransitHVBondingLZ/2, &rotSide);
5370 : // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5371 : // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5372 : // -fgkTransitHVBondingLZ/2, &rotSide);
5373 2 : TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
5374 : // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
5375 : // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5376 : // -fgkTransitHVBondingLZ/2,rotSide);
5377 3 : TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
5378 1 : (fgkWaferThickness+fgkTransitHVPolyThick)/2,
5379 1 : -fgkTransitHVBondingLZ/2, rotSide);
5380 3 : TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
5381 1 : fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
5382 1 : -fgkTransitHVBondingLZ/2, rotSide);
5383 :
5384 3 : TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
5385 1 : sideLeft,polyhamideSDD);
5386 1 : vSideLeft->SetLineColor(fColorPolyhamide);
5387 3 : TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
5388 1 : sideLeftAl,alSDD);
5389 1 : vSideLeftAl->SetLineColor(fColorAl);
5390 :
5391 : // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
5392 : // sideRight,polyhamideSDD);
5393 : // vSideRight->SetLineColor(fColorPolyhamide);
5394 :
5395 1 : fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
5396 1 : fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5397 : // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
5398 :
5399 1 : fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
5400 1 : fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
5401 : // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
5402 1 : };
5403 :
5404 : //****************************
5405 1 : if(GetDebug(1)) {
5406 0 : fSDDsensor3->CheckOverlaps(0.01);
5407 0 : fSDDsensor4->CheckOverlaps(0.01);
5408 0 : }
5409 :
5410 1 : fSDDsensor3->SetVisibility(kFALSE);
5411 1 : fSDDsensor4->SetVisibility(kFALSE);
5412 1 : }
5413 :
5414 : /*
5415 : //________________________________________________________________________
5416 : TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
5417 : //
5418 : // return a box volume containing the detectors
5419 : //
5420 :
5421 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
5422 :
5423 : Int_t nDetectors = fgkLay3Ndet;
5424 : Double_t ladderLength = fgkLay3LadderLength;
5425 : Double_t *sensorZPos = fLay3sensorZPos;
5426 :
5427 : if (iLay==3) {}
5428 : else if (iLay==4) {
5429 : nDetectors = fgkLay4Ndet;
5430 : ladderLength = fgkLay4LadderLength;
5431 : sensorZPos = fLay4sensorZPos;
5432 : } else {
5433 : printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
5434 : };
5435 :
5436 : char name[30];
5437 : Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
5438 : 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
5439 :
5440 : sprintf(name,"ITSsddDetBox%i",iLay);
5441 : TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
5442 : ladderLength*((nDetectors-0.5)/nDetectors)/2);
5443 : TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
5444 :
5445 : for (Int_t i=0; i<nDetectors; i++) {
5446 : Double_t localZ = sensorZPos[i];
5447 : Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5448 : if (iLay==3) if (i%2!=0) localY = -localY;
5449 : if (iLay==4) if (i%2==0) localY = -localY;
5450 : sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
5451 :
5452 : if (i >= nDetectors/2) {
5453 : TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5454 : sensorPos->SetName(name);
5455 : virtualDet->AddNode(fSDDsensor, i, sensorPos);
5456 : }
5457 : else {
5458 : TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5459 : TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5460 : localZ, rotSensor);
5461 : sensorPos->SetName(name);
5462 : virtualDet->AddNode(fSDDsensor, i, sensorPos);
5463 : };
5464 : }
5465 :
5466 : if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5467 : virtualDet->SetVisibility(kFALSE);
5468 : return virtualDet;
5469 : }
5470 : */
5471 :
5472 : //________________________________________________________________________
5473 : TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
5474 : //
5475 : // return a box volume containing the detectors
5476 : //
5477 :
5478 : Int_t nDetectors = fgkLay3Ndet;
5479 : // Double_t ladderLength = fgkLay3LadderLength;
5480 4 : Double_t *sensorZPos = fLay3sensorZPos;
5481 2 : TGeoVolume *sensorSDD = fSDDsensor3;
5482 :
5483 2 : if (iLay==3) {}
5484 1 : else if (iLay==4) {
5485 : nDetectors = fgkLay4Ndet;
5486 : // ladderLength = fgkLay4LadderLength;
5487 1 : sensorZPos = fLay4sensorZPos;
5488 1 : sensorSDD = fSDDsensor4;
5489 1 : } else {
5490 0 : printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
5491 : };
5492 :
5493 2 : char name[30];
5494 2 : snprintf(name,30,"ITSsddDetBox%i",iLay);
5495 :
5496 2 : TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5497 :
5498 32 : for (Int_t i=0; i<nDetectors; i++) {
5499 14 : Double_t localZ = sensorZPos[i];
5500 14 : Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5501 23 : if (iLay==3) if (i%2!=0) localY = -localY;
5502 26 : if (iLay==4) if (i%2==0) localY = -localY;
5503 14 : snprintf(name, 30, "ITSsddLay%iSensorPos%i",iLay, i);
5504 :
5505 14 : if (i >= nDetectors/2) {
5506 7 : TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5507 7 : sensorPos->SetName(name);
5508 7 : virtualDet->AddNode(sensorSDD, i, sensorPos);
5509 7 : }
5510 : else {
5511 7 : TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5512 7 : TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5513 : localZ, rotSensor);
5514 7 : sensorPos->SetName(name);
5515 7 : virtualDet->AddNode(sensorSDD, i, sensorPos);
5516 : };
5517 : }
5518 :
5519 2 : virtualDet->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
5520 :
5521 2 : if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5522 2 : return virtualDet;
5523 2 : }
5524 :
5525 :
5526 : //________________________________________________________________________
5527 : TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
5528 : //
5529 : // return a box volume containing the detectors
5530 : // Special case for Layer 3 Ladder 2 which is rotated (cannot simply
5531 : // rotate the standard volume, because the module numbering would be wrong)
5532 : // M.Sitta 25 Nov 2009
5533 : //
5534 :
5535 : Int_t nDetectors = fgkLay3Ndet;
5536 2 : Double_t *sensorZPos = fLay3sensorZPos;
5537 1 : TGeoVolume *sensorSDD = fSDDsensor3;
5538 :
5539 1 : char name[30];
5540 1 : snprintf(name,30,"ITSsddDetBoxLadd2");
5541 :
5542 1 : TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
5543 :
5544 14 : for (Int_t i=0; i<nDetectors; i++) {
5545 6 : Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
5546 6 : Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
5547 9 : if (i%2==0) localY = -localY;
5548 6 : snprintf(name, 30, "ITSsddLayLadd2SensorPos%i", i);
5549 :
5550 6 : if (i >= nDetectors/2) {
5551 3 : TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
5552 3 : sensorPos->SetName(name);
5553 3 : virtualDet->AddNode(sensorSDD, i, sensorPos);
5554 3 : }
5555 : else {
5556 3 : TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
5557 3 : TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
5558 : localZ, rotSensor);
5559 3 : sensorPos->SetName(name);
5560 3 : virtualDet->AddNode(sensorSDD, i, sensorPos);
5561 : };
5562 : }
5563 :
5564 1 : virtualDet->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
5565 :
5566 1 : if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
5567 1 : return virtualDet;
5568 1 : }
5569 :
5570 :
5571 : //________________________________________________________________________
5572 : Int_t AliITSv11GeometrySDD::
5573 : GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
5574 : //
5575 : // Function which gives the layer, ladder and det.
5576 : // index of the current volume. To be used in
5577 : // AliITS::StepManager()
5578 : //
5579 :
5580 0 : if (gGeoManager->GetLevel()<3) return kFALSE;
5581 : // Get the det index :
5582 0 : TGeoNode *node = gGeoManager->GetMother(2);
5583 0 : if (!node) return kFALSE;
5584 0 : det = node->GetNumber()+1;
5585 :
5586 : // Get the ladder index :
5587 0 : node = gGeoManager->GetMother(3);
5588 0 : if (!node) return kFALSE;
5589 0 : ladd = node->GetNumber()+1;
5590 :
5591 : // Get the layer index :
5592 0 : if (node->GetNdaughters()==fgkLay3Ndet)
5593 0 : lay = 3;
5594 0 : else lay = 4;
5595 :
5596 0 : return kTRUE;
5597 0 : }
5598 :
5599 :
5600 : //________________________________________________________________________
5601 : TGeoPcon* AliITSv11GeometrySDD::CreateConeConstSection(Double_t r1max, Double_t z1,
5602 : Double_t r2max, Double_t z2,
5603 : Double_t section, Int_t nDiv)
5604 : {
5605 : // Creates a cone along z where the section is approximately constant
5606 : // with z. This is for simulation of cables, because a cone with a constant
5607 : // radius difference would show a quantity of matter increasing with z...
5608 : // The max radius of the created Pcon is evolving linearly, the min radius
5609 : // is calculated at several steps (nDiv).
5610 : // z2 > z1 (required by the Pcon)
5611 :
5612 24 : TGeoPcon *myPcon = new TGeoPcon(0, 360, 1+nDiv);
5613 :
5614 12 : Double_t dr = (r2max-r1max)/nDiv;
5615 12 : Double_t dz = (z2-z1)/nDiv;
5616 : Double_t r1minI, r2minI, r1maxI, r2maxI;
5617 : Double_t z1I, z2I;
5618 :
5619 12 : Double_t lZ = TMath::Sqrt((r2max-r1max)*(r2max-r1max) + (z2-z1)*(z2-z1));
5620 12 : Double_t cosAlpha = (z2-z1)/lZ;
5621 :
5622 12 : r1minI = TMath::Sqrt(r1max*r1max-section/(TMath::Pi()*cosAlpha));
5623 12 : myPcon->DefineSection(0, z1, r1minI, r1max);
5624 :
5625 84 : for (Int_t i=0; i<nDiv; i++) {
5626 :
5627 30 : z1I = z1 + i*dz;
5628 30 : z2I = z1I + dz;
5629 30 : r1maxI = r1max + i*dr;
5630 30 : r2maxI = r1maxI + dr;
5631 :
5632 30 : r2minI = TMath::Sqrt(r2maxI*r2maxI-section/(TMath::Pi()*cosAlpha));
5633 30 : myPcon->DefineSection(i+1, z2I, r2minI, r2maxI);
5634 : }
5635 12 : return myPcon;
5636 0 : }
5637 :
5638 :
5639 : //________________________________________________________________________
5640 : Double_t AliITSv11GeometrySDD::GetConeZ(Double_t r, Double_t refR1, Double_t refR2,
5641 : Double_t refZ1, Double_t refZ2) const {
5642 : // just a helping function
5643 10 : return refZ1+(refZ2-refZ1)*(r-refR1)/(refR2-refR1);
5644 : }
5645 :
5646 : //________________________________________________________________________
5647 : Int_t AliITSv11GeometrySDD::CreateAndInsetConeCablePart(TGeoVolume *mother, Double_t angle,
5648 : Int_t nLay3, Int_t nLay4,
5649 : Double_t r1, Double_t z1,
5650 : Double_t r2, Double_t z2) {
5651 :
5652 : // Create some cables portions from SDD modules grouped
5653 : // and attached at the border of the SSD cone
5654 :
5655 26 : TGeoMedium *copper = GetMedium("COPPER$");
5656 13 : TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5657 13 : TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5658 :
5659 13 : char titleCable[30];
5660 13 : snprintf(titleCable,30,"cableSDDport%i",(Int_t)angle);
5661 :
5662 : //---
5663 13 : Double_t section = (fgkSectionCuPerMod+fgkSectionPlastPerMod+fgkSectionGlassPerMod)*(nLay3+nLay4);
5664 : Double_t thickness = 1.; // let's fix the thickness, then calculate the width
5665 13 : Double_t width = section/thickness;
5666 13 : Double_t thickCu = thickness*fgkSectionCuPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5667 : +fgkSectionGlassPerMod);
5668 :
5669 13 : Double_t thickPlast = thickness*fgkSectionPlastPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5670 : +fgkSectionGlassPerMod);
5671 :
5672 13 : Double_t thickGlass = thickness*fgkSectionGlassPerMod/(fgkSectionCuPerMod+fgkSectionPlastPerMod
5673 : +fgkSectionGlassPerMod);
5674 :
5675 13 : Double_t hypothenus = TMath::Sqrt( (r2-r1)*(r2-r1) + (z2-z1)*(z2-z1) );
5676 13 : Double_t cosAlpha = (z2-z1)/hypothenus;
5677 13 : Double_t radius1Cable = TMath::Sqrt(r1*r1 - width*width/4) - 0.5*thickness/cosAlpha;
5678 13 : Double_t radius2Cable = TMath::Sqrt(r2*r2 - width*width/4) - 0.5*thickness/cosAlpha;
5679 13 : angle *= TMath::DegToRad();
5680 13 : Double_t x1 = radius1Cable*TMath::Cos(angle), y1 = radius1Cable*TMath::Sin(angle);
5681 13 : Double_t x2 = radius2Cable*TMath::Cos(angle), y2 = radius2Cable*TMath::Sin(angle);
5682 13 : Double_t pos1[3] = {x1,y1,z1};
5683 13 : Double_t pos2[3] = {x2,y2,z2};
5684 13 : Double_t zVect[3] = {0,0,1};
5685 :
5686 13 : AliITSv11GeomCableFlat cable(titleCable,width,thickness);
5687 13 : cable.SetNLayers(3);
5688 13 : cable.SetLayer(0, thickPlast, plastic, kYellow);
5689 13 : cable.SetLayer(1, thickCu, copper, kRed);
5690 13 : cable.SetLayer(2, thickGlass, opticalFiber, kGreen);
5691 :
5692 13 : cable.AddCheckPoint( mother, 0, pos1, zVect );
5693 13 : cable.AddCheckPoint( mother, 1, pos2, zVect );
5694 13 : cable.SetInitialNode(mother);
5695 13 : cable.CreateAndInsertCableSegment(1);
5696 :
5697 : return kTRUE;
5698 13 : }
5699 :
5700 :
5701 :
5702 : //________________________________________________________________________
5703 : void AliITSv11GeometrySDD::SDDCables(TGeoVolume *moth)
5704 : {
5705 : //
5706 : // Creates and inserts the SDD cables running on SDD and SSD cones
5707 : //
5708 : // Input:
5709 : // moth : the TGeoVolume owing the volume structure
5710 : // Output:
5711 : //
5712 : // Created: ??? Ludovic Gaudichet
5713 : // Updated: 15 Mar 2008 Mario Sitta
5714 : // Updated: 14 Apr 2008 Mario Sitta Overlap fixes
5715 : // Updated: 09 May 2008 Mario Sitta SSD overlap fixes
5716 : //
5717 :
5718 2 : TGeoMedium *copper = GetMedium("COPPER$");
5719 1 : TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$");
5720 1 : TGeoMedium *opticalFiber = GetMedium("SDD OPTICFIB$");
5721 1 : TGeoMedium *airSDD = GetMedium("SDD AIR$");
5722 :
5723 :
5724 : //==================================
5725 : //
5726 : //==================================
5727 :
5728 : Double_t nModLay3 = fgkLay3Nladd*fgkLay3Ndet;
5729 : Double_t nModLay4 = fgkLay4Nladd*fgkLay4Ndet;
5730 :
5731 1 : Double_t sectionLay3Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay3/2;
5732 1 : Double_t sectionLay3Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay3/2;
5733 1 : Double_t sectionLay3Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay3/2;
5734 :
5735 1 : Double_t sectionLay4Cu = fgkCableBendRatio*fgkSectionCuPerMod*nModLay4/2;
5736 1 : Double_t sectionLay4Plastic = fgkCableBendRatio*fgkSectionPlastPerMod*nModLay4/2;
5737 1 : Double_t sectionLay4Glass = fgkCableBendRatio*fgkSectionGlassPerMod*nModLay4/2;
5738 :
5739 : // Do not use hardcoded numbers, get them from real shapes - M.S. 15/03/08
5740 1 : TGeoVolume *sddCone = gGeoManager->GetVolume("SDDCarbonFiberCone");
5741 1 : TGeoPcon *sddConeShape = (TGeoPcon*)sddCone->GetShape();
5742 :
5743 1 : TGeoVolume *sddCylinder = gGeoManager->GetVolume("SDDCarbonFiberCylinder");
5744 1 : TGeoTube *sddCylinderShape = (TGeoTube*)sddCylinder->GetShape();
5745 :
5746 : // (were fgkConeSDDr1, fgkConeSDDr2, fgkConeSDDz1, fgkConeSDDz2 hardcoded)
5747 1 : Double_t coneSDDr1 = sddConeShape->GetRmin(5);
5748 1 : Double_t coneSDDr2 = sddConeShape->GetRmin(3);
5749 :
5750 2 : Double_t coneSDDz1 = sddConeShape->GetZ(9) - sddConeShape->GetZ(5) +
5751 1 : sddCylinderShape->GetDz();
5752 2 : Double_t coneSDDz2 = sddConeShape->GetZ(9) - sddConeShape->GetZ(3) +
5753 1 : sddCylinderShape->GetDz();
5754 :
5755 : // Calculate z1, z2 thanks to R1 and R2
5756 1 : Double_t sddCableZ1 = GetConeZ(fgkSDDCableR1, coneSDDr1, coneSDDr2,
5757 : coneSDDz1, coneSDDz2);
5758 1 : Double_t sddCableZ2 = GetConeZ(fgkSDDCableR2, coneSDDr1, coneSDDr2,
5759 : coneSDDz1, coneSDDz2);
5760 1 : Double_t sddCableZ3 = GetConeZ(fgkSDDCableR3, coneSDDr1, coneSDDr2,
5761 : coneSDDz1, coneSDDz2);
5762 :
5763 1 : TGeoRotation *rotCableSDD = new TGeoRotation("rotCableSDD",0,180,0);
5764 :
5765 : //==================================
5766 : // first set of cones : cables from layer 3
5767 : //==================================
5768 :
5769 2 : TGeoPcon* pcon1all = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5770 1 : fgkSDDCableR2, sddCableZ2,
5771 1 : sectionLay3Plastic+sectionLay3Cu+sectionLay3Glass, 1);
5772 :
5773 1 : TGeoPcon* pcon1container = new TGeoPcon(0,360,2);
5774 2 : pcon1container->DefineSection(0, sddCableZ1, pcon1all->GetRmin(0),
5775 1 : pcon1all->GetRmax(0));
5776 :
5777 1 : Double_t drMax = pcon1all->GetRmax(0)- pcon1all->GetRmin(0);
5778 2 : pcon1container->DefineSection(1, sddCableZ2, pcon1all->GetRmax(1)-drMax,
5779 1 : pcon1all->GetRmax(1));
5780 :
5781 2 : TGeoVolume *vpcon1container = new TGeoVolume("vpcon1container",
5782 1 : pcon1container, airSDD);
5783 1 : vpcon1container->SetVisibility(kFALSE);
5784 :
5785 2 : TGeoPcon* pcon1plast = CreateConeConstSection(fgkSDDCableR1, sddCableZ1,
5786 1 : fgkSDDCableR2, sddCableZ2,
5787 : sectionLay3Plastic, 3);
5788 :
5789 2 : TGeoVolume *vpcon1plast = new TGeoVolume("ITScablesSDDpcon1Plast",
5790 1 : pcon1plast, plastic);
5791 1 : vpcon1plast->SetLineColor(kYellow);
5792 1 : vpcon1container->AddNode(vpcon1plast, 0);
5793 :
5794 1 : Double_t dr1a = fgkSDDCableR1 - pcon1plast->GetRmin(0);
5795 2 : TGeoPcon* pcon1Cu = CreateConeConstSection(fgkSDDCableR1 - dr1a, sddCableZ1,
5796 1 : fgkSDDCableR2 - dr1a, sddCableZ2,
5797 : sectionLay3Cu, 3);
5798 :
5799 2 : TGeoVolume *vpcon1Cu = new TGeoVolume("ITScablesSDDpcon1Cu",
5800 1 : pcon1Cu, copper);
5801 1 : vpcon1Cu->SetLineColor(kRed);
5802 1 : vpcon1container->AddNode(vpcon1Cu, 0);
5803 :
5804 1 : Double_t dr1b = pcon1Cu->GetRmax(0) - pcon1Cu->GetRmin(0);
5805 2 : TGeoPcon* pcon1glass = CreateConeConstSection(fgkSDDCableR1-dr1a-dr1b, sddCableZ1,
5806 1 : fgkSDDCableR2-dr1a-dr1b, sddCableZ2,
5807 : sectionLay3Glass, 3);
5808 :
5809 2 : TGeoVolume *vpcon1glass = new TGeoVolume("ITScablesSDDpcon1glass",
5810 1 : pcon1glass, opticalFiber);
5811 1 : vpcon1glass->SetLineColor(kGreen);
5812 1 : vpcon1container->AddNode(vpcon1glass, 0);
5813 :
5814 1 : moth->AddNode(vpcon1container, 1);
5815 1 : moth->AddNode(vpcon1container, 2, rotCableSDD);
5816 :
5817 : //==================================
5818 : // 2nd set of cones : cables from layer 3 and layer 4
5819 : //==================================
5820 :
5821 2 : TGeoPcon* pcon2all = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5822 1 : fgkSDDCableR3, sddCableZ3,
5823 1 : sectionLay3Plastic+sectionLay4Plastic+
5824 1 : sectionLay3Cu+sectionLay4Cu+
5825 1 : sectionLay3Glass+sectionLay4Glass, 1);
5826 :
5827 1 : TGeoPcon* pcon2container = new TGeoPcon(0,360,2);
5828 2 : pcon2container->DefineSection(0, sddCableZ2, pcon2all->GetRmin(0),
5829 1 : pcon2all->GetRmax(0));
5830 :
5831 1 : drMax = pcon2all->GetRmax(0)- pcon2all->GetRmin(0);
5832 2 : pcon2container->DefineSection(1, sddCableZ3, pcon2all->GetRmax(1)-drMax,
5833 1 : pcon2all->GetRmax(1));
5834 :
5835 :
5836 2 : TGeoVolume *vpcon2container = new TGeoVolume("vpcon2container",
5837 1 : pcon2container, airSDD);
5838 1 : vpcon2container->SetVisibility(kFALSE);
5839 :
5840 2 : TGeoPcon* pcon2plast = CreateConeConstSection(fgkSDDCableR2, sddCableZ2,
5841 1 : fgkSDDCableR3, sddCableZ3,
5842 : sectionLay3Plastic+
5843 : sectionLay4Plastic, 3);
5844 :
5845 2 : TGeoVolume *vpcon2plast = new TGeoVolume("ITScablesSDDpcon2Plast",
5846 1 : pcon2plast, plastic);
5847 1 : vpcon2plast->SetLineColor(kYellow);
5848 1 : vpcon2container->AddNode(vpcon2plast, 0);
5849 :
5850 1 : Double_t dr2a = fgkSDDCableR2 - pcon2plast->GetRmin(0);
5851 2 : TGeoPcon* pcon2Cu = CreateConeConstSection(fgkSDDCableR2 - dr2a, sddCableZ2,
5852 1 : fgkSDDCableR3 - dr2a, sddCableZ3,
5853 1 : sectionLay3Cu+sectionLay4Cu, 3);
5854 :
5855 2 : TGeoVolume *vpcon2Cu = new TGeoVolume("ITScablesSDDpcon2Cu",
5856 1 : pcon2Cu, copper);
5857 1 : vpcon2Cu->SetLineColor(kRed);
5858 1 : vpcon2container->AddNode(vpcon2Cu, 0);
5859 :
5860 1 : Double_t dr2b = pcon2Cu->GetRmax(0) - pcon2Cu->GetRmin(0);
5861 2 : TGeoPcon* pcon2glass = CreateConeConstSection(fgkSDDCableR2-dr2a-dr2b, sddCableZ2,
5862 1 : fgkSDDCableR3-dr2a-dr2b, sddCableZ3,
5863 1 : sectionLay3Glass+
5864 : sectionLay4Glass, 3);
5865 :
5866 2 : TGeoVolume *vpcon2glass = new TGeoVolume("ITScablesSDDpcon2glass",
5867 1 : pcon2glass, opticalFiber);
5868 1 : vpcon2glass->SetLineColor(kGreen);
5869 1 : vpcon2container->AddNode(vpcon2glass, 0);
5870 :
5871 1 : moth->AddNode(vpcon2container, 1);
5872 1 : moth->AddNode(vpcon2container, 2, rotCableSDD);
5873 :
5874 : //==================================
5875 : // intermediate cylinder
5876 : //==================================
5877 :
5878 : // (was fgkSDDCableDZint hardcoded)
5879 2 : Double_t sddCableDZint = (sddConeShape->GetZ(9) - sddConeShape->GetZ(0) +
5880 2 : sddCylinderShape->GetDz()) - sddCableZ3;
5881 :
5882 2 : TGeoTube *interCyl = new TGeoTube("sddCableInterCyl",
5883 1 : pcon2container->GetRmin(1),
5884 1 : pcon2container->GetRmax(1),
5885 1 : sddCableDZint/2);
5886 :
5887 2 : TGeoVolume *vInterCyl = new TGeoVolume("vSddCableInterCyl",
5888 1 : interCyl, airSDD);
5889 1 : vInterCyl->SetVisibility(kFALSE);
5890 :
5891 1 : Double_t rmaxCylPlast = pcon2container->GetRmax(1);
5892 2 : Double_t rminCylPlast = TMath::Sqrt(rmaxCylPlast*rmaxCylPlast -
5893 1 : (sectionLay3Plastic+sectionLay4Plastic)/TMath::Pi() );
5894 :
5895 1 : TGeoTube *interCylPlast = new TGeoTube("sddCableInterCylPlast", rminCylPlast,
5896 : rmaxCylPlast, sddCableDZint/2);
5897 :
5898 2 : TGeoVolume *vInterCylPlast = new TGeoVolume("vSddCableInterCylPlast",
5899 1 : interCylPlast, plastic);
5900 1 : vInterCylPlast->SetLineColor(kYellow);
5901 1 : vInterCyl->AddNode(vInterCylPlast, 0);
5902 :
5903 1 : Double_t rmaxCylCu = pcon2Cu->GetRmax(3);
5904 2 : Double_t rminCylCu = TMath::Sqrt(rmaxCylCu*rmaxCylCu -
5905 1 : (sectionLay3Cu+sectionLay4Cu)/TMath::Pi() );
5906 :
5907 1 : TGeoTube *interCylCu = new TGeoTube("sddCableInterCylCu", rminCylCu,
5908 : rmaxCylCu, sddCableDZint/2);
5909 :
5910 2 : TGeoVolume *vInterCylCu = new TGeoVolume("vSddCableInterCylCu",
5911 1 : interCylCu, copper);
5912 1 : vInterCylCu->SetLineColor(kRed);
5913 1 : vInterCyl->AddNode(vInterCylCu, 0);
5914 :
5915 1 : Double_t rmaxCylGlass = pcon2glass->GetRmax(3);
5916 2 : Double_t rminCylGlass = TMath::Sqrt(rmaxCylGlass*rmaxCylGlass -
5917 1 : (sectionLay3Glass+sectionLay4Glass)/TMath::Pi() );
5918 :
5919 1 : TGeoTube *interCylGlass = new TGeoTube("sddCableInterCylGlass", rminCylGlass,
5920 : rmaxCylGlass, sddCableDZint/2);
5921 :
5922 2 : TGeoVolume *vInterCylGlass = new TGeoVolume("vSddCableInterCylGlass",
5923 1 : interCylGlass,opticalFiber);
5924 1 : vInterCylGlass->SetLineColor(kGreen);
5925 1 : vInterCyl->AddNode(vInterCylGlass, 0);
5926 :
5927 3 : moth->AddNode(vInterCyl, 1, new TGeoTranslation(0, 0,
5928 1 : sddCableZ3+sddCableDZint/2));
5929 3 : moth->AddNode(vInterCyl, 2, new TGeoTranslation(0, 0,
5930 1 : -sddCableZ3-sddCableDZint/2));
5931 :
5932 : //==================================
5933 : // cable cone on the SSD cone
5934 : //==================================
5935 :
5936 : Double_t sddCableR4 = rmaxCylPlast;
5937 1 : Double_t sddCableZ4 = sddCableZ3 + sddCableDZint;
5938 :
5939 1 : TGeoPcon* pcon3all = CreateConeConstSection(sddCableR4, sddCableZ4,
5940 1 : fgkSDDCableR5, fgkSDDCableZ5,
5941 : sectionLay3Plastic+
5942 : sectionLay4Plastic+
5943 : sectionLay3Cu+sectionLay4Cu+
5944 : sectionLay3Glass+sectionLay4Glass, 1);
5945 :
5946 1 : TGeoPcon* pcon3container = new TGeoPcon(0,360,2);
5947 2 : pcon3container->DefineSection(0, sddCableZ4, pcon3all->GetRmin(0),
5948 1 : pcon3all->GetRmax(0));
5949 :
5950 1 : drMax = pcon3all->GetRmax(0) - pcon3all->GetRmin(0);
5951 2 : pcon3container->DefineSection(1, fgkSDDCableZ5, pcon3all->GetRmax(1)-drMax,
5952 1 : pcon3all->GetRmax(1));
5953 :
5954 :
5955 2 : TGeoVolume *vpcon3container = new TGeoVolume("vpcon3container",
5956 1 : pcon3container, airSDD);
5957 1 : vpcon3container->SetVisibility(kFALSE);
5958 :
5959 1 : TGeoPcon* pcon3plast = CreateConeConstSection(sddCableR4, sddCableZ4,
5960 1 : fgkSDDCableR5, fgkSDDCableZ5,
5961 : sectionLay3Plastic+
5962 : sectionLay4Plastic, 3);
5963 :
5964 2 : TGeoVolume *vpcon3plast = new TGeoVolume("ITScablesSDDpcon3Plast",
5965 1 : pcon3plast, plastic);
5966 1 : vpcon3plast->SetLineColor(kYellow);
5967 1 : vpcon3container->AddNode(vpcon3plast, 0);
5968 :
5969 1 : Double_t dr3a = sddCableR4 - pcon3plast->GetRmin(0);
5970 2 : TGeoPcon* pcon3Cu = CreateConeConstSection(sddCableR4 - dr3a, sddCableZ4,
5971 1 : fgkSDDCableR5 - dr3a, fgkSDDCableZ5,
5972 : sectionLay3Cu+sectionLay4Cu, 3);
5973 :
5974 2 : TGeoVolume *vpcon3Cu = new TGeoVolume("ITScablesSDDpcon3Cu",
5975 1 : pcon3Cu, copper);
5976 1 : vpcon3Cu->SetLineColor(kRed);
5977 1 : vpcon3container->AddNode(vpcon3Cu, 0);
5978 :
5979 1 : Double_t dr3b = pcon3Cu->GetRmax(0) - pcon3Cu->GetRmin(0);
5980 2 : TGeoPcon* pcon3glass = CreateConeConstSection(sddCableR4-dr3a-dr3b, sddCableZ4,
5981 1 : fgkSDDCableR5-dr3a-dr3b, fgkSDDCableZ5,
5982 : sectionLay3Glass+sectionLay4Glass, 3);
5983 :
5984 2 : TGeoVolume *vpcon3glass = new TGeoVolume("ITScablesSDDpcon3glass",
5985 1 : pcon3glass,opticalFiber);
5986 1 : vpcon3glass->SetLineColor(kGreen);
5987 1 : vpcon3container->AddNode(vpcon3glass, 0);
5988 :
5989 1 : moth->AddNode(vpcon3container, 1);
5990 1 : moth->AddNode(vpcon3container, 2, rotCableSDD);
5991 :
5992 : //==================================
5993 : // cables that are grouped at the end of SSD cones
5994 : //==================================
5995 :
5996 : // Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
5997 : // Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
5998 1 : Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
5999 1 : Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
6000 :
6001 1 : TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
6002 :
6003 : // Add some hardcoded shifts to avoid overlaps with SSD pathc panels
6004 2 : CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
6005 1 : fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
6006 :
6007 2 : CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
6008 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6009 :
6010 2 : CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
6011 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6012 :
6013 2 : CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
6014 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6015 :
6016 2 : CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
6017 1 : fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
6018 :
6019 2 : CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
6020 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6021 :
6022 2 : CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
6023 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6024 :
6025 2 : CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
6026 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6027 :
6028 2 : CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
6029 1 : fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
6030 :
6031 2 : CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
6032 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6033 :
6034 2 : CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
6035 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6036 :
6037 2 : CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
6038 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6039 :
6040 2 : CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
6041 1 : fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
6042 :
6043 1 : endConeSDDCable->GetShape()->ComputeBBox(); //RS: enforce recompting of BBox
6044 :
6045 1 : moth->AddNode(endConeSDDCable, 1, 0);
6046 :
6047 1 : TGeoRotation* reflect = new TGeoRotation("reflectEndConeSDDCable");
6048 1 : reflect->ReflectZ(kTRUE);
6049 1 : moth->AddNode(endConeSDDCable, 2, reflect);
6050 :
6051 :
6052 : return;
6053 1 : }
|