1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 *********************************s*****************************************/
17 //*************************************************************************
19 // SDD geometry, based on ROOT geometrical modeler
22 // This geometry has no dependence with aliroot, you can run it with root
23 // only, provided that the AliITSv11GeomCable classes are also compiled
25 // Ludovic Gaudichet gaudichet@to.infn.it
26 //*************************************************************************
32 // General Root includes
35 // Root Geometry includes
36 #include <TGeoManager.h>
37 #include <TGeoVolume.h>
42 #include <TGeoCompositeShape.h>
43 #include <TGeoMatrix.h>
46 #include "AliITSgeom.h"
47 #include "AliITSgeomSDD.h"
48 #include "AliITSv11GeometrySDD.h"
49 #include "AliITSv11GeomCableFlat.h"
50 #include "AliITSv11GeomCableRound.h"
52 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName3 = "ITSsddSensitivL3";
53 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName4 = "ITSsddSensitivL4";
54 const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.2*2*fgkmm;
55 const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm;
56 const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm;
57 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 3.5*fgkmm;
58 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 3.*fgkmm;
60 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
61 const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
62 const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
63 const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
67 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
68 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
70 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
71 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
72 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
73 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
74 const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
75 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
76 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
78 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
79 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
80 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
82 // parameters from ALR-0752/3
83 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
84 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
85 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
86 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
88 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
91 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
92 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
93 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
94 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
96 const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
97 const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
98 const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
99 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
100 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
102 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
103 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
104 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
108 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 145.*fgkmm; // not min! Rmin virtual tube
109 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 205.*fgkmm; // not min! Rmax virtual tube
110 const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
111 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
112 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
113 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
114 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
115 const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
116 const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
117 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
119 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 220.*fgkmm; // not min! Rmin virtual tube
120 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 290.*fgkmm; // not min! Rmax virtual tube
121 const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
122 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
123 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
124 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
125 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
126 const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
127 const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
128 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
131 const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!!
132 // Origine taken at the hybrid corner :
133 const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
134 const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
135 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
136 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
137 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
139 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
140 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
141 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
142 // center of ships to the border
143 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
144 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
145 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
146 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
147 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
148 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
149 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
150 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
151 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
152 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
153 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
154 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
155 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
157 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
158 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
159 const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
160 const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
161 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
162 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
163 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
164 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
165 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
166 const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
167 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
168 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
169 const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
170 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
171 {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
172 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
173 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
174 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
175 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
176 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
177 { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
178 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
179 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
180 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
181 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
182 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
183 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
184 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
185 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
186 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
188 const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
189 const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
190 const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
191 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
192 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
193 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 74.97*fgkmm;
195 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
196 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
197 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
199 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
200 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
201 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
202 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4*fgkmm; // check !!!
203 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 5.24*fgkmm; //5.24*fgkmm;// check !!!
205 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
206 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
207 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
208 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
209 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
211 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
212 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
213 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
214 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
215 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
216 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
217 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
218 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; //8*fgkmm // ???, a mesurer !!!
219 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
220 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
221 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
223 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
224 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
225 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
227 const Double_t AliITSv11GeometrySDD::fgkRubyDX = 14.*fgkmm;
228 const Double_t AliITSv11GeometrySDD::fgkRubyZladd3 = 250*fgkmm;
229 const Double_t AliITSv11GeometrySDD::fgkRubyZladd4 = 325*fgkmm;
231 // the stesalite ladder foot at its end
232 const Double_t AliITSv11GeometrySDD::fgkLadFootX = 60.*fgkmm;
233 const Double_t AliITSv11GeometrySDD::fgkLadFootZ = 20.*fgkmm;
234 const Double_t AliITSv11GeometrySDD::fgkLadFootY = 8.*fgkmm;
235 const Double_t AliITSv11GeometrySDD::fgkLadFootMiddleY = 4.5*fgkmm;
236 const Double_t AliITSv11GeometrySDD::fgkLadBox1X = 23.*fgkmm;
237 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintX = 6.*fgkmm;
238 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintY = 1.*fgkmm;
239 const Double_t AliITSv11GeometrySDD::fgkLadFingerPrintBorder = 4.*fgkmm;
240 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleZ = 8.*fgkmm;
241 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleX = 9.*fgkmm;
242 const Double_t AliITSv11GeometrySDD::fgkRubyCageHoleY = 6.5*fgkmm;
243 const Double_t AliITSv11GeometrySDD::fgkRubyCageAxisShift = 0.5*fgkmm;
244 const Double_t AliITSv11GeometrySDD::fgkScrewM4diam = 4.*fgkmm;
246 const Double_t AliITSv11GeometrySDD::fgkRubyScrewShiftToCenterY = 0.1;
247 const Double_t AliITSv11GeometrySDD::fgkRubyHoleDiam = 0.5;
249 // the U cooling pipe and its heat exchanger in end-ladder cards system
250 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay3 = 138*fgkmm;
251 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUlengthLay4 = 150*fgkmm;
252 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeUwidth = 59*fgkmm;
253 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeRadius = 5*fgkmm;
254 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeInnerDiam = 2.8*fgkmm;
255 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeOuterDiam = 3.*fgkmm;
256 //--- The al body of the cooling syst.of the heat exchanger :
257 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay3 = 112.*fgkmm; //
258 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZLay4 = 125.*fgkmm; //
259 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmX = 4.75*fgkmm; // the arms of the U cooling tube
260 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmY = 6.8*fgkmm;
261 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDY = 1.03*fgkmm; // shift in Y of the arms from the axis
262 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmBoxDX = 0.125*fgkmm; // shift in X of the arms from the axis
263 const Double_t AliITSv11GeometrySDD::fgkEndLadPipeArmZpos = 8.9*fgkmm; //
266 const Double_t AliITSv11GeometrySDD::fgkLVcardX = 26.525*fgkmm;
267 const Double_t AliITSv11GeometrySDD::fgkLVcardY = 44.95*fgkmm;
268 const Double_t AliITSv11GeometrySDD::fgkLVcardZ = 1.*fgkmm; // all except Cu layer //???
269 const Double_t AliITSv11GeometrySDD::fgkLVcardCuZ = 0.1*fgkmm; //???
271 const Double_t AliITSv11GeometrySDD::fgkLVChip0X = 16.525*fgkmm;
272 const Double_t AliITSv11GeometrySDD::fgkLVChip0Y = 10.8*fgkmm;
273 const Double_t AliITSv11GeometrySDD::fgkLVChip0Z = 3.5*fgkmm; // all except si layer //???
274 const Double_t AliITSv11GeometrySDD::fgkLVChip0SiZ = 0.2*fgkmm; //???????????????????????????????????????????????????
275 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosX = 13.*fgkmm; //19.95*fgkmm; ???
276 const Double_t AliITSv11GeometrySDD::fgkLVChip0PosY = 10.3*fgkmm;
278 const Double_t AliITSv11GeometrySDD::fgkLVChip1X = 6.00*fgkmm;
279 const Double_t AliITSv11GeometrySDD::fgkLVChip1Y = 6.00*fgkmm;
280 const Double_t AliITSv11GeometrySDD::fgkLVChip1Z = 1*fgkmm; // ???
281 const Double_t AliITSv11GeometrySDD::fgkLVChip1SiZ = 0.2*fgkmm; // ???
282 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosX = 18.*fgkmm;
283 const Double_t AliITSv11GeometrySDD::fgkLVChip1PosY = 27.6*fgkmm;
285 const Double_t AliITSv11GeometrySDD::fgkLVChip2X = 6.00*fgkmm;
286 const Double_t AliITSv11GeometrySDD::fgkLVChip2Y = 6.00*fgkmm;
287 const Double_t AliITSv11GeometrySDD::fgkLVChip2Z = 1*fgkmm; // ???
288 const Double_t AliITSv11GeometrySDD::fgkLVChip2SiZ = 0.2*fgkmm; //???
289 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosX = 18.0*fgkmm;
290 const Double_t AliITSv11GeometrySDD::fgkLVChip2PosY = 39.0*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fgkLVChip3X = 4.01*fgkmm;
293 const Double_t AliITSv11GeometrySDD::fgkLVChip3Y = 4.01*fgkmm;
294 const Double_t AliITSv11GeometrySDD::fgkLVChip3Z = 1*fgkmm; // ???
295 const Double_t AliITSv11GeometrySDD::fgkLVChip3SiZ = 0.2*fgkmm;
296 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosX = 20.7*fgkmm;
297 const Double_t AliITSv11GeometrySDD::fgkLVChip3PosY = 21.4*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fgkLVcoolX1 = 17.25*fgkmm;
300 const Double_t AliITSv11GeometrySDD::fgkLVcoolY1 = 8.7*fgkmm;
301 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ1 = 1.*fgkmm;
303 const Double_t AliITSv11GeometrySDD::fgkLVcoolX2 = 3.5*fgkmm;
304 const Double_t AliITSv11GeometrySDD::fgkLVcoolY2 = 8.7*fgkmm;
305 const Double_t AliITSv11GeometrySDD::fgkLVcoolZ2 = 2.3*fgkmm;
307 const Double_t AliITSv11GeometrySDD::fgkLVcoolX3 = 4.75*fgkmm;
308 const Double_t AliITSv11GeometrySDD::fgkLVcoolY3 = 3.1*fgkmm; //+0.1=glue
309 const Double_t AliITSv11GeometrySDD::fgkLVcoolPosY = 6.5*fgkmm;
312 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramX = 54.01*fgkmm;
313 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramY = 40.89*fgkmm;
314 const Double_t AliITSv11GeometrySDD::fgkHVCardCeramZ = 0.7*fgkmm; // ???
316 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1X = 6.8*fgkmm;
317 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Z = 1.*fgkmm; // ???
318 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Ymid = 4.1*fgkmm;
319 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1Yend = 0.95*fgkmm; // doesn't take into account the soldering
320 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosX = 13.1*fgkmm;
321 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa1PosY = 14.5*fgkmm;
323 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2X = 6.8*fgkmm;
324 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Z = 1.*fgkmm; // ???
325 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Ymid = 2.9*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2Yend = 0.95*fgkmm;
327 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosX = -12.6*fgkmm;
328 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa2PosY = 16.54*fgkmm;
330 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xmid = 3.0*fgkmm;
331 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Xend = 0.91*fgkmm;
332 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Z = 2.*fgkmm; // ???
333 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3Y = 3.43*fgkmm;
335 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX1 = 14.6*fgkmm;
336 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX2 = 7.2*fgkmm;
337 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX3 = 2.52*fgkmm;
338 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX4 = -4.96*fgkmm;
339 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosX5 = -13.82*fgkmm;
340 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY1 = 6.27*fgkmm;
341 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY2 = 0.7*fgkmm;
342 const Double_t AliITSv11GeometrySDD::fgkHVCardCapa3PosY3 = 9.1*fgkmm;
344 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1X = 14.*fgkmm;
345 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Y = 9.5*fgkmm;
346 const Double_t AliITSv11GeometrySDD::fgkHVCardCool1Z = 2.*fgkmm;
347 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2X = 14.25*fgkmm;
348 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Y = 3.5*fgkmm;
349 const Double_t AliITSv11GeometrySDD::fgkHVCardCool2Z = 4.5*fgkmm;
350 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3X = 4.5*fgkmm;
351 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Y = 3.5*fgkmm;
352 const Double_t AliITSv11GeometrySDD::fgkHVCardCool3Z = 7.2*fgkmm;
353 const Double_t AliITSv11GeometrySDD::fgkHVCardCoolDY = 6.*fgkmm;
355 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX1 = 19.5*fgkmm;
356 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY1 = 2*fgkmm;
357 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX2 = 35.*fgkmm;
358 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY2 = 3.9*fgkmm;
359 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ = 17.*fgkmm;
360 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppAngle = 45;
361 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppX3 = 4.5*fgkmm;
362 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppY3 = 3.*fgkmm;
363 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppZ3 = 12.*fgkmm;
364 const Double_t AliITSv11GeometrySDD::fgkCarlosSuppTopLen = 8.65*fgkmm;
366 // screws fixing boards to the end-ladder on the U tube
367 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadR = 1.85*fgkmm;
368 const Double_t AliITSv11GeometrySDD::fgkLittleScrewHeadH = 1.5*fgkmm;
369 const Double_t AliITSv11GeometrySDD::fgkLittleScrewR = 0.7*fgkmm;
370 const Double_t AliITSv11GeometrySDD::fgkShiftLittleScrewLV = 3*fgkmm; // ???
371 const Double_t AliITSv11GeometrySDD::fgkLittleLVScrewHeadR = 1.2*fgkmm; // ???
374 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX1 = (25.50+28.50)*fgkmm; // length (first part of Carlos card)
375 const Double_t AliITSv11GeometrySDD::fgkCarlosCardY1 = 1.6*fgkmm; // thickness
376 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ1 = 40.8*fgkmm; // width
377 const Double_t AliITSv11GeometrySDD::fgkCarlosCardCuY = 0.1*fgkmm; // thickness of Cu layer (strips)
378 const Double_t AliITSv11GeometrySDD::fgkCarlosCardX2 = 25.50*fgkmm; // length (2nd part of Carlos card)
379 const Double_t AliITSv11GeometrySDD::fgkCarlosCardZ2 = 8.20*fgkmm; // width
381 const Double_t AliITSv11GeometrySDD::fgkCarlosCardChipSiThick = 0.1*fgkmm; // ??? idem for all chips ???
382 const Double_t AliITSv11GeometrySDD::fgkCarlosCardShift = 9*fgkmm; // ??? shift in z w.r.t. heat bridge
384 // size and position of various chips on carlos end-ladder board
385 const Double_t AliITSv11GeometrySDD::fgkCarlosU1X = 13*fgkmm;
386 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Y = 1.68*fgkmm;
387 const Double_t AliITSv11GeometrySDD::fgkCarlosU1Z = 13*fgkmm;
388 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posX = 18.4*fgkmm;
389 const Double_t AliITSv11GeometrySDD::fgkCarlosU1posZ = -7.2*fgkmm;
391 const Double_t AliITSv11GeometrySDD::fgkCarlosU2X = 13.75*fgkmm;
392 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Y = 1.60*fgkmm;
393 const Double_t AliITSv11GeometrySDD::fgkCarlosU2Z = 13.85*fgkmm;
394 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posX = -0.375*fgkmm;
395 const Double_t AliITSv11GeometrySDD::fgkCarlosU2posZ = -9.725*fgkmm;
397 const Double_t AliITSv11GeometrySDD::fgkCarlosU3X = 5*fgkmm;
398 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Y = 1.*fgkmm;
399 const Double_t AliITSv11GeometrySDD::fgkCarlosU3Z = 5*fgkmm;
400 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posX = 6.4*fgkmm;
401 const Double_t AliITSv11GeometrySDD::fgkCarlosU3posZ = 9.9*fgkmm;
404 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posX = -12*fgkmm;
405 const Double_t AliITSv11GeometrySDD::fgkCarlosU4posZ = 3.6*fgkmm;
407 const Double_t AliITSv11GeometrySDD::fgkCarlosU17X = 16*fgkmm;
408 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Y = 3.5*fgkmm;
409 const Double_t AliITSv11GeometrySDD::fgkCarlosU17Z = 10.9*fgkmm;
410 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posX = -17.84*fgkmm;
411 const Double_t AliITSv11GeometrySDD::fgkCarlosU17posZ = -10.95*fgkmm;
413 const Double_t AliITSv11GeometrySDD::fgkCarlosU35X = 4*fgkmm;
414 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Y = 1.*fgkmm;
415 const Double_t AliITSv11GeometrySDD::fgkCarlosU35Z = 4*fgkmm;
416 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posX = -21.6*fgkmm;
417 const Double_t AliITSv11GeometrySDD::fgkCarlosU35posZ = 2.3*fgkmm;
419 const Double_t AliITSv11GeometrySDD::fgkCarlosU36X = 6*fgkmm;
420 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Y = 1.*fgkmm;
421 const Double_t AliITSv11GeometrySDD::fgkCarlosU36Z = 6*fgkmm;
422 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posX = -21.6*fgkmm;
423 const Double_t AliITSv11GeometrySDD::fgkCarlosU36posZ = 9.6*fgkmm;
425 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1X = 8*fgkmm;
426 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Y = 1.7*fgkmm; // look thicker than design number (0.7) ! ???
427 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1Z = 3.7*fgkmm;
428 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posX = -12*fgkmm;
429 const Double_t AliITSv11GeometrySDD::fgkCarlosQZ1posZ = 10.6*fgkmm;
431 // distance from the heat bridge center to the card center :
432 const Double_t AliITSv11GeometrySDD::fgkCarlosCard2HeatBridge = fgkCarlosSuppY2/2+fgkCarlosCardY1/2+fgkCarlosU1Y+0.1*fgkmm;
434 // some pieces at the end of the carbon fiber ladder
435 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay3Len = 467.*fgkmm; // ???
436 const Double_t AliITSv11GeometrySDD::fgkCoolPipeLay4Len = 616.*fgkmm; // ???
437 const Double_t AliITSv11GeometrySDD::fgkHVguideX1 = 42.5*fgkmm;
438 const Double_t AliITSv11GeometrySDD::fgkHVguideY1 = 7.*fgkmm;
439 const Double_t AliITSv11GeometrySDD::fgkHVguideZ1 = 10.*fgkmm;
440 const Double_t AliITSv11GeometrySDD::fgkHVguideZ2 = 6.*fgkmm;
441 const Double_t AliITSv11GeometrySDD::fgkHVguideDX = -8.5*fgkmm;
442 const Double_t AliITSv11GeometrySDD::fgkHVguideSuppFullZ = 37.5*fgkmm;
444 // Cooling connector between phynox and plastic cooling water tubes
445 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeRmin = 1 *fgkmm;
446 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR1 = 2.5*fgkmm; // ???
447 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL1 = 3.*fgkmm; // ???
448 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR2 = 3.5*fgkmm; // ???
449 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL2 = 2.*fgkmm; // ???
450 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeR3 = 3.*fgkmm; // ???
451 const Double_t AliITSv11GeometrySDD::fgkConnectorCoolTubeL3 = 5 *fgkmm; // ???
454 ClassImp(AliITSv11GeometrySDD)
456 //________________________________________________________________________
457 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
460 fCoolPipeSupportL(0),
461 fCoolPipeSupportR(0),
464 fBaseThermalBridge(0),
480 fAddCoolingSyst(kTRUE),
482 fAddOnlyLadder3min(-1),
483 fAddOnlyLadder3max(-1),
484 fAddOnlyLadder4min(-1),
485 fAddOnlyLadder4max(-1),
486 fColorCarbonFiber(4),
496 fLay3LadderUnderSegDH(0),
497 fLay4LadderUnderSegDH(0),
498 fLay3LaddShortRadius(0),
499 fLay3LaddLongRadius(0),
500 fLay4LaddShortRadius(0),
501 fLay4LaddLongRadius(0)
504 // Standard constructor
510 //________________________________________________________________________
511 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
512 AliITSv11Geometry(debug),
514 fCoolPipeSupportL(0),
515 fCoolPipeSupportR(0),
518 fBaseThermalBridge(0),
534 fAddCoolingSyst(kTRUE),
536 fAddOnlyLadder3min(-1),
537 fAddOnlyLadder3max(-1),
538 fAddOnlyLadder4min(-1),
539 fAddOnlyLadder4max(-1),
540 fColorCarbonFiber(4),
550 fLay3LadderUnderSegDH(0),
551 fLay4LadderUnderSegDH(0),
552 fLay3LaddShortRadius(0),
553 fLay3LaddLongRadius(0),
554 fLay4LaddShortRadius(0),
555 fLay4LaddLongRadius(0)
558 // Constructor setting debugging level
563 //________________________________________________________________________
564 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
565 AliITSv11Geometry(s.GetDebug()),
566 fPinSupport(s.fPinSupport),
567 fCoolPipeSupportL(s.fCoolPipeSupportL),
568 fCoolPipeSupportR(s.fCoolPipeSupportR),
569 fSDDsensor3(s.fSDDsensor3),
570 fSDDsensor4(s.fSDDsensor4),
571 fBaseThermalBridge(s.fBaseThermalBridge),
573 fCardLVR(s.fCardLVR),
574 fCardLVL(s.fCardLVL),
576 fCardCarlos(s.fCardCarlos),
577 fRaccordoL(s.fRaccordoL),
578 fDigitCableLay3A(s.fDigitCableLay3A),
579 fDigitCableLay3B(s.fDigitCableLay3B),
580 fDigitCableLay4A(s.fDigitCableLay4A),
581 fDigitCableLay4B(s.fDigitCableLay4B),
582 fMotherVol(s.fMotherVol),
583 fAddHybrids(s.fAddHybrids),
584 fAddSensors(s.fAddSensors),
585 fAddHVcables(s.fAddHVcables),
586 fAddCables(s.fAddCables),
587 fAddCoolingSyst(s.fAddCoolingSyst),
588 fCoolingOn(s.fCoolingOn),
589 fAddOnlyLadder3min(s.fAddOnlyLadder3min),
590 fAddOnlyLadder3max(s.fAddOnlyLadder3max),
591 fAddOnlyLadder4min(s.fAddOnlyLadder4min),
592 fAddOnlyLadder4max(s.fAddOnlyLadder4max),
593 fColorCarbonFiber(s.fColorCarbonFiber),
594 fColorRyton(s.fColorRyton),
595 fColorPhynox(s.fColorPhynox),
596 fColorSilicon(s.fColorSilicon),
597 fColorAl(s.fColorAl),
598 fColorPolyhamide(s.fColorPolyhamide),
599 fColorGlass(s.fColorGlass),
600 fColorSMD(s.fColorSMD),
601 fColorSMDweld(s.fColorSMDweld),
602 fColorStesalite(s.fColorStesalite),
603 fLay3LadderUnderSegDH(s.fLay3LadderUnderSegDH),
604 fLay4LadderUnderSegDH(s.fLay4LadderUnderSegDH),
605 fLay3LaddShortRadius(s.fLay3LaddShortRadius),
606 fLay3LaddLongRadius(s.fLay3LaddLongRadius),
607 fLay4LaddShortRadius(s.fLay4LaddShortRadius),
608 fLay4LaddLongRadius(s.fLay4LaddLongRadius)
611 // do only a "shallow copy" ...
615 //________________________________________________________________________
616 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
617 operator=(const AliITSv11GeometrySDD &s) {
618 // Assignment operator
619 if(&s == this) return *this;
620 fMotherVol = s.fMotherVol;
621 fAddHybrids = s.fAddHybrids;
622 fAddSensors = s.fAddSensors;
623 fAddHVcables = s.fAddHVcables;
624 fAddCables = s.fAddCables;
625 fAddCoolingSyst = s.fAddCoolingSyst;
626 fCoolingOn = s.fCoolingOn;
627 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
628 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
629 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
630 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
634 //________________________________________________________________________
635 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
636 // Look like a destructor
637 // Smell like a destructor
638 // And actually is the destructor
639 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
640 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
641 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
642 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
645 //________________________________________________________________________
646 void AliITSv11GeometrySDD::SetParameters() {
648 // Define display colors and the non constant geometry parameters
651 Double_t detLadderDist = 8*fgkmm;
653 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
654 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
656 // radius from the center to the CF ladder :
657 fLay3LaddShortRadius = (fgkLay3DetShortRadius
658 + fgkLadWaferSep+2*fgkWaferThickness
660 fLay3LaddLongRadius = (fgkLay3DetLongRadius
661 + fgkLadWaferSep+2*fgkWaferThickness
663 fLay4LaddShortRadius = (fgkLay4DetShortRadius
664 + fgkLadWaferSep+2*fgkWaferThickness
666 fLay4LaddLongRadius = (fgkLay4DetLongRadius
667 + fgkLadWaferSep+2*fgkWaferThickness
670 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
671 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
672 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
673 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
674 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
675 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
677 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
678 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
679 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
680 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
681 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
682 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
683 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
684 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
688 //________________________________________________________________________
689 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
691 // Called to get a medium, checks that it exists.
692 // If not, prints an error and returns 0
696 sprintf(ch, "ITS_%s",mediumName);
697 TGeoMedium* medium = gGeoManager->GetMedium(ch);
699 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
704 //________________________________________________________________________
705 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
706 // Get the actual number of ladder in layer 3
707 if ( (fAddOnlyLadder3min<0) ||
708 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
709 (fAddOnlyLadder3max<0) ||
710 (fAddOnlyLadder3max >= fgkLay3Nladd) )
712 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
716 //________________________________________________________________________
717 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
718 // Get the actual number of ladder in layer 4
719 if ( (fAddOnlyLadder4min<0) ||
720 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
721 (fAddOnlyLadder4max<0) ||
722 (fAddOnlyLadder4max >= fgkLay4Nladd) )
724 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
728 //________________________________________________________________________
729 void AliITSv11GeometrySDD::CreateBasicObjects() {
731 // Create basics objets which will be assembled together
732 // in Layer3 and Layer4 functions
736 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
737 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
738 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
739 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
741 fPinSupport = CreatePinSupport();
742 fCoolPipeSupportL = CreateCoolPipeSupportL();
743 fCoolPipeSupportR = CreateCoolPipeSupportR();
745 fBaseThermalBridge = CreateBaseThermalBridge();
746 fHybrid = CreateHybrid(0);
748 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); //ITSsddCarbonM55J
749 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$");//ITSsddKAPTON_POLYCH2
750 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
751 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
752 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
753 TGeoMedium *raccordMedium = GetMedium("inox/alum$"); // ??? material of raccordo ???
755 //********************************************************************
756 // pieces of the carbon fiber structure
757 //********************************************************************
758 Double_t dy = fgkLadderSegBoxDH/2;
759 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
760 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
761 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
762 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
763 Double_t dYTranslation = (fgkLadderHeight/2.
764 -0.5*fgkLadderWidth*TMath::Tan(beta)
765 -fgkLadderBeamRadius);
766 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
768 //--- the top V of the Carbon Fiber Ladder (segment)
769 TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
770 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
771 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
772 cfLaddTop1,carbonFiberLadderStruct);
773 TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
774 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
775 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
776 cfLaddTop2, carbonFiberLadderStruct);
777 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
778 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
779 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
782 TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
783 fgkLadderLb, fgkLadderHb, fgkLadderl);
784 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
785 cfLaddSide1,carbonFiberLadderStruct);
786 TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
787 fgkLadderLb, fgkLadderHb, fgkLadderl);
788 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
789 cfLaddSide2,carbonFiberLadderStruct);
790 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
791 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
792 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
793 alpha*TMath::RadToDeg());
794 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
795 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
796 -alpha*TMath::RadToDeg());
797 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
800 // Beams on the sides
801 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
802 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
803 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
804 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
805 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
806 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
807 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
809 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
810 carbonFiberLadderStruct);
811 sideBeam->SetLineColor(fColorCarbonFiber);
813 //Euler rotation : about Z, then new X, then new Z
814 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
815 -beamPhiPrime*TMath::RadToDeg(),-90);
816 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
817 beamPhiPrime*TMath::RadToDeg(), -90);
818 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
819 beamPhiPrime*TMath::RadToDeg(), -90);
820 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
821 -beamPhiPrime*TMath::RadToDeg(),-90);
823 TGeoCombiTrans *beamTransf[8];
824 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
825 TMath::Tan(halfTheta),
826 fgkLadderBeamRadius/2. - dy,
827 -3*fgkSegmentLength/8, beamRot1);
829 beamTransf[1] = new TGeoCombiTrans( 0.5*triangleHeight*
830 TMath::Tan(halfTheta),
831 fgkLadderBeamRadius/2. - dy,
832 -3*fgkSegmentLength/8, beamRot1);
833 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
835 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
836 TMath::Tan(halfTheta),
837 fgkLadderBeamRadius/2. - dy,
838 -fgkSegmentLength/8, beamRot2);
840 beamTransf[3] = new TGeoCombiTrans(0.5*triangleHeight*
841 TMath::Tan(halfTheta),
842 fgkLadderBeamRadius/2. - dy,
843 -fgkSegmentLength/8, beamRot2);
844 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
846 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
847 TMath::Tan(halfTheta),
848 fgkLadderBeamRadius/2. - dy,
849 -3*fgkSegmentLength/8, beamRot3);
851 beamTransf[5] = new TGeoCombiTrans(-0.5*triangleHeight*
852 TMath::Tan(halfTheta),
853 fgkLadderBeamRadius/2. - dy,
854 -3*fgkSegmentLength/8, beamRot3);
855 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
857 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
858 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
859 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
860 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
862 //--- Beams of the bottom
863 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
864 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
865 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
866 bottomBeam1, carbonFiberLadderStruct);
867 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
868 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
869 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
870 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
871 bottomBeam2, carbonFiberLadderStruct);
872 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
873 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
874 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
875 - fgkLadderLb/3, 0, 180);
876 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
877 bottomBeam3, carbonFiberLadderStruct);
878 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
879 //bottomBeam3Vol->SetLineColor(2);
880 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
881 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
883 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
884 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
885 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
886 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
887 -fgkSegmentLength/2, bottomBeamRot1);
888 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
889 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
890 - dy, fgkSegmentLength/2, bottomBeamRot2);
891 // be careful for beams #3: when "reading" from -z to +z and
892 // from the bottom of the ladder, it should draw a Lambda, and not a V
893 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
894 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
895 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
896 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
897 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
898 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
900 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
901 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
902 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
903 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
904 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
905 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
906 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
907 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
908 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
909 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
910 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
911 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
912 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
913 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
914 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
915 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
916 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
917 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
918 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
921 //********************************************************************
923 //********************************************************************
925 for (Int_t i=0; i<fgkLay3Ndet; i++) {
926 sprintf(cableName, "digitCableLay3A_%i",i);
927 fDigitCableLay3A[i].SetName(cableName);
928 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
929 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
930 fDigitCableLay3A[i].SetNLayers(2);
931 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
933 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
934 sprintf(cableName, "digitCableLay3B_%i",i);
935 fDigitCableLay3B[i].SetName(cableName);
936 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
937 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
938 fDigitCableLay3B[i].SetNLayers(2);
939 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
941 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
943 for (Int_t i=0; i<fgkLay4Ndet; i++) {
944 sprintf(cableName, "digitCableLay4A_%i",i);
945 fDigitCableLay4A[i].SetName(cableName);
946 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
947 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
948 fDigitCableLay4A[i].SetNLayers(2);
949 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
951 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
952 sprintf(cableName, "digitCableLay4B_%i",i);
953 fDigitCableLay4B[i].SetName(cableName);
954 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
955 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
956 fDigitCableLay4B[i].SetNLayers(2);
957 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
959 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
961 // Well, those digit cables could also include the analog cables
962 // which have the same width and the same path, at least in the ladder.
963 // It will gain some computing ressources (less volumes) and some
964 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
965 // The only thing to do is to change the names and put the correct total
968 // some transformations and volumes used in several places
969 fCommonTr[0] = new TGeoRotation("CarlosSuppRotN",
970 0, -fgkCarlosSuppAngle, 0);
972 TGeoTube *littleScrewHead = new TGeoTube("littleScrewHead", 0, fgkLittleScrewHeadR,
973 fgkLittleScrewHeadH/2);
974 fCommonVol[0] = new TGeoVolume("vLittleScrewHead",
975 littleScrewHead, stainless);
976 fCommonVol[0]->SetLineColor(kGray);
978 fLadderFoot = CreateLadderFoot();
980 fCardHV = CreateHVCard(0);
981 fCardCarlos = CreateCarlosCard(0);
984 // link beteen phynox and plastic cooling tubes
987 fRaccordoL = new TGeoVolumeAssembly("RaccordoL");
988 Double_t fullRacLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
989 TGeoTube *waterRac = new TGeoTube("waterRac", 0, fgkConnectorCoolTubeRmin, fullRacLen/2);
990 TGeoVolume * vwaterRac = new TGeoVolume("vwaterRac", waterRac, coolerMediumSDD);
991 vwaterRac->SetLineColor(kBlue);
993 TGeoTube *tube1Rac = new TGeoTube("tube1Rac", fgkConnectorCoolTubeRmin,
994 fgkConnectorCoolTubeR1, fgkConnectorCoolTubeL1/2);
995 TGeoTube *tube2Rac = new TGeoTube("tube2Rac", fgkConnectorCoolTubeRmin,
996 fgkConnectorCoolTubeR2, fgkConnectorCoolTubeL2/2);
997 TGeoTube *tube3Rac = new TGeoTube("tube3Rac", fgkConnectorCoolTubeRmin,
998 fgkConnectorCoolTubeR3, fgkConnectorCoolTubeL3/2);
999 TGeoVolume * vtube1Rac = new TGeoVolume("vtube1Rac", tube1Rac, raccordMedium);
1000 TGeoVolume * vtube2Rac = new TGeoVolume("vtube2Rac", tube2Rac, raccordMedium);
1001 TGeoVolume * vtube3Rac = new TGeoVolume("vtube3Rac", tube3Rac, raccordMedium);
1002 vtube1Rac->SetLineColor(kGray);
1003 vtube2Rac->SetLineColor(kGray);
1004 vtube3Rac->SetLineColor(kGray);
1006 TGeoTranslation *trTube1Rac = new TGeoTranslation("trTube1Rac",0,0,
1007 -fullRacLen/2+fgkConnectorCoolTubeL1/2);
1008 TGeoTranslation *trTube2Rac = new TGeoTranslation("trTube2Rac",0,0,
1009 (-fullRacLen/2+fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2/2));
1010 TGeoTranslation *trTube3Rac = new TGeoTranslation("trTube3Rac",0,0,
1011 (-fullRacLen/2+fgkConnectorCoolTubeL1+
1012 fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3/2));
1013 fRaccordoL->AddNode(vwaterRac, 1,0);
1014 fRaccordoL->AddNode(vtube1Rac, 1,trTube1Rac);
1015 fRaccordoL->AddNode(vtube2Rac, 1,trTube2Rac);
1016 fRaccordoL->AddNode(vtube3Rac, 1,trTube3Rac);
1020 //________________________________________________________________________
1021 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
1023 // a debugging function for checking some possible overlaps
1025 if (fSDDsensor3) fSDDsensor3->CheckOverlaps(precision);
1026 if (fSDDsensor4) fSDDsensor4->CheckOverlaps(precision);
1027 if (fHybrid) fHybrid->CheckOverlaps(precision);
1031 //________________________________________________________________________
1032 TGeoCombiTrans *AliITSv11GeometrySDD::
1033 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi,
1036 // return the TGeoCombiTrans which make a translation in y and z
1037 // and a rotation in phi in the global coord system
1038 // If planeSym = true, the rotation places the object symetrically
1039 // (with respect to the transverse plane) to its position in the
1040 // case planeSym = false
1043 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
1044 TGeoRotation r1("",0.,0.,dphi);
1045 TGeoRotation r2("",90, 180, -90-dphi);
1047 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
1048 combiTrans1->SetTranslation(t1);
1049 if (planeSym) combiTrans1->SetRotation(r1);
1050 else combiTrans1->SetRotation(r2);
1055 //________________________________________________________________________
1056 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
1060 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
1061 const Double_t *vect = ct->GetTranslation();
1062 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
1063 ct->SetTranslation(newVect);
1067 //________________________________________________________________________
1068 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
1069 // for code developpment and debugging purposes
1071 if (! fSDDsensor3) CreateBasicObjects();
1073 // moth->AddNode(fPinSupport, 1, 0);
1074 // moth->AddNode(fCoolPipeSupportL, 1, 0);
1075 // moth->AddNode(fSDDsensor3, 1, 0);
1076 // moth->AddNode(fSDDsensor4, 1, 0);
1077 // moth->AddNode(fBaseThermalBridge, 1, 0);
1078 // moth->AddNode(fHybrid,100,0);
1079 // moth->AddNode(fLadderFoot,1,0);
1080 //moth->AddNode(fCardLVL,1,0);
1081 //moth->AddNode(fCardLVR,1,0);
1083 // TGeoVolume* seg = CreateLadderSegment( 3, 0);
1084 // moth->AddNode(seg, 1, 0);
1086 // TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1087 // moth->AddNode(lay3Ladder, 1, 0);
1089 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1090 // moth->AddNode(lay3Detectors, 1, 0);
1092 // TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1093 // moth->AddNode(lay3Detectors, 1, 0);
1096 TGeoVolumeAssembly *endLadder = CreateEndLadder( 4 );
1097 moth->AddNode(endLadder, 1, 0);
1099 // TGeoVolumeAssembly *highVCard = CreateHVCard( 4 );
1100 // moth->AddNode(highVCard, 1, 0);
1102 // TGeoVolumeAssembly *supportRing = CreateSupportRing( 4 );
1103 // moth->AddNode(supportRing, 1, 0);
1105 // TGeoVolumeAssembly *endLadderCards = CreateEndLadderCards( 4 );
1106 // moth->AddNode(endLadderCards, 1, 0);
1108 // TGeoVolumeAssembly *carlosCard = CreateCarlosCard( 4 );
1109 // moth->AddNode(carlosCard, 1, 0);
1113 //________________________________________________________________________
1114 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
1116 // Insert the layer 3 in the mother volume. This is a virtual volume
1117 // containing ladders of layer 3 and the supporting rings
1121 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
1125 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1128 if (! fSDDsensor3) CreateBasicObjects();
1130 //====================================
1131 // First we create the central barrel
1132 //====================================
1134 TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
1135 TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
1136 //TGeoVolume *lay3Detectors = CreateDetectors(3);
1137 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
1138 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
1139 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
1140 virtualLayer3Shape, airSDD);
1142 Double_t dPhi = 360./fgkLay3Nladd;
1143 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
1144 // Placing virtual ladder and detectors volumes following
1145 // ladder ordering convention
1148 Int_t iLaddMax = fgkLay3Nladd;
1149 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
1150 iLaddMin = fAddOnlyLadder3min;
1151 iLaddMax = fAddOnlyLadder3max+1;
1154 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1156 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1157 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
1158 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
1160 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
1161 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
1162 TGeoCombiTrans *ctLadd;
1163 //=============================================================
1165 // Special modification for ladder 2 of layer 3:
1166 // It has been inverted (pi rotation around y axis)
1168 //=============================================================
1170 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1171 0, ladderPhi, kTRUE);
1173 ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
1174 0, ladderPhi, kFALSE);
1175 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
1176 ///////////////////////////////////////////////////
1177 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
1178 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1179 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1180 minRadiusDetBox += detectorsThick/2;
1181 TGeoCombiTrans *ctDet;
1183 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1184 0, ladderPhi, kTRUE);
1186 ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1187 0, ladderPhi, kFALSE);
1189 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
1190 ///////////////////////////////////////////////////
1193 //====================================
1194 // Then the forward rapidity pieces
1195 // (cooling, Carlos, LV, HV ...)
1196 //====================================
1198 Double_t fgkForwardLay3Length = 200*fgkmm; // this has to be tune !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1199 Double_t fgkForwardLay3Rmin = fgkLay3Rmin-10*fgkmm;
1200 Double_t fgkForwardLay3Rmax = fgkLay3Rmax;
1202 TGeoVolumeAssembly* lay3EndLadder = CreateEndLadderCards(3);
1203 TGeoTube *virtualForward3Shape = new TGeoTube("virtualForward3Shape",
1204 fgkForwardLay3Rmin, fgkForwardLay3Rmax,
1205 fgkForwardLay3Length/2.);
1206 TGeoVolume *virtualForward3Pos = new TGeoVolume("ITSsddForward3Pos",
1207 virtualForward3Shape, airSDD);
1208 TGeoVolume *virtualForward3Neg = new TGeoVolume("ITSsddForward3Neg",
1209 virtualForward3Shape, airSDD);
1210 TGeoTranslation *virtualForward3TrPos = new TGeoTranslation("virtualForward3TrPos",0,0,
1211 fgkLay3Length/2+fgkForwardLay3Length/2);
1212 TGeoTranslation *virtualForward3TrNeg = new TGeoTranslation("virtualForward3TrNeg",0,0,
1213 -fgkLay3Length/2-fgkForwardLay3Length/2);
1215 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1217 Double_t ladderPhi = -3*dPhi+iLadd*dPhi;
1218 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
1219 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
1220 minRadiusDetBox += detectorsThick/2;
1222 sprintf(rotName, "ITSsddLay3EndLadd%i",iLadd);
1224 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1225 -fgkForwardLay3Length/2, ladderPhi, kTRUE);
1226 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1227 fgkForwardLay3Length/2, ladderPhi, kFALSE);
1229 virtualForward3Pos->AddNode(lay3EndLadder, iLadd*2, ctEndLaddPos);
1230 virtualForward3Neg->AddNode(lay3EndLadder, iLadd*2, ctEndLaddNeg);
1234 virtualLayer3->CheckOverlaps(0.01);
1235 virtualForward3Pos->CheckOverlaps(0.01);
1236 virtualForward3Neg->CheckOverlaps(0.01);
1239 virtualLayer3->SetVisibility(kFALSE);
1240 virtualForward3Pos->SetVisibility(kFALSE);
1241 virtualForward3Neg->SetVisibility(kFALSE);
1243 moth->AddNode(virtualLayer3, 1, 0);
1244 moth->AddNode(virtualForward3Pos, 1, virtualForward3TrPos);
1245 moth->AddNode(virtualForward3Neg, 1, virtualForward3TrNeg);
1249 //________________________________________________________________________
1250 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
1252 // Insert the layer 4 in the mother volume. This is a virtual volume
1253 // containing ladders of layer 4 and the supporting rings
1257 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
1263 if (! fSDDsensor3) CreateBasicObjects();
1265 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1266 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
1267 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1268 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1269 virtualLayer4Shape, airSDD);
1271 //====================================
1272 // First we create the central barrel
1273 //====================================
1275 TGeoVolumeAssembly *lay4Ladder = CreateLadder(4);
1276 //TGeoVolume *lay4Detectors = CreateDetectors(4);
1277 TGeoVolumeAssembly *lay4Detectors = CreateDetectorsAssembly(4);
1279 Double_t dPhi = 360./fgkLay4Nladd;
1280 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
1282 // placing virtual ladder and detectors volumes following ladder
1283 // ordering convention
1286 Int_t iLaddMax = fgkLay4Nladd;
1287 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
1288 iLaddMin = fAddOnlyLadder4min;
1289 iLaddMax = fAddOnlyLadder4max+1;
1291 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1293 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1294 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1295 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
1297 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
1298 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1299 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1300 0, ladderPhi, kTRUE);
1301 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1302 ///////////////////////////////////////////////////
1303 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1304 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1306 minRadiusDetBox = fgkLay4DetLongRadius;
1307 minRadiusDetBox += detBoxThickness/2;
1308 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1309 0, ladderPhi, kTRUE);
1310 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1311 ///////////////////////////////////////////////////
1314 //====================================
1315 // Then the pieces at forward rapidity
1316 // (cooling, Carlos, LV, HV ...)
1317 //====================================
1319 Double_t fgkForwardLay4Length = 200*fgkmm; // this has to be tuned !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1320 Double_t fgkForwardLay4Rmin = fgkLay4Rmin-10*fgkmm;
1321 Double_t fgkForwardLay4Rmax = fgkLay4Rmax;
1323 TGeoVolumeAssembly* lay4EndLadder = CreateEndLadderCards(4);
1324 TGeoTube *virtualForward4Shape = new TGeoTube("virtualForward3Shape",
1325 fgkForwardLay4Rmin, fgkForwardLay4Rmax,
1326 fgkForwardLay4Length/2.);
1327 TGeoVolume *virtualForward4Pos = new TGeoVolume("ITSsddForward4Pos",
1328 virtualForward4Shape, airSDD);
1329 TGeoVolume *virtualForward4Neg = new TGeoVolume("ITSsddForward4Neg",
1330 virtualForward4Shape, airSDD);
1331 TGeoTranslation *virtualForward4TrPos = new TGeoTranslation("virtualForward4TrPos",0,0,
1332 fgkLay4Length/2+fgkForwardLay4Length/2);
1333 TGeoTranslation *virtualForward4TrNeg = new TGeoTranslation("virtualForward4TrNeg",0,0,
1334 -fgkLay4Length/2-fgkForwardLay4Length/2);
1336 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1338 Double_t ladderPhi = -5*dPhi + iLadd*dPhi;
1339 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
1341 minRadiusDetBox = fgkLay4DetLongRadius;
1342 minRadiusDetBox += detBoxThickness/2;
1344 sprintf(rotName, "ITSsddLay4EndLadd%i",iLadd);
1346 TGeoCombiTrans *ctEndLaddPos = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1347 -fgkForwardLay4Length/2, ladderPhi, kTRUE);
1348 TGeoCombiTrans *ctEndLaddNeg = CreateCombiTrans(rotName, minRadiusDetBox-0.1,
1349 fgkForwardLay4Length/2, ladderPhi, kFALSE);
1350 virtualForward4Pos->AddNode(lay4EndLadder, iLadd*2, ctEndLaddPos);
1351 virtualForward4Neg->AddNode(lay4EndLadder, iLadd*2+1, ctEndLaddNeg);
1354 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
1356 virtualLayer4->SetVisibility(kFALSE);
1357 virtualForward4Pos->SetVisibility(kFALSE);
1358 virtualForward4Neg->SetVisibility(kFALSE);
1360 moth->AddNode(virtualLayer4,1,0);
1361 moth->AddNode(virtualForward4Pos, 1, virtualForward4TrPos);
1362 moth->AddNode(virtualForward4Neg, 1, virtualForward4TrNeg);
1366 //________________________________________________________________________
1367 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
1369 // return an assembly volume containing the CF ladder
1372 Int_t nDetectors = fgkLay3Ndet;
1373 Double_t ladderLength = fgkLay3LadderLength;
1374 Double_t underSegDH = fLay3LadderUnderSegDH;
1375 Double_t *sensorZPos = fLay3sensorZPos;
1376 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1377 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1381 nDetectors = fgkLay4Ndet;
1382 ladderLength = fgkLay4LadderLength;
1383 digitCableA = fDigitCableLay4A;
1384 digitCableB = fDigitCableLay4B;
1385 underSegDH = fLay4LadderUnderSegDH;
1386 sensorZPos = fLay4sensorZPos;
1389 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
1391 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
1392 TGeoVolumeAssembly *virtualLadder = new TGeoVolumeAssembly("ITSsddLadder");
1394 // placing virtual ladder segment following detector ordering convention
1395 //=======================================================================
1398 // adding segment this way to create cable points in the correct order ...
1399 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1401 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1402 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1403 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1404 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1405 + fgkSegmentLength/2;
1406 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1407 underSegDH/2,segmentPos);
1409 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1411 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1413 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
1414 //TGeoVolumeAssembly *laddSegment = CreateLadderSegment(iLay, iSegment);
1415 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
1416 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
1417 + fgkSegmentLength/2;
1418 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
1419 underSegDH/2,segmentPos);
1421 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1424 // putting virtual volume corresponding to the end of ladder
1425 //=======================================================================
1426 TGeoVolumeAssembly *endLadder = CreateEndLadder( iLay );
1427 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
1428 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
1429 fgkSegmentLength*(nDetectors/2)+endLength/2.);
1430 // Euler rotation : about Z, then new X, then new Z
1431 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1432 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
1433 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
1434 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1435 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1437 // creating and inserting cable segments
1438 // (check points are placed while creating segments)
1439 //=======================================================================
1441 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
1443 digitCableA[iSegment].SetInitialNode(virtualLadder);
1444 digitCableB[iSegment].SetInitialNode(virtualLadder);
1446 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
1447 Double_t rotation = 0;
1449 rotation = 90-fgkHybridAngle;
1450 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1452 digitCableA[iSegment].CreateAndInsertBoxCableSegment(iPt);
1456 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
1457 Double_t rotation = 0;
1459 rotation = fgkHybridAngle-90;
1460 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
1462 digitCableB[iSegment].CreateAndInsertBoxCableSegment(iPt);
1467 //=======================================================================
1469 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1470 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1472 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
1473 char cableHVname[30];
1474 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
1475 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
1476 cableHV[iSegment].SetName(cableHVname);
1477 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
1478 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
1479 cableHV[iSegment].SetNLayers(2);
1480 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
1482 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
1483 cableHV[iSegment].SetInitialNode(virtualLadder);
1485 Double_t x1[3], x2[3], x3[3],
1486 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
1488 x1[0] = -fgkTransitHVtailXpos;
1489 x2[0] = -fgkTransitHVtailXpos;
1490 x3[0] = -fgkTransitHVtailXpos;
1491 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
1492 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1493 *fgkLongHVcableSeparation;
1494 // adjust where HV long cable starts in Y
1495 // useful if you want to let some space for alignment
1496 x1[1] = - ladderBoxDH/2 + 2*fgkmm;
1497 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1498 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1500 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
1501 x2[2] = x1[2]+5*fgkmm;
1502 x3[2] = ladderLength/2-endLength;
1503 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1504 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1505 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1507 //cableHV[iSegment].CreateAndInsertCableSegment(1,0);
1508 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45+180);
1509 //cableHV[iSegment].CreateAndInsertCableSegment(2,0);
1510 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1514 x1[0] = fgkTransitHVtailXpos;
1515 x2[0] = fgkTransitHVtailXpos;
1516 x3[0] = fgkTransitHVtailXpos;
1518 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
1519 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
1520 *fgkLongHVcableSeparation;
1521 x1[1] = - ladderBoxDH/2 + 2*fgkmm; // adjust where HV long cable starts in Y
1522 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
1523 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
1525 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
1526 x2[2] = x1[2]-5*fgkmm;
1527 x3[2] = -ladderLength/2+endLength;
1528 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
1529 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vZ ); // vYZ
1530 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
1532 cableHV[iSegment].CreateAndInsertCableCylSegment(1, -45);
1533 cableHV[iSegment].CreateAndInsertBoxCableSegment(2,0);
1537 //**********************************
1538 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
1539 return virtualLadder;
1543 //________________________________________________________________________
1544 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
1545 Double_t xSign, Double_t L, Double_t H, Double_t l) {
1546 // Create one half of the V shape corner of CF ladder
1548 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
1549 cfLaddSide->SetVertex( 0, 0, 0);
1550 cfLaddSide->SetVertex( 1, 0, -H);
1551 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1552 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1553 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1554 cfLaddSide->SetVertex( 4, 0, 0);
1555 cfLaddSide->SetVertex( 5, 0, -H);
1556 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1557 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1558 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1563 //________________________________________________________________________
1564 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1566 // return a box containing the front-end hybrid
1569 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1571 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1572 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1573 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1574 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1575 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1576 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1577 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1578 // + upFLTotalThick + ccUpLayerTotThick);
1579 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1581 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1583 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1585 //**************************************************** media :
1586 TGeoMedium *airSDD = GetMedium("SDD AIR$");
1587 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddCarbonM55J
1588 TGeoMedium *alSDD = GetMedium("AL$"); //ITSal
1589 TGeoMedium *alSDD80p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1590 TGeoMedium *alSDD50p100 = GetMedium("AL$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1591 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); //ITSsddKAPTON_POLYCH2
1592 TGeoMedium *niSDD = GetMedium("COPPER$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1593 TGeoMedium *glueAG = GetMedium("SDDKAPTON (POLYCH2)$"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1594 TGeoMedium *siliconSDD = GetMedium("SDD SI CHIP$"); //ITSsddSiChip
1595 TGeoMedium *medSMD = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1596 TGeoMedium *medSMDweld = GetMedium("SDD X7R capacitors$"); // SDDX7Rcapacitors TO CHECK !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1598 //**************************************************** main volume :
1599 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1600 (fgkHybridLength)/2);
1601 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1604 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1605 fgkHybridThBridgeThick/2,
1608 //**************************************************** Thermal bridge :
1609 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1611 carbonFiberLadderStruct);
1612 vThermalBridge->SetLineColor(fColorCarbonFiber);
1613 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1614 +fgkHybridThBridgeThick/2, 0);
1615 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
1617 //**************************************************** Screen layer :
1618 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
1619 fgkHybAlThick/2, fgkHybridLength/2);
1620 //here the upedex and glue layers are both assumed to be polyimide
1621 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
1623 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
1625 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
1626 (screenTotalThick+lowFLTotalThick)/2);
1628 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
1629 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
1631 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
1632 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
1633 +fgkHybAlThick/2, 0);
1635 TGeoTranslation hybHolePos1Tr(roundHoleX,
1636 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
1637 -fgkHybridLength/2+fgkHybRndHoleZ);
1638 TGeoTranslation hybHolePos2Tr(roundHoleX,
1639 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
1640 fgkHybridLength/2-fgkHybRndHoleZ);
1642 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
1643 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
1644 hybHolePos1->SetName("hybHolePos1");
1645 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
1646 hybHolePos2->SetName("hybHolePos2");
1648 upGlueScreenTr->RegisterYourself();
1649 alScreenTr->RegisterYourself();
1650 hybHolePos1->RegisterYourself();
1651 hybHolePos2->RegisterYourself();
1654 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
1655 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
1656 "+sRoundHole:hybHolePos2)");
1657 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
1658 vScreenAl->SetLineColor(fColorAl);
1659 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
1660 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
1661 "+sRoundHole:hybHolePos2)");
1662 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
1663 sScreenUpGlue,polyhamideSDD);
1664 vScreenUpGlue->SetLineColor(fColorPolyhamide);
1666 hybrid->AddNode(vScreenUpGlue, 1, 0);
1667 hybrid->AddNode(vScreenAl, 1, 0);
1669 //**************************************************** FL low layer :
1670 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
1671 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
1673 //here the upedex and glue layers are both assumed to be polyimide
1674 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
1675 (fgkHybGlueLowThick+fgkHybUpThick)/2,
1677 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
1678 fgkHybAlThick/2, sideWidth1/2);
1680 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
1681 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
1682 -(fgkHybridLength-sideWidth1)/2);
1683 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
1684 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
1685 -(fgkHybridLength-sideWidth1)/2);
1686 upGlueBarTr1->RegisterYourself();
1687 alBarTr1->RegisterYourself();
1689 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
1690 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
1691 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
1692 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
1693 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
1694 sLowUpGlueBar1, polyhamideSDD);
1695 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
1697 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
1698 vLowAlBar1->SetLineColor(fColorAl);
1699 hybrid->AddNode(vLowUpGlueBar1,1,0);
1700 hybrid->AddNode(vLowAlBar1,1,0);
1703 //here the upedex and glue layers are both assumed to be polyimide
1704 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
1705 (fgkHybGlueLowThick+fgkHybUpThick)/2,
1707 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
1708 fgkHybAlThick/2, sideWidth2/2);
1710 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
1711 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
1712 (fgkHybridLength-sideWidth2)/2);
1713 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
1714 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
1715 (fgkHybridLength-sideWidth2)/2);
1716 upGlueBarTr2->RegisterYourself();
1717 alBarTr2->RegisterYourself();
1719 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
1720 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
1721 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
1722 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
1723 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
1725 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
1727 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
1728 vLowAlBar2->SetLineColor(fColorAl);
1729 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
1730 hybrid->AddNode(vLowAlBar2, 1, 0);
1732 if(GetDebug(3)) { // Remove compiler warning.
1733 sAlScreenLayer->InspectShape();
1734 sUpGlueScreenLayer->InspectShape();
1735 sRoundHole->InspectShape();
1736 sUpGlueBar1->InspectShape();
1737 sUpGlueBar2->InspectShape();
1738 sAlBar1->InspectShape();
1739 sAlBar2->InspectShape();
1742 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
1743 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
1744 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
1746 lowFLpiece.SetNLayers(2);
1747 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
1749 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
1750 // alSDD at 80% : mostly to take into account strips of piece 3
1752 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
1753 lowLayerYmin + lowFLTotalThick/2,
1754 -fgkHybridLength/2 + sideWidth1 };
1755 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
1756 Double_t vZ[3] = {0,0,1};
1757 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
1758 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
1759 lowFLpiece.SetInitialNode(hybrid);
1760 lowFLpiece.CreateAndInsertBoxCableSegment(1);
1761 lowFLpiece.ResetPoints();
1763 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
1764 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
1766 lowFLpiece.SetWidth(piece2width);
1767 lowFLpiece.SetName("lowFLpiece2");
1768 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
1770 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
1771 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
1772 lowFLpiece.CreateAndInsertBoxCableSegment(1);
1773 lowFLpiece.ResetPoints();
1775 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
1776 - fgkHybFLlowHoleAmbDX/2;
1778 lowFLpiece.SetWidth(piece3width);
1779 lowFLpiece.SetName("lowFLpiece3");
1780 x1[0] = fgkHybridWidth/2-piece3width/2;
1782 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
1783 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
1784 lowFLpiece.CreateAndInsertBoxCableSegment(1);
1786 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
1787 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
1788 Double_t vX[3] = {1,0,0};
1789 for (Int_t i=0; i<3; i++) {
1791 sprintf(ch, "lowFLpieceA%i", i+4);
1792 lowFLpiece.SetName(ch);
1793 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
1795 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
1796 x1[0] = -fgkHybridWidth/2 + piece1width;
1797 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
1798 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
1799 x1[2] = zPiece; x2[2] = zPiece;
1800 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
1801 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
1802 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
1803 lowFLpiece.ResetPoints();
1805 sprintf(ch, "lowFLpieceB%i", i+4);
1806 lowFLpiece.SetName(ch);
1807 x1[0] = fgkHybridWidth/2 - piece3width;
1808 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
1809 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
1810 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
1811 lowFLpiece.CreateAndInsertBoxCableSegment(1,90);
1814 //**************************************************** chips+CC:
1815 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
1816 chip.SetInitialNode(hybrid);
1818 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
1819 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
1820 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
1821 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
1823 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
1824 // Here the tho CC (low+up) are merged
1825 // In fact, the last layer has a smaller surface of Al -> I put 80%
1827 x1[1] = lowLayerYmin + chipsCCTotThick/2;
1831 for (Int_t i=0; i<4; i++) {
1832 sprintf(ch, "pascalCC%i", i);
1834 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
1835 x2[0] = x1[0] + fgkHybPascalDX;
1836 x1[2] = zChips[i] - fgkHybridLength/2;
1838 chip.AddCheckPoint( hybrid, 0, x1, vX );
1839 chip.AddCheckPoint( hybrid, 1, x2, vX );
1840 chip.CreateAndInsertBoxCableSegment(1,-90);
1843 sprintf(ch, "ambraCC%i", i);
1845 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
1846 x2[0] = x1[0] + fgkHybAmbraDX;
1847 chip.AddCheckPoint( hybrid, 0, x1, vX );
1848 chip.AddCheckPoint( hybrid, 1, x2, vX );
1849 chip.CreateAndInsertBoxCableSegment(1,-90);
1853 //**************************************************** CC outside chips:
1854 // I don't think there is a second aluminium layer here ...
1855 for (Int_t i = 0; i<4; i++) {
1857 sprintf(ch, "ccLayerA%i", i);
1859 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
1860 ccLayer1.SetInitialNode(hybrid);
1861 ccLayer1.SetNLayers(2);
1862 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
1863 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
1866 x1[0] = -fgkHybridWidth/2;
1867 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
1868 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
1869 + fgkHybChipThick + ccUpLayerTotThick/2;
1871 x1[2] = zChips[i] - fgkHybridLength/2;
1873 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
1874 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
1875 ccLayer1.CreateAndInsertBoxCableSegment(1,-90);
1877 sprintf(ch, "ccLayerB%i", i);
1878 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
1879 ccLayer2.SetInitialNode(hybrid);
1880 ccLayer2.SetNLayers(2);
1881 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
1882 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
1885 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
1886 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
1887 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
1888 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
1889 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
1890 ccLayer2.ResetPoints();
1891 sprintf(ch, "ccLayerC%i", i);
1892 ccLayer2.SetName(ch);
1893 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
1894 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
1895 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
1896 + ccUpLayerTotThick/2;
1899 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
1900 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
1901 ccLayer2.CreateAndInsertBoxCableSegment(1,-90);
1904 //**************************************************** FL UP:
1905 // (last Al layer will be a special triangular shape)
1906 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
1907 fgkHybFLUpperWidth/2, flUpThick/2,
1908 fgkHybFLUpperLength/2);
1909 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
1910 sFLupPolyhamide, polyhamideSDD);
1911 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
1912 TGeoTranslation *trFLupPolyhamide =
1913 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
1914 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
1916 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
1918 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
1919 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1920 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1921 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
1922 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
1923 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1924 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1925 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
1926 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
1927 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
1930 vAluStrip->SetLineColor(fColorAl);
1931 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
1932 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
1934 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
1935 +flUpThick+fgkHybAlThick/2;
1936 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
1937 fgkHybridWidth/2,yRotAluStrip,
1938 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
1939 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
1940 AddTranslationToCombiTrans(aluStripTr2,0,0,
1941 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
1942 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
1943 AddTranslationToCombiTrans(aluStripTr3,0,0,
1944 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
1945 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
1946 AddTranslationToCombiTrans(aluStripTr4,0,0,
1947 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
1949 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
1950 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
1951 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
1952 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
1953 //**************************************************** SMD:
1954 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
1955 fgkHybSMDmiddleL/2+fgkHybSMDendL,
1956 fgkHybSMDheight/2,fgkHybSMDendW/2);
1957 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
1959 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
1960 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
1961 fgkHybSMDmiddleW/2);
1962 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
1963 hybSMDmiddle,medSMD);
1964 vHybSMDmiddle->SetLineColor(fColorSMD);
1965 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
1966 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
1967 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
1968 hybSMDend,medSMDweld);
1969 vHybSMDend->SetLineColor(fColorSMDweld);
1970 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
1971 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
1972 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
1973 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
1974 vHybSMD->AddNode(vHybSMDmiddle,1,0);
1975 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
1976 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
1977 for (Int_t i=0; i<fgkNHybSMD; i++) {
1978 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
1979 -fgkHybridWidth/2+fgkHybSMDposX[i],
1980 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
1981 -fgkHybridLength/2+fgkHybSMDposZ[i]);
1982 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
1988 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
1989 hybrid->SetVisibility(kFALSE);
1993 //________________________________________________________________________
1994 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
1996 // Return a TGeoVolume* containing a segment of a ladder.
1999 TGeoMedium *phynoxSDD = GetMedium("inox/alum$"); // phynoxSDD To code ??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2000 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2001 TGeoMedium *airSDD = GetMedium("SDD AIR$");
2003 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
2004 Double_t segmentLength = fgkSegmentLength;
2005 Double_t spaceBetweenCables = 500*fgkmicron;
2007 //*****************************************
2008 // Set parameters according to (iLay,iSeg):
2009 //*****************************************
2010 Int_t nDetectors = fgkLay3Ndet;
2011 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2012 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
2013 (fgkSegmentLength*fgkLay3Ndet/2. -
2014 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2015 // sensorCenterZPos = z in segment local coord syst.
2017 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
2018 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
2021 } else if (iLay==4) {
2022 nDetectors = fgkLay4Ndet;
2023 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2024 sensorCenterZPos = fLay4sensorZPos[iSeg]-
2025 (fgkSegmentLength*fgkLay4Ndet/2. -
2026 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
2027 digitCableA = fDigitCableLay4A;
2028 digitCableB = fDigitCableLay4B;
2030 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
2033 Double_t cableSideSign = -1;
2034 if (iSeg<nDetectors/2) cableSideSign = 1;
2035 Double_t spaceForCables = spaceBetweenCables*
2036 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
2038 // gives [0-1-2-2-1-0]*spaceBetweenCables
2039 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
2040 Int_t iUpdateCableMin;
2041 Int_t iUpdateCableMax;
2042 if (cableSideSign==-1) {
2043 iUpdateCableMin = nDetectors/2;
2044 iUpdateCableMax = iSeg-1;
2046 iUpdateCableMin = iSeg+1;
2047 iUpdateCableMax = nDetectors/2-1;
2051 cout << "Segment ("<< iLay <<',' << iSeg
2052 << ") : sensor z shift in local segment coord.="
2053 << sensorCenterZPos << endl;
2056 //****************************
2057 // The segment volume
2058 //****************************
2060 // Use of TGeoVolumeAssembly increases the calculation time of overlaps and very
2061 // likely slows down the transport of particles through the geometry
2063 //TGeoVolumeAssembly *virtualSeg = new TGeoVolumeAssembly("ITSsddSegment");
2065 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
2066 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
2067 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
2070 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
2072 virtualSeg->SetVisibility(kFALSE);
2074 //******************************
2075 // Carbon fiber structure :
2076 //******************************
2078 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
2079 Int_t volumeIndex = 1;
2080 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
2081 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
2085 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
2086 fLaddSegCommonTr[i]);
2089 //**********************************
2090 // Pine support of the sensors :
2091 //**********************************
2092 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
2093 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
2095 // The use of the following constructor type allow to use rotPS1 and rotPS2
2096 // (and not copy them) therefore we gain some memory
2097 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
2098 - fgkLadderHeight/2.-tDY
2099 + fgkPinSuppHeight/2.,
2100 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2102 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fgkPinDYOnSensor,
2103 - fgkLadderHeight/2.-tDY
2104 + fgkPinSuppHeight/2.,
2105 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2106 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
2108 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fgkPinDYOnSensor,
2109 - fgkLadderHeight/2.-tDY
2110 + fgkPinSuppHeight/2.,
2111 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2112 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
2114 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fgkPinDYOnSensor,
2115 - fgkLadderHeight/2.-tDY
2116 + fgkPinSuppHeight/2.,
2117 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
2118 AddTranslationToCombiTrans(transPS4, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2120 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2121 - fgkLadderHeight/2. - tDY
2122 + fgkPinSuppHeight/2.,
2123 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2125 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2126 - fgkLadderHeight/2. - tDY
2127 + fgkPinSuppHeight/2.,
2128 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2129 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
2131 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2132 - fgkLadderHeight/2. - tDY
2133 + fgkPinSuppHeight/2.,
2134 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2135 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
2137 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fgkPinDYOnSensor,
2138 - fgkLadderHeight/2. - tDY
2139 + fgkPinSuppHeight/2.,
2140 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
2141 AddTranslationToCombiTrans(transPS8, 0, 0, -2*fgkPinDXminOnSensor-fgkPinPinDDXOnSensor);
2143 virtualSeg->AddNode(fPinSupport, 1, transPS1);
2144 virtualSeg->AddNode(fPinSupport, 2, transPS2);
2145 virtualSeg->AddNode(fPinSupport, 3, transPS3);
2146 virtualSeg->AddNode(fPinSupport, 4, transPS4);
2147 virtualSeg->AddNode(fPinSupport, 5, transPS5);
2148 virtualSeg->AddNode(fPinSupport, 6, transPS6);
2149 virtualSeg->AddNode(fPinSupport, 7, transPS7);
2150 virtualSeg->AddNode(fPinSupport, 8, transPS8);
2152 //******************************
2153 // Cooling pipe supports :
2154 //******************************
2155 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2156 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2157 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2158 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2160 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2161 (triangleHeight+triangleCPaxeDist/
2162 TMath::Sin(halfTheta)-coolPipeSuppH);
2163 if (fAddCoolingSyst) {
2164 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
2165 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
2166 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2167 -fgkLadderHeight/2. - tDY
2168 +coolPipeSuppH+fgkLadderBeamRadius,
2169 -segmentLength/2., rotCPS1);
2171 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
2172 -fgkLadderHeight/2. - tDY
2173 +coolPipeSuppH+fgkLadderBeamRadius,
2174 -segmentLength/2., rotCPS1);
2175 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
2177 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
2178 -fgkLadderHeight/2.- tDY
2179 +coolPipeSuppH+fgkLadderBeamRadius,
2180 segmentLength/2., rotCPS2);
2182 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2183 -fgkLadderHeight/2.- tDY
2184 +coolPipeSuppH+fgkLadderBeamRadius,
2185 segmentLength/2., rotCPS2);
2186 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
2188 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
2189 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
2190 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
2191 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
2194 //************************
2196 //************************
2197 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2198 -fgkLadderHeight/2. - tDY +
2199 fgkLadderBeamRadius+coolPipeSuppH, 0);
2200 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2201 -fgkLadderHeight/2.- tDY +
2202 fgkLadderBeamRadius+coolPipeSuppH, 0);
2204 if (fAddCoolingSyst) {
2205 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2206 fgkCoolPipeOuterDiam/2,
2208 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2211 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
2212 coolingPipeShape, phynoxSDD );
2213 coolingPipe->SetLineColor(fColorPhynox);
2214 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
2218 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
2219 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
2221 virtualSeg->AddNode(cooler, 1, pipeTr1);
2222 virtualSeg->AddNode(cooler, 2, pipeTr2);
2226 //**********************************
2227 // Bases of hybrid thermal bridges
2228 //**********************************
2229 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
2230 // approx !!! not clear on 0752/14-A
2231 if (fAddCoolingSyst) {
2232 TGeoRotation rotHybrid1("", 0, 0, -90 - fgkHybridAngle);
2233 TGeoRotation rotHybrid2("", 0 ,180, 90 - fgkHybridAngle);
2234 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
2235 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
2237 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
2238 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
2241 //*************************
2243 //*************************
2244 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
2245 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
2247 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
2248 - shiftHyb*SinD(fgkHybridAngle) );
2249 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
2250 + shiftHyb*CosD(fgkHybridAngle) );
2252 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
2253 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
2254 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
2255 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
2256 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
2257 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
2259 virtualSeg->AddNode(fHybrid, 1, hybTr1);
2260 virtualSeg->AddNode(fHybrid, 2, hybTr2);
2267 // Starting from this segment
2268 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
2269 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
2270 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
2271 - digitCableA->GetWidth()/2;
2272 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
2273 - digitCableA->GetThickness()/2;
2275 Double_t digitCableX = ( coolPipeSuppL
2276 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
2277 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
2278 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
2279 + fgkLadderBeamRadius+coolPipeSuppH
2280 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
2281 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
2284 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
2285 digitCableY, cableSideSign*hybDz };
2286 Double_t digitCableCenterA1[3] = {
2287 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2288 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2289 cableSideSign*segmentLength/2 };
2291 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
2292 digitCableY,cableSideSign*hybDz};
2293 Double_t digitCableCenterB1[3]={
2294 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
2295 digitCableY+spaceForCables*SinD(fgkHybridAngle),
2296 cableSideSign*segmentLength/2 };
2298 Double_t vZ[3] = {0,0,1};
2299 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
2300 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
2301 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
2302 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
2304 // Updating the other cables
2305 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
2307 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
2309 digitCableA[iCable].GetPoint( 1, coord);
2310 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2311 digitCableB[iCable].GetPoint( 1, coord);
2312 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
2316 //**********************************
2317 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
2322 //________________________________________________________________________
2323 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
2325 // Create a pine support
2326 // axis of rotation is the cone axis, center in its middle
2328 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
2329 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
2330 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
2331 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
2332 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
2333 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
2334 fgkPinSuppHeight/2.);
2335 if(GetDebug(3)){// Remove compiler warning.
2336 cone->InspectShape();
2337 tong->InspectShape();
2338 hole->InspectShape();
2341 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
2342 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
2343 tongTrans->RegisterYourself();
2344 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
2345 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
2346 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
2349 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2350 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport",pinSupportShape,
2352 pinSupport->SetLineColor(fColorRyton);
2354 // include the pin itself !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2358 //________________________________________________________________________
2359 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
2361 // Create half of the cooling pipe support (ALR-0752/3)
2364 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2366 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2367 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2368 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
2369 -fgkCoolPipeSuppWidthExt/2.);
2370 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
2371 fgkCoolPipeSuppWidthExt/2.);
2372 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2373 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2374 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
2375 -fgkCoolPipeSuppWidthExt/2.);
2376 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
2377 fgkCoolPipeSuppWidthExt/2.);
2378 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2379 side1->SetName("ITSsddCPSside1");
2381 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
2382 - fgkCoolPipeSuppAxeDist
2383 + fgkCoolPipeSuppWidthExt/2., 0);
2384 side1Tr->RegisterYourself();
2385 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
2386 - fgkCoolPipeSuppAxeDist
2387 + fgkCoolPipeSuppWidthExt*3/2.
2388 + fgkCoolPipeSuppWidthIn,0);
2389 side2Tr->RegisterYourself();
2391 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
2392 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2393 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
2394 TGeoTranslation *middleTr =
2395 new TGeoTranslation("ITSsddCPStr3",
2396 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
2397 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
2398 +fgkCoolPipeSuppWidthIn/2., 0);
2399 middleTr->RegisterYourself();
2401 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
2402 fgkCoolPipeSuppTongW/4.,
2403 (fgkCoolPipeSuppFulWidth
2404 - 2*fgkCoolPipeSuppWidthExt
2405 - fgkCoolPipeSuppWidthIn)/2,
2406 fgkCoolPipeSuppHeight/2.);
2408 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
2409 fgkCoolPipeSuppTongW/4.,
2410 - fgkCoolPipeSuppAxeDist
2411 + fgkCoolPipeSuppFulWidth
2412 - axeBox->GetDY(), 0);
2413 axeBoxTr->RegisterYourself();
2415 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
2416 fgkCoolPipeSuppTongW/4.);
2418 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
2419 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
2420 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2421 axeTrans->RegisterYourself();
2422 //delete axeRot; // make the code crash, no idea of why !!!
2425 middle->InspectShape();
2426 axe->InspectShape();
2429 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2431 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2432 "ITSsddCoolPipeSuppShapeL",
2433 "ITSsddCPSmiddle:ITSsddCPStr3"
2434 "+ITSsddCPSside1:ITSsddCPStr1"
2435 "+ITSsddCPSside1:ITSsddCPStr2"
2436 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
2437 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
2438 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
2439 coolPipeSuppShape, rytonSDD);
2441 coolPipeSupp->SetLineColor(fColorRyton);
2443 return coolPipeSupp;
2447 //________________________________________________________________________
2448 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
2450 //Create half of the cooling pipe support (ALR-0752/3)
2453 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
2455 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
2456 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
2457 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2458 -fgkCoolPipeSuppWidthExt/2.);
2459 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
2460 fgkCoolPipeSuppWidthExt/2.);
2461 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
2462 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
2463 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
2464 -fgkCoolPipeSuppWidthExt/2.);
2465 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
2466 fgkCoolPipeSuppWidthExt/2.);
2467 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
2468 side1->SetName("ITSsddCPSside1R");
2470 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
2471 - fgkCoolPipeSuppAxeDist
2472 + fgkCoolPipeSuppWidthExt/2., 0);
2473 side1Tr->RegisterYourself();
2474 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
2475 - fgkCoolPipeSuppAxeDist
2476 + fgkCoolPipeSuppWidthExt*3/2.
2477 + fgkCoolPipeSuppWidthIn, 0);
2478 side2Tr->RegisterYourself();
2480 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
2481 (fgkCoolPipeSuppMaxLength/2.
2482 - fgkCoolPipeSuppSlitL)/2.,
2483 fgkCoolPipeSuppWidthIn/2.,
2484 fgkCoolPipeSuppHeight/2.);
2485 TGeoTranslation *middleTr =
2486 new TGeoTranslation("ITSsddCPStr3R",
2487 -( fgkCoolPipeSuppMaxLength/2.
2488 -fgkCoolPipeSuppSlitL)/2.,
2489 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
2490 + fgkCoolPipeSuppWidthIn/2.,0);
2491 middleTr->RegisterYourself();
2493 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
2494 fgkCoolPipeSuppTongW/4.,
2495 (fgkCoolPipeSuppFulWidth
2496 - 2*fgkCoolPipeSuppWidthExt
2497 - fgkCoolPipeSuppWidthIn)/2,
2498 fgkCoolPipeSuppHeight/2.);
2500 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
2501 - fgkCoolPipeSuppTongW/4.,
2502 - fgkCoolPipeSuppAxeDist
2503 + fgkCoolPipeSuppFulWidth
2504 - axeBox->GetDY(),0);
2505 axeBoxTr->RegisterYourself();
2507 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
2508 fgkCoolPipeSuppTongW/4.);
2510 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
2511 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
2512 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
2513 axeTrans->RegisterYourself();
2517 middle->InspectShape();
2518 axe->InspectShape();
2521 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
2522 "ITSsddCoolPipeSuppShapeR",
2523 "ITSsddCPSmiddleR:ITSsddCPStr3R"
2524 "+ITSsddCPSside1R:ITSsddCPStr1R"
2525 "+ITSsddCPSside1R:ITSsddCPStr2R"
2526 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
2527 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
2529 TGeoMedium *rytonSDD = GetMedium("SDD C AL (M55J)$"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2530 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
2531 coolPipeSuppShape, rytonSDD);
2532 coolPipeSupp->SetLineColor(fColorRyton);
2534 return coolPipeSupp;
2537 //________________________________________________________________________
2538 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
2540 // based on ALR 0752/8
2543 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
2545 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
2546 - (fgkRadiusAminBTB+fgkBTBthick);
2547 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
2548 fgkBTBthick/2., fgkBTBlength/2.);
2549 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
2550 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
2551 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2552 base1Tr->RegisterYourself();
2554 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
2556 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
2557 fgkBTBthick/2., fgkBTBlength/2.);
2558 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
2559 fgkBTBaxisAtoBottom - base2width/2.,
2560 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
2561 base2Tr->RegisterYourself();
2563 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
2564 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
2565 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
2566 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
2567 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
2568 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
2569 sideTr1->RegisterYourself();
2570 sideTr2->RegisterYourself();
2572 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
2573 fgkBTBthick/2., fgkBTBHoleLength/2.);
2574 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
2575 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2576 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2577 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
2578 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
2579 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
2580 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
2581 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
2582 holeTr1->RegisterYourself();
2583 holeTr2->RegisterYourself();
2585 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
2586 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
2587 fgkRadiusAminBTB, radiusAmaxBTB,
2588 fgkBTBlength/2., 0., 180.);
2589 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
2590 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
2591 fgkBTBlength/2., 270., 360.);
2592 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
2593 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
2595 roundTr1->RegisterYourself();
2597 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
2598 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
2599 fgkBTBlength/2., 180., 270.);
2600 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
2601 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
2603 roundTr2->RegisterYourself();
2605 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
2606 "ITSsddBaseThermalBridgeShape",
2607 "ITSsddBTBbase1:ITSsddBTBtr1"
2608 "+ ITSsddBTBbase2:ITSsddBTBtr2"
2609 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
2610 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
2611 "+ ITSsddBTBside:ITSsddBTBsideTr1"
2612 "+ ITSsddBTBside:ITSsddBTBsideTr2"
2613 "- ITSsddBTBhole:ITSsddBTBholeTr1"
2614 "- ITSsddBTBhole:ITSsddBTBholeTr2"
2615 "+ ITSsddBTBmainAxis");
2617 if(GetDebug(3)){// Remove compiler warning.
2618 base1->InspectShape();
2619 base2->InspectShape();
2620 side->InspectShape();
2621 hole->InspectShape();
2622 mainAxis->InspectShape();
2623 round1->InspectShape();
2624 round2->InspectShape();
2627 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$");
2628 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
2630 carbonFiberLadderStruct);
2632 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
2633 return vBaseThermalBridge;
2637 //________________________________________________________________________
2638 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
2640 // Return an assembly containing a end of a CF ladder.
2643 TGeoMedium *carbonFiberLadderStruct = GetMedium("SDD C AL (M55J)$"); // ITSsddCarbonM55J
2644 TGeoMedium *stesalite = GetMedium("EPOXY$"); /// To code ??? !!!!!!!!!!!!!!!!
2645 TGeoMedium *phynoxSDD = GetMedium("inox/alum$"); // phynoxSDD To code ??? !!!!!!!!!!!
2646 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
2648 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
2649 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2650 Double_t underSegDH = fLay3LadderUnderSegDH;
2651 Double_t footDZ = fgkRubyZladd3 - fgkLay3Ndet*fgkSegmentLength/2 - length/2;
2652 // footDZ is also where to place the ruby's center in local Z
2653 Double_t coolPipeEndLen = (fgkCoolPipeLay3Len-fgkSegmentLength*fgkLay3Ndet)/2;
2656 } else if (iLay==4) {
2657 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
2658 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2659 underSegDH = fLay4LadderUnderSegDH;
2660 footDZ = fgkRubyZladd4 - fgkLay4Ndet*fgkSegmentLength/2 - length/2;
2661 coolPipeEndLen = (fgkCoolPipeLay4Len-fgkSegmentLength*fgkLay4Ndet)/2;
2663 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
2667 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
2668 + underSegDH/2); //space under ladder segment
2669 // here tDY is not the same as for the segment because the end ladder
2670 // does not have a space under it, inside the general ladder volume.
2671 Double_t segmentLength = fgkSegmentLength;
2672 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
2674 TGeoVolumeAssembly *virtualEnd = new TGeoVolumeAssembly("ITSsddEnd");
2676 //**********************************
2677 // coding real matter :
2678 //**********************************
2679 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2680 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2681 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
2682 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
2684 //--- The 3 V shape corners of the Carbon Fiber Ladder
2686 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
2687 fgkLadderLa, fgkLadderHa, fgkLadderl);
2688 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
2689 cfLaddTop1,carbonFiberLadderStruct);
2690 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
2691 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
2692 fgkLadderLa, fgkLadderHa, fgkLadderl);
2693 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
2694 cfLaddTop2,carbonFiberLadderStruct);
2695 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
2696 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
2697 -(length-topCornerLength)/2.);
2698 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
2699 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
2702 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
2703 fgkLadderLb, fgkLadderHb, fgkLadderl);
2704 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
2705 cfLaddSide1,carbonFiberLadderStruct);
2706 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
2707 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
2708 fgkLadderLb, fgkLadderHb, fgkLadderl);
2709 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
2710 cfLaddSide2,carbonFiberLadderStruct);
2711 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
2712 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
2713 TMath::Tan(beta) - fgkLadderBeamRadius );
2715 // because center of the triangle doesn't correspond to virtual vol. center
2716 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
2717 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
2718 alpha*TMath::RadToDeg());
2719 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
2720 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
2721 -alpha*TMath::RadToDeg());
2722 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
2723 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
2724 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
2725 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
2726 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
2729 // Beams on the sides
2730 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
2731 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
2733 //Euler rotation : about Z, then new X, then new Z
2734 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
2735 -beamPhiPrime*TMath::RadToDeg(), -90);
2736 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
2737 beamPhiPrime*TMath::RadToDeg(), -90);
2738 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
2739 beamPhiPrime*TMath::RadToDeg(), -90);
2740 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
2741 -beamPhiPrime*TMath::RadToDeg(), -90);
2742 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
2743 TMath::Tan(halfTheta),
2744 fgkLadderBeamRadius/2. + tDY,
2745 -length/2 + segmentLength/8, beamRot1);
2746 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
2747 TMath::Tan(halfTheta),
2748 fgkLadderBeamRadius/2.+tDY,
2749 -length/2 + 3*segmentLength/8, beamRot2);
2750 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
2751 TMath::Tan(halfTheta),
2752 fgkLadderBeamRadius/2.+tDY,
2753 -length/2 + segmentLength/8, beamRot3);
2754 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
2755 TMath::Tan(halfTheta),
2756 fgkLadderBeamRadius/2. + tDY,
2757 -length/2+3*segmentLength/8, beamRot4);
2759 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
2760 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
2761 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
2762 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
2764 //--- Beams of the bottom
2765 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
2767 /* Not there actually
2768 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
2769 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
2770 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
2771 bottomBeam1, carbonFiberLadderStruct);
2772 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
2774 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
2775 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
2776 -length/2+fgkSegmentLength/2, bottomBeamRot1);
2777 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
2779 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
2780 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
2781 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
2782 bottomBeam2, carbonFiberLadderStruct);
2783 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
2784 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
2785 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
2786 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
2788 //**********************************
2789 //the cooling pipe supports
2790 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2791 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2793 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2794 (triangleHeight+triangleCPaxeDist/
2795 TMath::Sin(halfTheta)-coolPipeSuppH);
2797 if (fAddCoolingSyst) {
2798 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
2799 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
2800 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2801 -fgkLadderHeight/2.+ tDY +
2802 coolPipeSuppH+fgkLadderBeamRadius,
2803 -length/2., rotCPS1);
2804 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2805 -fgkLadderHeight/2.+ tDY +
2806 coolPipeSuppH+fgkLadderBeamRadius,
2807 -length/2., rotCPS2);
2809 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
2810 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
2813 //**********************************
2814 //--- The stesalite foot of the ladder
2816 Double_t footDY = -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY
2817 - fgkLadFootY/2+fgkLadFingerPrintY;
2819 TGeoTranslation *footTr = new TGeoTranslation("SDDfootTr",0,footDY,footDZ);
2820 virtualEnd->AddNode(fLadderFoot, 1, footTr);
2822 //=====================================
2825 if (fAddCoolingSyst) {
2827 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
2828 -fgkLadderHeight/2.+ tDY +
2829 coolPipeSuppH + fgkLadderBeamRadius,
2830 -length/2.+coolPipeEndLen/2.);
2831 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
2832 -fgkLadderHeight/2. + tDY +
2833 fgkLadderBeamRadius + coolPipeSuppH,
2834 -length/2.+coolPipeEndLen/2.);
2836 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
2837 fgkCoolPipeOuterDiam/2,
2839 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
2842 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipeEnd",
2843 coolingPipeShape, phynoxSDD );
2844 coolingPipe->SetLineColor(fColorPhynox);
2845 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingEndLiquid",coolerShape,
2848 virtualEnd->AddNode(coolingPipe, 1, pipeTr1);
2849 virtualEnd->AddNode(coolingPipe, 2, pipeTr2);
2851 virtualEnd->AddNode(cooler, 1, pipeTr1);
2852 virtualEnd->AddNode(cooler, 2, pipeTr2);
2856 //=====================================
2857 //--- HV cable guide
2860 TGeoBBox* guideHVbox = new TGeoBBox("guideHVbox",fgkHVguideX1/2,
2861 fgkHVguideY1/2,fgkHVguideZ1/2);
2862 TGeoVolume *guideHV = new TGeoVolume("guideHV",guideHVbox,stesalite); // material ?
2864 TGeoTranslation* guideHVtr = new TGeoTranslation(fgkHVguideDX,
2865 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY-fgkHVguideY1/2,
2866 footDZ+fgkLadFootZ/2+fgkHVguideZ1/2-(fgkHVguideSuppFullZ-fgkHVguideZ2));
2867 virtualEnd->AddNode(guideHV, 1, guideHVtr);
2869 //=====================================
2871 Double_t raccordFullLen = fgkConnectorCoolTubeL1+fgkConnectorCoolTubeL2+fgkConnectorCoolTubeL3;
2872 TGeoTranslation *trRaccordo1 = new TGeoTranslation("trRaccordo1",-coolPipeSuppL,
2873 -fgkLadderHeight/2.+ tDY +
2874 coolPipeSuppH+fgkLadderBeamRadius,
2875 -length/2.+coolPipeEndLen+raccordFullLen/2);
2876 TGeoTranslation *trRaccordo2 = new TGeoTranslation("trRaccordo2", coolPipeSuppL,
2877 -fgkLadderHeight/2.+ tDY +
2878 coolPipeSuppH+fgkLadderBeamRadius,
2879 -length/2.+coolPipeEndLen+raccordFullLen/2);
2881 virtualEnd->AddNode(fRaccordoL, 1, trRaccordo1);
2882 virtualEnd->AddNode(fRaccordoL, 2, trRaccordo2);
2884 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
2889 //________________________________________________________________________
2890 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateLadderFoot() {
2892 //--- The stesalite foot of the ladder
2894 // The 2 screw holes on the left part
2895 // the small holes at each corner of the ruby cage (diam 2mm)
2896 // the really small level difference of 0.3mm on the bottom
2899 TGeoMedium *stesalite = GetMedium("EPOXY$"); /// To code ??? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2901 TGeoVolumeAssembly *virtualFoot = new TGeoVolumeAssembly("ITSsddFoot");
2903 Double_t epsilon = 2e-10;
2904 TGeoBBox *ladFootBox1 = new TGeoBBox("ladFootBox1",fgkLadBox1X/2, fgkLadFootY/2,
2906 TGeoTranslation *ladFootBox1Tr = new TGeoTranslation("ladFootBox1Tr",
2907 fgkLadFootX/2-fgkLadBox1X/2,0,0);
2908 TGeoBBox *ladFingerPrint = new TGeoBBox("ladFingerPrint",fgkLadFingerPrintX/2,
2909 fgkLadFingerPrintY/2+epsilon, fgkLadFootZ/2+epsilon);
2911 TGeoTranslation *ladFingerPrintTr = new TGeoTranslation("ladFingerPrintTr",
2912 fgkLadFootX/2-fgkLadFingerPrintBorder-fgkLadFingerPrintX/2,
2913 fgkLadFootY/2-fgkLadFingerPrintY/2+epsilon,
2916 TGeoBBox *rubyCageHole = new TGeoBBox("rubyCageHole",fgkRubyCageHoleX/2,
2917 fgkRubyCageHoleY/2+epsilon, fgkRubyCageHoleZ/2);
2919 TGeoTranslation *rubyCageHoleTr = new TGeoTranslation("rubyCageHoleTr",
2920 fgkLadFootX/2-(fgkLadFootX/2-fgkRubyDX)+fgkRubyCageAxisShift,
2921 fgkLadFootY/2-fgkRubyCageHoleY/2,0);
2923 double rubyScrewHoleLen = fgkLadFootX/2-fgkRubyDX;
2924 TGeoTube *rubyScrewHole = new TGeoTube("rubyScrewHole", 0,fgkScrewM4diam/2,
2925 rubyScrewHoleLen/2);
2927 TGeoRotation *rot9090 = new TGeoRotation("",90,90,0);
2928 TGeoCombiTrans *rubyScrewHoleTr = new TGeoCombiTrans("rubyScrewHoleTr",
2929 fgkLadFootX/2-rubyScrewHoleLen/2,
2930 -fgkRubyScrewShiftToCenterY, 0, rot9090);
2932 Double_t rubyHoleLen = fgkLadFootY-fgkRubyCageHoleY;
2933 TGeoTube *rubyHole = new TGeoTube("rubyHole", 0,fgkRubyHoleDiam/2,
2936 TGeoRotation *rot90 = new TGeoRotation("",0,90,0);
2937 TGeoCombiTrans *rubyHoleTr = new TGeoCombiTrans("rubyHoleTr", fgkRubyDX,
2938 -(fgkLadFootY-rubyHoleLen)/2, 0, rot90);
2940 ladFootBox1Tr->RegisterYourself();
2941 ladFingerPrintTr->RegisterYourself();
2942 rubyCageHoleTr->RegisterYourself();
2943 rubyScrewHoleTr->RegisterYourself();
2944 rubyHoleTr->RegisterYourself();
2946 TGeoCompositeShape *footRightPart = new TGeoCompositeShape(
2947 "ladFootBox1:ladFootBox1Tr-(ladFingerPrint:ladFingerPrintTr"
2948 "+rubyCageHole:rubyCageHoleTr+rubyScrewHole:rubyScrewHoleTr"
2949 "+rubyHole:rubyHoleTr)");
2950 TGeoVolume *vFootRightPart = new TGeoVolume("vFootRightPart",
2951 footRightPart,stesalite);
2952 vFootRightPart->SetLineColor(fColorStesalite);
2954 virtualFoot->AddNode(vFootRightPart, 1, 0);
2957 //--- This was the right part of the foot, now let's do the middle
2958 //--- and the right parts
2960 Double_t middleX = fgkLadFootX-fgkLadBox1X-fgkLadFingerPrintX-fgkLadFingerPrintBorder;
2961 TGeoBBox *footMiddle = new TGeoBBox("footMiddle", middleX/2, fgkLadFootMiddleY/2,
2963 TGeoTranslation *middleXTr = new TGeoTranslation("middleXTr",
2964 fgkLadFootX/2-fgkLadBox1X-middleX/2,
2965 fgkLadFootY/2-fgkLadFootMiddleY/2, 0);
2967 TGeoVolume *vFootMiddle = new TGeoVolume("vFootMiddle", footMiddle,stesalite);
2968 vFootMiddle->SetLineColor(fColorStesalite);
2969 virtualFoot->AddNode(vFootMiddle, 1, middleXTr);
2972 TGeoBBox *footLeftLadFinger = new TGeoBBox("footLeftLadFinger", fgkLadFingerPrintX/2,
2973 (fgkLadFootY-fgkLadFingerPrintY)/2,
2975 TGeoTranslation *footLeftLadFingerTr = new TGeoTranslation("footLeftLadFingerTr",
2976 -fgkLadFootX/2+fgkLadFingerPrintBorder+fgkLadFingerPrintX/2,
2977 -fgkLadFingerPrintY/2, 0);
2978 TGeoVolume *vFootLeftLadFinger = new TGeoVolume("vFootLeftLadFinger",footLeftLadFinger,
2980 vFootLeftLadFinger->SetLineColor(fColorStesalite);
2981 virtualFoot->AddNode(vFootLeftLadFinger, 1, footLeftLadFingerTr);
2984 TGeoBBox *footLeft = new TGeoBBox("footLeft", fgkLadFingerPrintBorder/2,
2987 TGeoTranslation *footLeftTr = new TGeoTranslation("footLeftTr",
2988 -fgkLadFootX/2+fgkLadFingerPrintBorder/2,
2990 TGeoVolume *vFootLeft = new TGeoVolume("vFootLeft",footLeft,stesalite);
2991 vFootLeft->SetLineColor(fColorStesalite);
2992 virtualFoot->AddNode(vFootLeft, 1, footLeftTr);
2994 if(GetDebug(3)){ // Remove compiler warning.
2995 ladFingerPrint->InspectShape();
2996 ladFootBox1->InspectShape();
2997 rubyCageHole->InspectShape();
2998 rubyScrewHole->InspectShape();
2999 rubyHole->InspectShape();
3005 //________________________________________________________________________
3006 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateCarlosCard(Int_t iLay) {
3008 // return an assembly containing the CARLOS end-ladder board
3009 // and the heat bridge
3013 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3014 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3015 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3016 TGeoMedium *copper = GetMedium("COPPER$");
3017 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3018 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3020 //=========================================
3021 // cooling support of the Carlos card (HeatBridge):
3022 TGeoVolumeAssembly *assemblySupCarlos = new TGeoVolumeAssembly("assemblySupCarlos");
3024 TGeoBBox *supCarlosBoard1 = new TGeoBBox("",fgkCarlosSuppX1/2,fgkCarlosSuppY1/2,
3026 TGeoBBox *supCarlosBoard2 = new TGeoBBox("",fgkCarlosSuppX2/2,fgkCarlosSuppY2/2,
3028 TGeoVolume *vSupCarlosBoard1 = new TGeoVolume("vSupCarlosBoard1",
3029 supCarlosBoard1, alCu12SDD);
3030 TGeoVolume *vSupCarlosBoard2 = new TGeoVolume("vSupCarlosBoard2",
3031 supCarlosBoard2, alCu12SDD);
3032 vSupCarlosBoard1->SetLineColor(4);
3033 vSupCarlosBoard2->SetLineColor(4);
3036 Double_t shiftGlob = -fgkCarlosSuppZ/2+fgkCarlosSuppTopLen;
3037 // shift of the main planes in the direction of their width
3038 // the center is fixed at the center of the 2 small fixing arms on each sides.
3041 shiftGlob+= 0.5*fgkCarlosSuppY3/cos((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3042 shiftGlob-= 0.5*fgkCarlosSuppY2*tan((90-fgkCarlosSuppAngle)*TMath::DegToRad());
3043 Double_t shiftGlobY = shiftGlob*sin(fgkCarlosSuppAngle*TMath::DegToRad());
3044 Double_t shiftGlobZ = shiftGlob*cos(fgkCarlosSuppAngle*TMath::DegToRad());
3046 TGeoTranslation *carlosSupTr1 = new TGeoTranslation( -fgkCarlosSuppX2/2,
3047 (-fgkCarlosSuppY1+fgkCarlosSuppY2)/2+shiftGlobY,
3050 TGeoTranslation *carlosSupTr2 = new TGeoTranslation( fgkCarlosSuppX1/2,
3054 assemblySupCarlos->AddNode(vSupCarlosBoard1, 0, carlosSupTr1);
3055 assemblySupCarlos->AddNode(vSupCarlosBoard2, 0, carlosSupTr2);
3057 //=========================================
3058 // fixing arm of the cooling support :
3059 TGeoBBox *supCarlosBoard3 = new TGeoBBox("",fgkCarlosSuppX3/2,fgkCarlosSuppY3/2,
3061 TGeoVolume *vSupCarlosBoard3 = new TGeoVolume("vSupCarlosBoard3",
3062 supCarlosBoard3, alCu12SDD);
3063 vSupCarlosBoard3->SetLineColor(4);
3066 TGeoTube *littleScrew = new TGeoTube("littleScrew", 0, fgkLittleScrewR,
3068 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrew",
3069 littleScrew, stainless);
3070 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3071 TGeoCombiTrans *cbScrew1 = new TGeoCombiTrans(0, 0, fgkCarlosSuppZ3/2 -
3072 fgkLittleScrewHeadR-0.07, rotScrew);
3073 TGeoCombiTrans *cbScrew2 = new TGeoCombiTrans(0, 0, -fgkCarlosSuppZ3/2 +
3074 fgkLittleScrewHeadR+0.07, rotScrew);
3075 vSupCarlosBoard3->AddNode(vLittleScrew,1, cbScrew1);
3076 vSupCarlosBoard3->AddNode(vLittleScrew,2, cbScrew2);
3078 TGeoRotation *carlosSupRot = new TGeoRotation("carlosSuppInvertAngle",
3079 0, fgkCarlosSuppAngle, 0);
3080 TGeoCombiTrans *carlosSupTr3 = new TGeoCombiTrans((fgkCarlosSuppX1+
3081 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3082 TGeoCombiTrans *carlosSupTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3083 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,0,0, carlosSupRot);
3084 assemblySupCarlos->AddNode(vSupCarlosBoard3, 0, carlosSupTr3);
3085 assemblySupCarlos->AddNode(vSupCarlosBoard3, 1, carlosSupTr4);
3088 //=========================================
3089 // screws fixing the board on the U tube
3090 Double_t aaa = fgkCarlosSuppY3; // ???
3091 //Double_t aaa = fgkCarlosSuppY3/2 + fgkLittleScrewHeadH/2;
3092 Double_t bbb = fgkCarlosSuppZ3/2 - fgkLittleScrewHeadR;
3093 Double_t screw1y = ( aaa*cos(TMath::DegToRad()*fgkCarlosSuppAngle) -
3094 bbb*sin(TMath::DegToRad()*fgkCarlosSuppAngle) );
3095 Double_t screw1z = ( aaa*sin(TMath::DegToRad()*fgkCarlosSuppAngle) +
3096 bbb*cos(TMath::DegToRad()*fgkCarlosSuppAngle) )-0.07;
3098 TGeoRotation *CarlosSuppRot = (TGeoRotation *)fCommonTr[0];
3100 TGeoCombiTrans* lScrewTr1 = new TGeoCombiTrans((fgkCarlosSuppX1+
3101 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3102 screw1y,screw1z, CarlosSuppRot);
3104 TGeoCombiTrans* lScrewTr2 = new TGeoCombiTrans((fgkCarlosSuppX1+
3105 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3106 screw1z,screw1y, CarlosSuppRot);
3108 TGeoCombiTrans *lScrewTr3 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3109 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3110 screw1y,screw1z, CarlosSuppRot);
3112 TGeoCombiTrans *lScrewTr4 = new TGeoCombiTrans(-(fgkCarlosSuppX1+
3113 fgkCarlosSuppX2+fgkCarlosSuppX3)/2,
3114 screw1z,screw1y, CarlosSuppRot);
3116 assemblySupCarlos->AddNode(fCommonVol[0], 1, lScrewTr1);
3117 assemblySupCarlos->AddNode(fCommonVol[0], 2, lScrewTr2);
3118 assemblySupCarlos->AddNode(fCommonVol[0], 3, lScrewTr3);
3119 assemblySupCarlos->AddNode(fCommonVol[0], 4, lScrewTr4);
3121 //=========================================
3123 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3124 AliITSv11GeomCableFlat card1("cardCarlos1", fgkCarlosCardZ1, fgkCarlosCardY1); // name, width, thickness
3125 card1.SetNLayers(2);
3126 card1.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3127 card1.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3128 card1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3129 p1[0] = -fgkCarlosCardX1/2;
3130 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3131 p1[2] = fgkCarlosCardShift;
3132 p2[0] = fgkCarlosCardX1/2;
3133 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3134 p2[2] = fgkCarlosCardShift;
3135 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3136 card1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3137 card1.CreateAndInsertBoxCableSegment(1,90);
3139 AliITSv11GeomCableFlat card2("cardCarlos2", fgkCarlosCardZ2, fgkCarlosCardY1); // name, width, thickness
3140 card2.SetNLayers(2);
3141 card2.SetLayer(0, fgkCarlosCardCuY, copper, kOrange); // index, thickness, material, color
3142 card2.SetLayer(1, fgkCarlosCardY1-fgkCarlosCardCuY, glassFiber, 30);
3143 card2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3145 p1[0] = -fgkCarlosCardX1/2;
3146 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3147 p1[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3149 p2[0] = -fgkCarlosCardX1/2 + fgkCarlosCardX2;
3150 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge;
3151 p2[2] = fgkCarlosCardShift + fgkCarlosCardZ1/2 + fgkCarlosCardZ2/2;
3152 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3153 card2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3154 card2.CreateAndInsertBoxCableSegment(1,90);
3156 //=========================================
3157 // some chips on the board
3159 AliITSv11GeomCableFlat u1("carlosCardU1", fgkCarlosU1Z, fgkCarlosU1Y); // name, width, thickness
3161 u1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3162 u1.SetLayer(1, fgkCarlosU1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3163 u1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3165 p1[0] = fgkCarlosU1posX - fgkCarlosU1X/2;
3166 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3167 p1[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3169 p2[0] = fgkCarlosU1posX + fgkCarlosU1X/2;
3170 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU1Y/2;
3171 p2[2] = fgkCarlosCardShift + fgkCarlosU1posZ;
3172 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3173 u1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3174 u1.CreateAndInsertBoxCableSegment(1,90);
3177 AliITSv11GeomCableFlat u2("carlosCardU2", fgkCarlosU2Z, fgkCarlosU2Y); // name, width, thickness
3179 u2.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3180 u2.SetLayer(1, fgkCarlosU2Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3181 u2.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3183 p1[0] = fgkCarlosU2posX - fgkCarlosU2X/2;
3184 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3185 p1[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3187 p2[0] = fgkCarlosU2posX + fgkCarlosU2X/2;
3188 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU2Y/2;
3189 p2[2] = fgkCarlosCardShift + fgkCarlosU2posZ;
3190 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3191 u2.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3192 u2.CreateAndInsertBoxCableSegment(1,90);
3195 AliITSv11GeomCableFlat u3("carlosCardU3", fgkCarlosU3Z, fgkCarlosU3Y); // name, width, thickness
3197 u3.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3198 u3.SetLayer(1, fgkCarlosU3Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3199 u3.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3201 Double_t u3Y = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU3Y/2;
3202 p1[0] = fgkCarlosU3posX - fgkCarlosU3X/2;
3204 p1[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3206 p2[0] = fgkCarlosU3posX + fgkCarlosU3X/2;
3208 p2[2] = fgkCarlosCardShift + fgkCarlosU3posZ;
3209 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3210 u3.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3211 TGeoVolume *u3Vol = u3.CreateAndInsertBoxCableSegment(1,90);
3213 //--- U4 is like U3 (?)
3214 TGeoCombiTrans *u4Trans = new TGeoCombiTrans;
3215 u4Trans->RotateX(90);
3216 u4Trans->SetTranslation(fgkCarlosU4posX, u3Y,
3217 fgkCarlosCardShift + fgkCarlosU4posZ);
3218 assemblySupCarlos->AddNode(u3Vol, 2, u4Trans);
3221 AliITSv11GeomCableFlat u17("carlosCardU17", fgkCarlosU17Z, fgkCarlosU17Y); // name, width, thickness
3223 u17.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3224 u17.SetLayer(1, fgkCarlosU17Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3225 u17.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3227 p1[0] = fgkCarlosU17posX - fgkCarlosU17X/2;
3228 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3229 p1[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3231 p2[0] = fgkCarlosU17posX + fgkCarlosU17X/2;
3232 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU17Y/2;
3233 p2[2] = fgkCarlosCardShift + fgkCarlosU17posZ;
3234 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3235 u17.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3236 u17.CreateAndInsertBoxCableSegment(1,90);
3239 AliITSv11GeomCableFlat u35("carlosCardU35", fgkCarlosU35Z, fgkCarlosU35Y); // name, width, thickness
3241 u35.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3242 u35.SetLayer(1, fgkCarlosU35Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3243 u35.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3245 p1[0] = fgkCarlosU35posX - fgkCarlosU35X/2;
3246 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3247 p1[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3249 p2[0] = fgkCarlosU35posX + fgkCarlosU35X/2;
3250 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU35Y/2;
3251 p2[2] = fgkCarlosCardShift + fgkCarlosU35posZ;
3252 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3253 u35.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3254 u35.CreateAndInsertBoxCableSegment(1,90);
3257 AliITSv11GeomCableFlat u36("carlosCardU36", fgkCarlosU36Z, fgkCarlosU36Y); // name, width, thickness
3259 u36.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3260 u36.SetLayer(1, fgkCarlosU36Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3261 u36.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3263 p1[0] = fgkCarlosU36posX - fgkCarlosU36X/2;
3264 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3265 p1[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3267 p2[0] = fgkCarlosU36posX + fgkCarlosU36X/2;
3268 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosU36Y/2;
3269 p2[2] = fgkCarlosCardShift + fgkCarlosU36posZ;
3270 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3271 u36.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3272 u36.CreateAndInsertBoxCableSegment(1,90);
3275 AliITSv11GeomCableFlat qz1("carlosCardQZ1", fgkCarlosQZ1Z, fgkCarlosQZ1Y); // name, width, thickness
3277 qz1.SetLayer(0, fgkCarlosCardChipSiThick, siliconChip, kGreen); // index, thickness, material, color
3278 qz1.SetLayer(1, fgkCarlosQZ1Y - fgkCarlosCardChipSiThick, plastiChip, kGray+3);
3279 qz1.SetInitialNode( (TGeoVolume *) assemblySupCarlos);
3281 p1[0] = fgkCarlosQZ1posX - fgkCarlosQZ1X/2;
3282 p1[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3283 p1[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3285 p2[0] = fgkCarlosQZ1posX + fgkCarlosQZ1X/2;
3286 p2[1] = shiftGlobY - fgkCarlosCard2HeatBridge + fgkCarlosCardY1/2 + fgkCarlosQZ1Y/2;
3287 p2[2] = fgkCarlosCardShift + fgkCarlosQZ1posZ;
3288 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 0, p1, vX);
3289 qz1.AddCheckPoint( (TGeoVolume *) assemblySupCarlos, 1, p2, vX);
3290 qz1.CreateAndInsertBoxCableSegment(1,90);
3292 return assemblySupCarlos;
3295 //________________________________________________________________________
3296 Int_t AliITSv11GeometrySDD::CreateLVCard() {
3298 // Creates the assemblies containing the LV cards (left and right)
3301 TGeoMedium *glassFiber = GetMedium("SDD SI CHIP$");// glassFiber TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3302 TGeoMedium *siliconChip = GetMedium("SDD SI CHIP$");// ITSsddSiChip
3303 TGeoMedium *plastiChip = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
3304 TGeoMedium *copper = GetMedium("COPPER$");
3305 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12, to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3306 TGeoMedium *stainless = GetMedium("INOX$"); // for screws, what is the material ???????????
3308 fCardLVL = new TGeoVolumeAssembly("ITSsddLVCardLeft");
3309 fCardLVR = new TGeoVolumeAssembly("ITSsddLVCardRight");
3311 // we are going to use flat cable class to create multilayer box,
3312 // then we can use the pointers to created volumes to place them elsewhere
3313 Double_t p1[3], p2[3], vX[3] = {1,0,0};
3315 Double_t carLVfullThick = fgkLVcardZ+fgkLVcardCuZ;
3316 AliITSv11GeomCableFlat cardLV("cardLV", fgkLVcardY, carLVfullThick); // name, width, thickness
3317 cardLV.SetNLayers(2);
3318 cardLV.SetLayer(0, fgkLVcardCuZ, copper, 30); // index, thickness, material, color
3319 cardLV.SetLayer(1, fgkLVcardZ, glassFiber, 30);
3320 cardLV.SetInitialNode( (TGeoVolume *) fCardLVL);
3322 p1[1] = fgkLVcardY/2;
3325 p2[1] = fgkLVcardY/2;
3327 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3328 cardLV.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3329 TGeoVolume* boxVol = cardLV.CreateAndInsertBoxCableSegment(1);
3330 TGeoRotation *rotAdd = new TGeoRotation("",90,0,0);
3331 TGeoCombiTrans *trCard = new TGeoCombiTrans(-fgkLVcardX/2,fgkLVcardY/2,0,rotAdd);
3332 fCardLVR->AddNode(boxVol, 1, trCard);
3334 Double_t chip0fullThick = fgkLVChip0Z + fgkLVChip0SiZ;
3335 AliITSv11GeomCableFlat chipO("chipO", fgkLVChip0Y, chip0fullThick); // name, width, thickness
3336 chipO.SetNLayers(2);
3337 chipO.SetLayer(0, fgkLVChip0SiZ, siliconChip, 8); // index, thickness, material, color
3338 chipO.SetLayer(1, fgkLVChip0Z, plastiChip, 12);
3339 chipO.SetInitialNode( (TGeoVolume *) fCardLVL);
3340 p1[0] = (fgkLVChip0PosX - fgkLVChip0X/2);
3341 p1[1] = fgkLVChip0PosY;
3342 p1[2] = carLVfullThick/2 + chip0fullThick/2;
3344 p2[0] = (fgkLVChip0PosX + fgkLVChip0X/2);
3345 p2[1] = fgkLVChip0PosY;
3346 p2[2] = carLVfullThick/2 + chip0fullThick/2;
3347 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3348 chipO.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3349 boxVol = chipO.CreateAndInsertBoxCableSegment(1);
3350 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3352 carLVfullThick/2+chip0fullThick/2, rotAdd);
3353 fCardLVR->AddNode(boxVol, 1, trCard);
3355 // put also this chip on the other side of the card
3356 trCard = new TGeoCombiTrans( fgkLVChip0PosX,
3358 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3359 fCardLVL->AddNode(boxVol, 2, trCard);
3360 trCard = new TGeoCombiTrans( -fgkLVChip0PosX,
3362 -carLVfullThick/2-chip0fullThick/2, rotAdd);
3363 fCardLVR->AddNode(boxVol, 2, trCard);
3365 Double_t chip1fullThick = fgkLVChip1Z + fgkLVChip1SiZ;
3366 AliITSv11GeomCableFlat chip1("chip1", fgkLVChip1Y, chip1fullThick);
3367 chip1.SetNLayers(2);
3368 chip1.SetLayer(0, fgkLVChip1SiZ, siliconChip, 8);
3369 chip1.SetLayer(1, fgkLVChip1Z, plastiChip, 12);
3370 chip1.SetInitialNode( (TGeoVolume *) fCardLVL);
3371 p1[0] = (fgkLVChip1PosX-fgkLVChip1X/2);
3372 p1[1] = fgkLVChip1PosY;
3373 p1[2] = carLVfullThick/2 + chip1fullThick/2;
3375 p2[0] = (fgkLVChip1PosX+fgkLVChip1X/2);
3376 p2[1] = fgkLVChip1PosY;
3377 p2[2] = carLVfullThick/2 + chip1fullThick/2;
3378 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3379 chip1.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3380 boxVol = chip1.CreateAndInsertBoxCableSegment(1);
3381 trCard = new TGeoCombiTrans( -fgkLVChip1PosX,
3383 carLVfullThick/2 + chip1fullThick/2, rotAdd);
3384 fCardLVR->AddNode(boxVol, 1, trCard);
3386 Double_t chip2fullThick = fgkLVChip2Z + fgkLVChip2SiZ;
3387 AliITSv11GeomCableFlat chip2("chip2", fgkLVChip2Y, chip2fullThick);
3388 chip2.SetNLayers(2);
3389 chip2.SetLayer(0, fgkLVChip2SiZ, siliconChip, 8);
3390 chip2.SetLayer(1, fgkLVChip2Z, plastiChip, 12);
3391 chip2.SetInitialNode( (TGeoVolume *) fCardLVL);
3392 p1[0] = (fgkLVChip2PosX-fgkLVChip2X/2);
3393 p1[1] = fgkLVChip2PosY;
3394 p1[2] = carLVfullThick/2 + chip2fullThick/2;
3395 p2[0] = (fgkLVChip2PosX+fgkLVChip2X/2);
3396 p2[1] = fgkLVChip2PosY;
3397 p2[2] = carLVfullThick/2 + chip2fullThick/2;
3398 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3399 chip2.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3400 boxVol = chip2.CreateAndInsertBoxCableSegment(1);
3401 trCard = new TGeoCombiTrans( -fgkLVChip2PosX,
3403 carLVfullThick/2 + chip2fullThick/2, rotAdd);
3404 fCardLVR->AddNode(boxVol, 1, trCard);
3406 Double_t chip3fullThick = fgkLVChip3Z + fgkLVChip3SiZ;
3407 AliITSv11GeomCableFlat chip3("chip3", fgkLVChip3Y, chip3fullThick);
3408 chip3.SetNLayers(2);
3409 chip3.SetLayer(0, fgkLVChip3Z, plastiChip, 12);
3410 chip3.SetLayer(1, fgkLVChip3SiZ, siliconChip, 8);
3411 chip3.SetInitialNode( (TGeoVolume *) fCardLVL);
3412 p1[0] = (fgkLVChip3PosX-fgkLVChip3X/2);
3413 p1[1] = fgkLVChip3PosY;
3414 p1[2] = -carLVfullThick/2 - chip3fullThick/2;
3415 p2[0] = (fgkLVChip3PosX+fgkLVChip3X/2);
3416 p2[1] = fgkLVChip3PosY;
3417 p2[2] = -carLVfullThick/2 - chip3fullThick/2;
3418 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 0, p1, vX);
3419 chip3.AddCheckPoint( (TGeoVolume *) fCardLVL, 1, p2, vX);
3420 boxVol = chip3.CreateAndInsertBoxCableSegment(1);
3421 trCard = new TGeoCombiTrans( -fgkLVChip3PosX,
3423 -carLVfullThick/2 - chip3fullThick/2, rotAdd);
3424 fCardLVR->AddNode(boxVol, 1, trCard);
3426 // the Al pieces for heat exchange :
3427 TGeoBBox *alLVcooling1 = new TGeoBBox("alLVcooling1" ,
3428 fgkLVcoolX1/2, fgkLVcoolY1/2, fgkLVcoolZ1/2);
3430 TGeoTranslation *alLVcooling1Tr = new TGeoTranslation("alLVcooling1Tr",
3431 (fgkLVcoolX1/2+fgkLVcoolX2),
3432 fgkLVcoolPosY+fgkLVcoolY1/2,
3433 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3434 TGeoTranslation *alLVcooling1TrB = new TGeoTranslation("alLVcooling1TrB",
3435 (fgkLVcoolX1/2+fgkLVcoolX2),
3436 fgkLVcoolPosY+fgkLVcoolY1/2,
3437 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3439 TGeoVolume *vAlLVcooling1 = new TGeoVolume("vAlLVcooling1",alLVcooling1,
3441 vAlLVcooling1->SetLineColor(2);
3444 TGeoBBox * alLVcooling2 = new TGeoBBox("lLVcooling2" ,
3445 fgkLVcoolX2/2, fgkLVcoolY2/2, fgkLVcoolZ2/2);
3446 TGeoTranslation *alLVcooling2Tr = new TGeoTranslation("alLVcooling2Tr",
3448 fgkLVcoolPosY+fgkLVcoolY1/2,
3449 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3450 TGeoTranslation *alLVcooling2TrB = new TGeoTranslation("alLVcooling2TrB",
3452 fgkLVcoolPosY+fgkLVcoolY1/2,
3453 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3455 TGeoVolume *vAlLVcooling2 = new TGeoVolume("vAlLVcooling2",alLVcooling2,
3457 vAlLVcooling2->SetLineColor(2);
3460 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3462 TGeoBBox * alLVcooling3 = new TGeoBBox("lLVcooling3" ,
3463 fgkLVcoolX3/2, fgkLVcoolY3/2, alLVcoolZ3/2);
3464 TGeoTranslation *alLVcooling3Tr = new TGeoTranslation("alLVcooling3Tr",
3466 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3468 TGeoVolume *vAlLVcooling3 = new TGeoVolume("vAlLVcooling3",alLVcooling3,alCu12SDD);
3469 vAlLVcooling3->SetLineColor(2);
3471 //=== screw fixing th LV card to the U cooling tube :
3472 TGeoTube *littleScrew = new TGeoTube("littleScrewLV", 0, fgkLittleScrewR,
3474 TGeoVolume *vLittleScrew = new TGeoVolume("vLittleScrewLV",
3475 littleScrew, stainless);
3476 TGeoRotation *rotScrew = new TGeoRotation("",0,90,0);
3478 TGeoCombiTrans *cbScrew = new TGeoCombiTrans(0,0,fgkShiftLittleScrewLV,
3480 vAlLVcooling3->AddNode(vLittleScrew, 1, cbScrew);
3482 TGeoTube *littleScrewHead = new TGeoTube("littleScrewLVhead",
3483 0, fgkLittleLVScrewHeadR,
3484 fgkLittleScrewHeadH/2);
3485 TGeoVolume *vLittleScrewHead = new TGeoVolume("vLittleScrewLVhead",
3486 littleScrewHead, stainless);
3487 vLittleScrewHead->SetLineColor(kGray);
3488 TGeoCombiTrans *cbScrewHeadL = new TGeoCombiTrans( -fgkLVcoolX3/2,
3489 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3490 fgkShiftLittleScrewLV,
3492 fCardLVL->AddNode(vLittleScrewHead, 1, cbScrewHeadL);
3494 TGeoCombiTrans *cbScrewHeadR = new TGeoCombiTrans( fgkLVcoolX3/2,
3495 fgkLVcoolPosY+fgkLVcoolY1 + fgkLittleScrewHeadH/2,
3496 fgkShiftLittleScrewLV,
3498 fCardLVR->AddNode(vLittleScrewHead, 1, cbScrewHeadR);
3500 // adding the cooling pieces to the left card
3501 fCardLVL->AddNode(vAlLVcooling1, 1,alLVcooling1Tr);
3502 fCardLVL->AddNode(vAlLVcooling1, 2,alLVcooling1TrB);
3503 fCardLVL->AddNode(vAlLVcooling2, 1,alLVcooling2Tr);
3504 fCardLVL->AddNode(vAlLVcooling2, 2,alLVcooling2TrB);
3505 fCardLVL->AddNode(vAlLVcooling3, 1,alLVcooling3Tr);
3507 TGeoTranslation *alLVcooling1TrR = new TGeoTranslation("alLVcooling1TrR",
3508 -(fgkLVcoolX1/2+fgkLVcoolX2),
3509 fgkLVcoolPosY+fgkLVcoolY1/2,
3510 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2);
3511 TGeoTranslation *alLVcooling1TrBR = new TGeoTranslation("alLVcooling1TrBR",
3512 -(fgkLVcoolX1/2+fgkLVcoolX2),
3513 fgkLVcoolPosY+fgkLVcoolY1/2,
3514 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1/2));
3515 TGeoTranslation *alLVcooling2TrR = new TGeoTranslation("alLVcooling2TrR",
3517 fgkLVcoolPosY+fgkLVcoolY1/2,
3518 carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2);
3519 TGeoTranslation *alLVcooling2TrBR = new TGeoTranslation("alLVcooling2TrBR",
3521 fgkLVcoolPosY+fgkLVcoolY1/2,
3522 -(carLVfullThick/2+chip0fullThick+fgkLVcoolZ1-fgkLVcoolZ2/2));
3524 TGeoTranslation *alLVcooling3TrR = new TGeoTranslation("alLVcooling3TrR",
3526 fgkLVcoolPosY+fgkLVcoolY1-fgkLVcoolY3/2,
3528 // and to the right card
3529 fCardLVR->AddNode(vAlLVcooling1, 1,alLVcooling1TrR);
3530 fCardLVR->AddNode(vAlLVcooling1, 2,alLVcooling1TrBR);
3531 fCardLVR->AddNode(vAlLVcooling2, 1,alLVcooling2TrR);
3532 fCardLVR->AddNode(vAlLVcooling2, 2,alLVcooling2TrBR);
3533 fCardLVR->AddNode(vAlLVcooling3, 1,alLVcooling3TrR);
3538 //________________________________________________________________________
3539 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateHVCard(Int_t iLay){
3541 // return an assembly containing the HV card
3545 TGeoMedium *ceramic = GetMedium("CERAMICS$"); // ceramicHVcard
3546 TGeoMedium *medSMDcapaMiddle = GetMedium("SDD X7R capacitors$"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3547 TGeoMedium *medSMDcapaEnd = GetMedium("SDD X7R capacitors$"); // SDDX7RcapacitorsSDD TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3548 TGeoMedium *stainless = GetMedium("INOX$"); // ITSspdStainlesSteal ???????????
3549 TGeoMedium *plastic = GetMedium("SDDKAPTON (POLYCH2)$"); // ITS_ITSsddKAPTON_POLYCH2 ???????????
3550 TGeoMedium *alCu12SDD = GetMedium("INOX$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3552 TGeoVolumeAssembly *highVCard = new TGeoVolumeAssembly("ITSsddHVCard");
3554 //====================================
3555 //--- the card itself
3556 TGeoBBox *ceramicCard = new TGeoBBox("ceramCard", fgkHVCardCeramX/2,
3557 fgkHVCardCeramY/2, fgkHVCardCeramZ/2);
3558 TGeoVolume *vCeramicCard = new TGeoVolume("vCeramCard", ceramicCard, ceramic);
3559 vCeramicCard->SetLineColor(38);// or 9 blue slightly dark
3561 highVCard->AddNode(vCeramicCard, 1, 0);
3564 //====================================
3568 TGeoBBox *capa1Middle = new TGeoBBox("cardHVCapa1Middle", fgkHVCardCapa1X/2,
3569 fgkHVCardCapa1Ymid/2, fgkHVCardCapa1Z/2);
3570 TGeoVolume *vCapa1Middle = new TGeoVolume("vCardHVCapa1Middle",capa1Middle,
3573 TGeoBBox *capa1End = new TGeoBBox("cardHVCapa1End", fgkHVCardCapa1X/2,
3574 fgkHVCardCapa1Yend/2, fgkHVCardCapa1Z/2);
3575 TGeoVolume *vCapa1End = new TGeoVolume("vCardHVCapa1End",capa1End,
3577 vCapa1End->SetLineColor(18);// grey silver
3578 TGeoTranslation *capa1EndTr1 = new TGeoTranslation("cardHVcapa1EndTr1", 0,
3579 (fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3580 TGeoTranslation *capa1EndTr2 = new TGeoTranslation("cardHVcapa1EndTr2", 0,
3581 -(fgkHVCardCapa1Ymid+fgkHVCardCapa1Yend)/2,0);
3583 TGeoTranslation *capa1PosTr = new TGeoTranslation("cardHVcapa1PosTr",
3584 fgkHVCardCapa1PosX, fgkHVCardCapa1PosY,
3585 -fgkHVCardCeramZ/2-fgkHVCardCapa1Z/2);
3587 TGeoVolumeAssembly *capa1 = new TGeoVolumeAssembly("cardHVCapa1");
3588 capa1->AddNode(vCapa1Middle, 1,0);
3589 capa1->AddNode(vCapa1End, 1, capa1EndTr1);
3590 capa1->AddNode(vCapa1End, 2, capa1EndTr2);
3592 highVCard->AddNode(capa1, 1, capa1PosTr);
3595 TGeoBBox *capa2Middle = new TGeoBBox("cardHVCapa2Middle", fgkHVCardCapa2X/2,
3596 fgkHVCardCapa2Ymid/2, fgkHVCardCapa2Z/2);
3597 TGeoVolume *vCapa2Middle = new TGeoVolume("vCardHVCapa2Middle",capa2Middle,
3600 TGeoBBox *capa2End = new TGeoBBox("cardHVCapa2End", fgkHVCardCapa2X/2,
3601 fgkHVCardCapa2Yend/2, fgkHVCardCapa2Z/2);
3602 TGeoVolume *vCapa2End = new TGeoVolume("vCardHVCapa2End",capa2End,
3604 vCapa2End->SetLineColor(18);// grey silver
3605 TGeoTranslation *capa2EndTr1 = new TGeoTranslation("cardHVcapa2EndTr1", 0,
3606 (fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
3607 TGeoTranslation *capa2EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2", 0,
3608 -(fgkHVCardCapa2Ymid+fgkHVCardCapa2Yend)/2,0);
3610 TGeoTranslation *capa2PosTr = new TGeoTranslation("cardHVcapa2PosTr",
3611 fgkHVCardCapa2PosX, fgkHVCardCapa2PosY,
3612 -fgkHVCardCeramZ/2-fgkHVCardCapa2Z/2);
3614 TGeoVolumeAssembly *capa2 = new TGeoVolumeAssembly("cardHVCapa2");
3615 capa2->AddNode(vCapa2Middle, 1,0);
3616 capa2->AddNode(vCapa2End, 1, capa2EndTr1);
3617 capa2->AddNode(vCapa2End, 2, capa2EndTr2);
3619 highVCard->AddNode(capa2, 1, capa2PosTr);
3622 TGeoBBox *capa3Middle = new TGeoBBox("cardHVCapa3Middle", fgkHVCardCapa3Xmid/2,
3623 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
3624 TGeoVolume *vCapa3Middle = new TGeoVolume("vCardHVCapa3Middle",capa3Middle,
3627 TGeoBBox *capa3End = new TGeoBBox("cardHVCapa3End", fgkHVCardCapa3Xend/2,
3628 fgkHVCardCapa3Y/2, fgkHVCardCapa3Z/2);
3629 TGeoVolume *vCapa3End = new TGeoVolume("vCardHVCapa3End",capa3End,
3631 vCapa3End->SetLineColor(18);// grey silver
3633 TGeoTranslation *capa3EndTr1 = new TGeoTranslation("cardHVcapa3EndTr1",
3634 (fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
3635 TGeoTranslation *capa3EndTr2 = new TGeoTranslation("cardHVcapa2EndTr2",
3636 -(fgkHVCardCapa3Xmid+fgkHVCardCapa3Xend)/2, 0, 0);
3638 TGeoVolumeAssembly *capa3 = new TGeoVolumeAssembly("cardHVCapa3");
3639 capa3->AddNode(vCapa3Middle, 1,0);
3640 capa3->AddNode(vCapa3End, 1, capa3EndTr1);
3641 capa3->AddNode(vCapa3End, 2, capa3EndTr2);
3643 TGeoTranslation *capa3PosTr1 = new TGeoTranslation("cardHVcapa3PosTr1",
3644 fgkHVCardCapa3PosX1, fgkHVCardCapa3PosY1,
3645 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3647 TGeoTranslation *capa3PosTr2 = new TGeoTranslation("cardHVcapa3PosTr2",
3648 fgkHVCardCapa3PosX2, fgkHVCardCapa3PosY1,
3649 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3651 TGeoTranslation *capa3PosTr3 = new TGeoTranslation("cardHVcapa3PosTr3",
3652 fgkHVCardCapa3PosX3, fgkHVCardCapa3PosY2,
3653 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3655 TGeoTranslation *capa3PosTr4 = new TGeoTranslation("cardHVcapa3PosTr4",
3656 fgkHVCardCapa3PosX4, fgkHVCardCapa3PosY2,
3657 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3659 TGeoTranslation *capa3PosTr5 = new TGeoTranslation("cardHVcapa3PosTr5",
3660 fgkHVCardCapa3PosX5, fgkHVCardCapa3PosY3,
3661 -fgkHVCardCeramZ/2-fgkHVCardCapa3Z/2);
3663 highVCard->AddNode(capa3, 1, capa3PosTr1);
3664 highVCard->AddNode(capa3, 2, capa3PosTr2);
3665 highVCard->AddNode(capa3, 3, capa3PosTr3);
3666 highVCard->AddNode(capa3, 4, capa3PosTr4);
3667 highVCard->AddNode(capa3, 5, capa3PosTr5);
3669 //====================================
3670 //--- connexions to LV card
3672 Double_t fgkConnexLVHVdiam1 = 0.8*fgkmm;
3673 Double_t fgkConnexLVHVdiam2 = 2*fgkmm;
3674 Double_t fgkConnexLVHVlen = 6.2*fgkmm;
3675 Double_t fgkConnexLVHVx = 3*fgkmm;
3676 Double_t fgkConnexLVHVy1 = 8*fgkmm;
3677 Double_t fgkConnexLVHVdy = 2.5*fgkmm;
3679 TGeoTube *connexLVHVmetal = new TGeoTube("connexLVHVmetal",0,
3680 fgkConnexLVHVdiam1/2,fgkConnexLVHVlen/2);
3681 TGeoTube *connexLVHVplastic = new TGeoTube("connexLVHVplastic",
3682 fgkConnexLVHVdiam1/2,
3683 fgkConnexLVHVdiam2/2,
3684 fgkConnexLVHVlen/2);
3685 TGeoVolume *vConnexLVHVmetal = new TGeoVolume("ITSsddConnexLVHVmetal",
3686 connexLVHVmetal, stainless);
3687 TGeoVolume *vConnexLVHVplast = new TGeoVolume("ITSsddConnexLVHVplast",
3688 connexLVHVplastic, plastic);
3689 vConnexLVHVmetal->SetLineColor(10);// white
3690 vConnexLVHVplast->SetLineColor(12); // dark grey
3692 TGeoVolumeAssembly *connexion = new TGeoVolumeAssembly("ITSsddConnexLVHV");
3693 connexion->AddNode(vConnexLVHVmetal, 1, 0);
3694 connexion->AddNode(vConnexLVHVplast, 1, 0);
3696 TGeoTranslation *trConnexion1 = new TGeoTranslation(-fgkConnexLVHVx,fgkConnexLVHVy1,
3697 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3698 TGeoTranslation *trConnexion2 = new TGeoTranslation( fgkConnexLVHVx,fgkConnexLVHVy1,
3699 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3701 TGeoTranslation *trConnexion3 = new TGeoTranslation(-fgkConnexLVHVx,
3702 fgkConnexLVHVy1+fgkConnexLVHVdy,
3703 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3704 TGeoTranslation *trConnexion4 = new TGeoTranslation( fgkConnexLVHVx,
3705 fgkConnexLVHVy1+fgkConnexLVHVdy,
3706 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3708 TGeoTranslation *trConnexion5 = new TGeoTranslation(-fgkConnexLVHVx,
3709 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
3710 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3711 TGeoTranslation *trConnexion6 = new TGeoTranslation( fgkConnexLVHVx,
3712 fgkConnexLVHVy1+2*fgkConnexLVHVdy,
3713 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3715 TGeoTranslation *trConnexion7 = new TGeoTranslation(-fgkConnexLVHVx,
3716 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
3717 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3718 TGeoTranslation *trConnexion8 = new TGeoTranslation( fgkConnexLVHVx,
3719 fgkConnexLVHVy1+3*fgkConnexLVHVdy,
3720 -fgkHVCardCeramZ/2-fgkConnexLVHVlen/2 );
3722 highVCard->AddNode(connexion, 1, trConnexion1);
3723 highVCard->AddNode(connexion, 2, trConnexion2);
3724 highVCard->AddNode(connexion, 3, trConnexion3);
3725 highVCard->AddNode(connexion, 4, trConnexion4);
3726 highVCard->AddNode(connexion, 5, trConnexion5);
3727 highVCard->AddNode(connexion, 6, trConnexion6);
3728 highVCard->AddNode(connexion, 7, trConnexion7);
3729 highVCard->AddNode(connexion, 8, trConnexion8);
3731 //====================================
3732 //--- cooling pieces
3734 TGeoBBox *cardHVcool1 = new TGeoBBox("cardHVcool1",fgkHVCardCool1X/2,
3735 fgkHVCardCool1Y/2, fgkHVCardCool1Z/2);
3738 TGeoBBox *cardHVcool2 = new TGeoBBox("cardHVcool2",fgkHVCardCool2X/2,
3739 fgkHVCardCool2Y/2, fgkHVCardCool2Z/2);
3741 TGeoBBox *cardHVcool3 = new TGeoBBox("cardHVcool3",fgkHVCardCool3X/2,
3742 fgkHVCardCool3Y/2, fgkHVCardCool3Z/2);
3744 TGeoVolume *vCardHVcool1 = new TGeoVolume("vCardHVcool1",cardHVcool1,
3746 TGeoVolume *vCardHVcool2 = new TGeoVolume("vCardHVcool2",cardHVcool2,
3748 TGeoVolume *vCardHVcool3 = new TGeoVolume("vCardHVcool3",cardHVcool3,
3750 // This last volume contains the screw used for fixing
3751 // the card to the cooling tube ...
3752 TGeoTube *littleScrewHV = new TGeoTube("littleScrewHV", 0, fgkLittleScrewR,
3754 TGeoVolume *vLittleScrewHV = new TGeoVolume("vLittleScrewHV",
3755 littleScrewHV, stainless);
3757 TGeoRotation *rotScrewHead = new TGeoRotation("",0,90,0);
3758 vCardHVcool3->AddNode(vLittleScrewHV, 1,rotScrewHead);
3760 vCardHVcool1->SetLineColor(2); //red
3761 vCardHVcool2->SetLineColor(2); //red
3762 vCardHVcool3->SetLineColor(2); //red
3764 TGeoTranslation *cool1Tr1 = new TGeoTranslation("cardHVcool1Tr1",
3765 fgkHVCardCeramX/2-fgkHVCardCool1X/2,
3766 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
3767 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
3768 TGeoTranslation *cool1Tr2 = new TGeoTranslation("cardHVcool1Tr2",
3769 -fgkHVCardCeramX/2+fgkHVCardCool1X/2,
3770 -fgkHVCardCoolDY+fgkHVCardCool1Y/2,
3771 fgkHVCardCeramZ/2+fgkHVCardCool1Z/2);
3773 highVCard->AddNode(vCardHVcool1, 1, cool1Tr1);
3774 highVCard->AddNode(vCardHVcool1, 2, cool1Tr2);
3776 TGeoTranslation *cool2Tr1 = new TGeoTranslation("cardHVcool2Tr1",
3777 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X/2,
3778 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
3779 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
3781 TGeoTranslation *cool2Tr2 = new TGeoTranslation("cardHVcool2Tr2",
3782 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X/2,
3783 -fgkHVCardCoolDY-fgkHVCardCool2Y/2,
3784 fgkHVCardCeramZ/2+fgkHVCardCool2Z/2);
3786 highVCard->AddNode(vCardHVcool2, 1, cool2Tr1);
3787 highVCard->AddNode(vCardHVcool2, 2, cool2Tr2);
3789 TGeoTranslation *cool3Tr1 = new TGeoTranslation("cardHVcool2Tr1",
3790 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
3791 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
3792 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
3794 TGeoTranslation *cool3Tr2 = new TGeoTranslation("cardHVcool2Tr2",
3795 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
3796 -fgkHVCardCoolDY-fgkHVCardCool3Y/2,
3797 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2);
3799 highVCard->AddNode(vCardHVcool3, 1, cool3Tr1);
3800 highVCard->AddNode(vCardHVcool3, 2, cool3Tr2);
3802 //====================================
3804 TGeoCombiTrans *cbScrewHead1 = new TGeoCombiTrans("cardHVscrewHeadTr1",
3805 fgkHVCardCeramX/2-fgkHVCardCool1X+fgkHVCardCool2X+fgkHVCardCool3X/2,
3806 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
3807 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
3809 TGeoCombiTrans *cbScrewHead2 = new TGeoCombiTrans("cardHVscrewHeadTr2",
3810 -fgkHVCardCeramX/2+fgkHVCardCool1X-fgkHVCardCool2X-fgkHVCardCool3X/2,
3811 -fgkHVCardCoolDY+fgkLittleScrewHeadH/2,
3812 fgkHVCardCeramZ/2+fgkHVCardCool2Z-fgkHVCardCool3Z/2,
3815 highVCard->AddNode(fCommonVol[0], 1, cbScrewHead1);
3816 highVCard->AddNode(fCommonVol[0], 2, cbScrewHead2);
3822 //________________________________________________________________________
3823 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateEndLadderCards(Int_t iLay) {
3825 // return an assembly containing the LV, HV and Carlos cards of one ladder
3826 // and their cooling system
3829 TGeoMedium *alCu12SDD = GetMedium("AL$"); // ITSsddAlCu12 : to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3830 TGeoMedium *phynoxSDD = GetMedium("AL$"); // phynoxSDD To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3831 TGeoMedium *coolerMediumSDD = GetMedium("WATER$");
3833 TGeoVolumeAssembly *endLadderCards = new TGeoVolumeAssembly("endLadderCards");
3835 //=*********************************
3836 //--- The rounded pipe for the end ladder card coooling
3838 Double_t endLadPipeUlength = fgkEndLadPipeUlengthLay3;
3839 Double_t endLadPipeArmZ = fgkEndLadPipeArmZLay3;
3843 endLadPipeUlength = fgkEndLadPipeUlengthLay4;
3844 endLadPipeArmZ = fgkEndLadPipeArmZLay4;
3848 AliITSv11GeomCableRound endLadderPipe("endLadderPipe", fgkEndLadPipeOuterDiam/2);
3849 endLadderPipe.SetNLayers(2);
3850 endLadderPipe.SetLayer(0, fgkEndLadPipeInnerDiam/2, coolerMediumSDD, 4);
3851 endLadderPipe.SetLayer(1, (fgkEndLadPipeOuterDiam-fgkEndLadPipeInnerDiam)/2, phynoxSDD, fColorPhynox);
3853 Double_t coolUzPos = fgkEndLadPipeOuterDiam/2+2.*fgkmm; //it is the x coord of the axis
3854 // of the U colling pipe in its center
3856 Double_t coordA[3] = { fgkEndLadPipeUwidth/2, 0, endLadPipeUlength+coolUzPos};
3857 Double_t vectA[3] = {0,0,1};
3859 Double_t coordB[3] = { fgkEndLadPipeUwidth/2,0, fgkEndLadPipeRadius+coolUzPos};
3860 Double_t vectB[3] = {0,0,1};
3862 Double_t coordC[3] = { fgkEndLadPipeUwidth/2-fgkEndLadPipeRadius, 0, coolUzPos};
3863 Double_t vectC[3] = {1,0,0};
3865 Double_t coordD[3] = {-fgkEndLadPipeUwidth/2+fgkEndLadPipeRadius, 0, coolUzPos};
3866 Double_t vectD[3] = {-1,0,0};
3868 Double_t coordE[3] = {-fgkEndLadPipeUwidth/2, 0, fgkEndLadPipeRadius+coolUzPos};
3869 Double_t vectE[3] = {0,0,-1};
3871 Double_t coordF[3] = {-fgkEndLadPipeUwidth/2,0, endLadPipeUlength+coolUzPos};
3872 Double_t vectF[3] = {0,0,-1};
3874 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 0, coordA, vectA);
3875 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 1, coordB, vectB);
3876 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 2, coordC, vectC);
3877 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 3, coordD, vectD);
3878 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 4, coordE, vectE);
3879 endLadderPipe.AddCheckPoint( (TGeoVolume *) endLadderCards, 5, coordF, vectF);
3881 endLadderPipe.SetInitialNode((TGeoVolume *) endLadderCards); //Set the root node
3882 //endLadderPipe.CreateAndInsertCableSegment( 1);
3883 endLadderPipe.CreateAndInsertTubeSegment( 1);
3884 //endLadderPipe.CreateAndInsertCableSegment( 2);
3885 endLadderPipe.CreateAndInsertTorusSegment( 2);
3886 //endLadderPipe.CreateAndInsertCableSegment( 3);
3887 endLadderPipe.CreateAndInsertTubeSegment( 3);
3888 //endLadderPipe.CreateAndInsertCableSegment( 4);
3889 endLadderPipe.CreateAndInsertTorusSegment( 4);
3890 //endLadderPipe.CreateAndInsertCableSegment( 5);
3891 endLadderPipe.CreateAndInsertTubeSegment( 5);
3893 TGeoBBox *endLadPipeArmBox = new TGeoBBox("endLadPipeArmBox",fgkEndLadPipeArmX/2,
3894 fgkEndLadPipeArmY/2, endLadPipeArmZ/2);
3895 TGeoTube *endLadPipeArmTube = new TGeoTube("endLadPipeArmTube", 0,
3896 fgkEndLadPipeOuterDiam/2, endLadPipeArmZ/2);
3898 TGeoTranslation *endLadPipeArmBoxDY1 = new TGeoTranslation("endLadPipeArmBoxDY1",
3899 - fgkEndLadPipeArmBoxDX,
3900 fgkEndLadPipeArmBoxDY,0);
3901 TGeoTranslation *endLadPipeArmBoxDY2 = new TGeoTranslation("endLadPipeArmBoxDY2",
3902 fgkEndLadPipeArmBoxDX,
3903 fgkEndLadPipeArmBoxDY,0);
3904 endLadPipeArmBoxDY1->RegisterYourself();
3905 endLadPipeArmBoxDY2->RegisterYourself();
3907 if(GetDebug(3)) { // Remove compiler warning.
3908 endLadPipeArmBox->InspectShape();
3909 endLadPipeArmTube->InspectShape();
3912 TGeoCompositeShape *endLadPipeArm1 = new TGeoCompositeShape("ITSsddEndLadPipeArm1",
3913 "endLadPipeArmBox:endLadPipeArmBoxDY1"
3914 "- endLadPipeArmTube");
3915 TGeoCompositeShape *endLadPipeArm2 = new TGeoCompositeShape("ITSsddEndLadPipeArm2",
3916 "endLadPipeArmBox:endLadPipeArmBoxDY2"
3917 "- endLadPipeArmTube");
3919 TGeoVolume *vEndLadPipeArm1 = new TGeoVolume("ITSsddVolEndLadPipeArm1",
3920 endLadPipeArm1, alCu12SDD);
3921 TGeoVolume *vEndLadPipeArm2 = new TGeoVolume("ITSsddVolEndLadPipeArm2",
3922 endLadPipeArm2, alCu12SDD);
3923 vEndLadPipeArm1->SetLineColor(2);
3924 vEndLadPipeArm2->SetLineColor(2);
3926 Double_t armZ = (coolUzPos-fgkEndLadPipeOuterDiam/2+endLadPipeArmZ/2
3927 +fgkEndLadPipeArmZpos);
3929 TGeoTranslation *trEndLadPipeArm1 = new TGeoTranslation("trEndLadPipeArm1",
3930 -fgkEndLadPipeUwidth/2,0,armZ);
3931 TGeoTranslation *trEndLadPipeArm2 = new TGeoTranslation("trEndLadPipeArm2",
3932 fgkEndLadPipeUwidth/2,0,armZ);
3934 endLadderCards->AddNode(vEndLadPipeArm1, 1, trEndLadPipeArm1);
3935 endLadderCards->AddNode(vEndLadPipeArm2, 1, trEndLadPipeArm2);
3937 //=*********************************
3939 TGeoVolumeAssembly *cardLVassemblyR = fCardLVR;
3940 TGeoVolumeAssembly *cardLVassemblyL = fCardLVL;
3942 Double_t spaceBetweenCards = 0.2*fgkmm;
3944 Double_t cardLVxShift = (fgkEndLadPipeUwidth/2-fgkEndLadPipeArmX/2
3945 +fgkEndLadPipeArmBoxDX);
3946 Double_t cardLVyShift = (-fgkLVcoolPosY-fgkLVcoolY1+fgkLVcoolY3
3947 +fgkEndLadPipeArmY/2+fgkEndLadPipeArmBoxDY);
3949 Double_t alLVcoolZ3 = (fgkLVcardCuZ+fgkLVcardZ+2.*(fgkLVChip0SiZ+fgkLVChip0Z)
3952 Double_t firstLVCardZ = fgkEndLadPipeArmZpos-fgkEndLadPipeOuterDiam/2.+alLVcoolZ3/2
3953 +coolUzPos+1.25*fgkmm;
3954 // Position in z of the first LVB with respect to the start of the cooling
3955 // rectangular arm, coming (from inside of the ladder)
3956 // The cards are added one after the other
3958 for (Int_t iCard=0; iCard<nCards; iCard++) {
3960 Double_t cardLVzShift = firstLVCardZ +
3961 Double_t(iCard)*(alLVcoolZ3 + 2.*spaceBetweenCards+fgkHVCardCool3Z);
3963 TGeoTranslation *trCardLVassemblyR = new TGeoTranslation(cardLVxShift,
3964 cardLVyShift, cardLVzShift);
3965 TGeoTranslation *trCardLVassemblyL = new TGeoTranslation(-cardLVxShift,
3966 cardLVyShift, cardLVzShift);
3968 endLadderCards->AddNode(cardLVassemblyR, iCard+1, trCardLVassemblyR);
3969 endLadderCards->AddNode(cardLVassemblyL, iCard+1, trCardLVassemblyL);
3972 //=*********************************
3974 TGeoVolumeAssembly *cardHV = fCardHV;
3976 Double_t coolHVdy = (fgkHVCardCoolDY + fgkHVCardCool3Y
3977 + fgkEndLadPipeArmY/2 + fgkEndLadPipeArmBoxDY);
3979 Double_t coolHVCenterShift = (fgkHVCardCool3Z/2-fgkHVCardCool2Z
3980 -(fgkHVCardCeramZ)/2);
3982 for (Int_t iCard=0; iCard<nCards; iCard++) {
3984 Double_t fact = iCard*2.+1.;
3985 Double_t coolHVdz = (firstLVCardZ + alLVcoolZ3*fact/2 + spaceBetweenCards*fact
3986 + fgkHVCardCool3Z*fact/2. + coolHVCenterShift);
3987 TGeoTranslation *trCardHV = new TGeoTranslation(0,coolHVdy, coolHVdz);
3988 endLadderCards->AddNode(cardHV, iCard+1, trCardHV);
3991 //=*********************************
3994 TGeoVolumeAssembly *assemblySupCarlos = fCardCarlos;
3995 // TGeoRotation *carlosSupRot1 = new TGeoRotation("carlosSuppAngle",
3996 // 0, -fgkCarlosSuppAngle, 0);
3998 Double_t spaceBetweenCarlsoCards = 0.1*fgkmm;
3999 Double_t firstCarlosCardZ = (firstLVCardZ - alLVcoolZ3/2 + alLVcoolZ3*4 +
4000 fgkHVCardCool3Z*4 + spaceBetweenCards*7 + 2*fgkmm);
4001 // position in z of the first Carlos board, coming from inside of the ladder
4003 Double_t coolCarlosDy = (fgkCarlosSuppY3/2 + fgkEndLadPipeArmY/2 +
4004 fgkEndLadPipeArmBoxDY);
4006 for (Int_t iCard=0; iCard<nCards; iCard++) {
4008 Double_t carloszPos = ( firstCarlosCardZ + fgkCarlosSuppZ3/2 +
4009 iCard*(fgkCarlosSuppZ3+spaceBetweenCarlsoCards) );
4010 TGeoCombiTrans *carlosPos = new TGeoCombiTrans(0,coolCarlosDy,carloszPos,
4011 (TGeoRotation*) fCommonTr[0]);
4013 endLadderCards->AddNode(assemblySupCarlos, iCard, carlosPos);
4021 //==================================
4022 //--- test of flat cable curvature
4023 //==================================
4026 AliITSv11GeomCableFlat cable("test", 3, 0.3);
4027 cable.SetNLayers(1);
4028 cable.SetNLayers(2);
4029 cable.SetLayer(0, 0.2, coolerMediumSDD, 2);
4030 cable.SetLayer(1, 0.1, coolerMediumSDD, 3);
4031 cable.SetInitialNode(endLadderCards);
4033 Double_t p1[3], p2[3], vX[3] = {1,0,0},vY[3] = {0,5,0};
4042 cable.AddCheckPoint(endLadderCards, 0, p1, vX);
4043 cable.AddCheckPoint(endLadderCards, 1, p2, vX);
4044 cable.CreateAndInsertBoxCableSegment(1,angle);
4046 Double_t p3[3], p4[3];
4051 cable.AddCheckPoint(endLadderCards, 2, p3, vY);
4052 cable.CreateAndInsertCableCylSegment(2,angle);
4057 cable.AddCheckPoint(endLadderCards, 3, p4, vY);
4058 cable.CreateAndInsertCableSegment(3,angle);
4061 return endLadderCards;
4064 //________________________________________________________________________
4065 TGeoVolumeAssembly* AliITSv11GeometrySDD::CreateSupportRing(Int_t iLay) {
4067 // return an assembly of the support rings, attaching the ladders to the cone
4073 TGeoMedium *stainless = GetMedium("INOX$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4074 TGeoVolumeAssembly *supportRing = new TGeoVolumeAssembly("supportRing");
4077 //**********************************
4080 Double_t fgkRubyCageX = 9*fgkmm;
4081 Double_t fgkRubyCageY = 5.5*fgkmm;
4082 Double_t fgkRubyCageZ = 8*fgkmm;
4083 Double_t fgkRubyCageInternSide = 5.*fgkmm; //side of the internal square
4084 Double_t fgkRubyCageHoleDX = 2.*fgkmm;
4085 Double_t fgkRubyCageVIntern = 5.42*fgkmm;
4086 Double_t fgkRubyCageScrewHoleR = 4.5/2*fgkmm;
4087 Double_t fgkRubyCageScrewHoleY = 1.5*fgkmm;
4089 TGeoBBox *rubyCageBox = new TGeoBBox("rubyCageBox",fgkRubyCageX/2,fgkRubyCageY/2,
4092 Double_t epsilon = 1e-10; //dummy epsilon to force the gl viewer to show holes
4094 // pieces common to both square and V cages
4095 TGeoBBox *rubyCageInternBox = new TGeoBBox("rubyCageInternBox",fgkRubyCageInternSide/2,
4096 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4098 TGeoTube *screwHole = new TGeoTube("screwHole", 0, fgkRubyCageScrewHoleR,
4099 fgkRubyCageHoleDX/2+epsilon);
4101 TGeoRotation *rotV = new TGeoRotation("", 90,90,-90);
4102 TGeoCombiTrans *trScrewHole = new TGeoCombiTrans("trScrewHole",
4103 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4104 -fgkRubyCageY/2+fgkRubyCageScrewHoleY,0,rotV);
4105 trScrewHole->RegisterYourself();
4107 TGeoBBox *screwHoleFoot = new TGeoBBox("screwHoleFoot",fgkRubyCageHoleDX/2+epsilon,
4108 fgkRubyCageScrewHoleY/2+epsilon, fgkRubyCageScrewHoleR);
4109 TGeoTranslation *trScrewHoleFoot = new TGeoTranslation("trScrewHoleFoot",
4110 fgkRubyCageX/2-fgkRubyCageHoleDX/2,
4111 -fgkRubyCageY/2+fgkRubyCageScrewHoleY/2, 0);
4112 trScrewHoleFoot->RegisterYourself();
4115 // pieces which differ
4116 Double_t rubyCageVInternBoxX = fgkRubyCageVIntern - fgkRubyCageInternSide/2;
4118 TGeoBBox *rubyCageVInternBox = new TGeoBBox("rubyCageVInternBox",rubyCageVInternBoxX/2,
4119 fgkRubyCageY/2+epsilon, fgkRubyCageInternSide/2);
4121 TGeoTranslation *trRubyCageVInternBox = new TGeoTranslation("trRubyCageVInternB",
4122 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX/2,0,0);
4123 trRubyCageVInternBox->RegisterYourself();
4125 TGeoTrd1 *rubyCageVInternTriangl = new TGeoTrd1("rubyCageVInternTriangl", 0,
4126 fgkRubyCageInternSide/2, fgkRubyCageY/2+epsilon,
4127 fgkRubyCageInternSide/4);
4129 TGeoCombiTrans *trRubyCageVInternTriangl = new TGeoCombiTrans("trRubyCageVInternTriangl",
4130 fgkRubyCageX/2-fgkRubyCageHoleDX-rubyCageVInternBoxX-fgkRubyCageInternSide/4
4131 +epsilon,0,0, rotV );
4132 trRubyCageVInternTriangl->RegisterYourself();
4135 TGeoCompositeShape *rubyCageSquare = new TGeoCompositeShape("rubyCageSquare",
4136 "rubyCageBox-(rubyCageInternBox"
4137 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4139 TGeoVolume *vRubyCageSquare = new TGeoVolume("vRubyCageSquare",
4140 rubyCageSquare, stainless);
4141 vRubyCageSquare->SetLineColor(10);
4143 TGeoCompositeShape *rubyCageV = new TGeoCompositeShape("rubyCageV",
4144 "rubyCageBox-(rubyCageVInternBox:trRubyCageVInternB"
4145 "+rubyCageVInternTriangl:trRubyCageVInternTriangl"
4146 "+screwHole:trScrewHole+screwHoleFoot:trScrewHoleFoot)");
4147 TGeoVolume *vRubyCageV = new TGeoVolume("vRubyCageV", rubyCageV, stainless);
4148 vRubyCageV->SetLineColor(10);
4150 if(GetDebug(3)) { // Remove compiler warning.
4151 rubyCageBox->InspectShape();
4152 rubyCageInternBox->InspectShape();
4153 screwHole->InspectShape();
4154 screwHoleFoot->InspectShape();
4155 rubyCageVInternBox->InspectShape();
4156 rubyCageVInternTriangl->InspectShape();
4159 supportRing->AddNode(vRubyCageSquare, 0, 0);
4160 //supportRing->AddNode(vRubyCageV, 0, 0);
4166 //________________________________________________________________________
4167 void AliITSv11GeometrySDD::CreateSDDsensor() {
4169 // return a box containing the SDD sensor
4172 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4173 TGeoMedium *siliconSDD = GetMedium("SDD SI insensitive$"); // ITSsddSi
4174 TGeoMedium *siliconSDDsens = GetMedium("SI$"); // ITSsddSi
4175 TGeoMedium *alSDD = GetMedium("AL$"); // ITSal
4176 TGeoMedium *polyhamideSDD = GetMedium("SDDKAPTON (POLYCH2)$"); // ITSsddKAPTON_POLYCH2
4177 TGeoMedium *glassSDD = GetMedium("SDD SI insensitive$"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4180 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
4181 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
4182 // width : in the beam direction !
4184 Double_t sensoxBoxLength = ( fgkWaferLength +
4185 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
4186 // Makes life easier to include the space for the WA HV cable on both sides
4187 Double_t sensoxBoxThick = fgkWaferThickness +
4188 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4190 // cout << "fgkWaferLength=" << fgkWaferLength << " sensoxBoxLength="<< sensoxBoxLength <<endl;
4191 // cout << "fgkWaferThickness=" << fgkWaferThickness << " sensoxBoxThick=" << sensoxBoxThick << endl;
4193 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
4194 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
4196 fSDDsensor3 = new TGeoVolume("ITSsddSensor3", box, airSDD);
4197 fSDDsensor4 = new TGeoVolume("ITSsddSensor4", box, airSDD);
4200 //****************************
4202 //****************************
4204 // we need 2 different sensor objects, because they have to have different names
4205 // This is required for the step manager
4207 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
4208 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
4211 TGeoVolume *wafer3 = new TGeoVolume("ITSsddWafer3", waferShape, siliconSDD);
4212 wafer3->SetLineColor(fColorSilicon);
4213 TGeoBBox *sensBox3 = new TGeoBBox("ITSsddSensorSensBox3",
4214 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4215 TGeoVolume *sensVol3 = new TGeoVolume(fgSDDsensitiveVolName3,sensBox3, siliconSDDsens);
4216 sensVol3->SetLineColor(fColorSilicon+5);
4217 wafer3->AddNode(sensVol3, 1, 0);
4218 fSDDsensor3->AddNode(wafer3, 1, 0);
4220 TGeoVolume *wafer4 = new TGeoVolume("ITSsddWafer4", waferShape, siliconSDD);
4221 wafer4->SetLineColor(fColorSilicon);
4222 TGeoBBox *sensBox4 = new TGeoBBox("ITSsddSensorSensBox4",
4223 fgkWaferWidthSens/2, fgkWaferThickSens/2, fgkWaferLengthSens/2);
4224 TGeoVolume *sensVol4 = new TGeoVolume(fgSDDsensitiveVolName4,sensBox4, siliconSDDsens);
4225 sensVol4->SetLineColor(fColorSilicon+5);
4226 wafer4->AddNode(sensVol4, 1, 0);
4227 fSDDsensor4->AddNode(wafer4, 1, 0);
4230 //****************************
4232 //****************************
4233 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
4234 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
4235 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
4236 vGlass->SetLineColor(fColorGlass);
4237 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
4238 fgkWaferThickness/2+fgkSensorGlassLY/2,
4239 fgkGlassDZOnSensor);
4240 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4241 fgkWaferThickness/2+fgkSensorGlassLY/2,
4242 fgkGlassDZOnSensor);
4243 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
4244 fgkWaferThickness/2+fgkSensorGlassLY/2,
4245 -fgkGlassDZOnSensor);
4246 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
4247 fgkWaferThickness/2+fgkSensorGlassLY/2,
4248 -fgkGlassDZOnSensor);
4249 fSDDsensor3->AddNode(vGlass, 1, glassTr1);
4250 fSDDsensor3->AddNode(vGlass, 2, glassTr2);
4251 fSDDsensor3->AddNode(vGlass, 3, glassTr3);
4252 fSDDsensor3->AddNode(vGlass, 4, glassTr4);
4254 fSDDsensor4->AddNode(vGlass, 1, glassTr1);
4255 fSDDsensor4->AddNode(vGlass, 2, glassTr2);
4256 fSDDsensor4->AddNode(vGlass, 3, glassTr3);
4257 fSDDsensor4->AddNode(vGlass, 4, glassTr4);
4259 //****************************
4260 // Wrap-around cable
4261 //****************************
4263 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
4264 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
4265 waHVCable.SetNLayers(2);
4266 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
4267 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4268 waHVCable.SetInitialNode(fSDDsensor3);
4270 Double_t x1[3], x2[3], vX[3] = {1,0,0};
4271 x1[0] = -fgkWaHVcableLength/2;
4273 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
4275 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
4278 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4279 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4280 TGeoCombiTrans *ctSegment = 0;
4281 TGeoVolume* segment = waHVCable.CreateAndInsertBoxCableSegment(1,-90, &ctSegment);
4282 fSDDsensor4->AddNode(segment, 1, ctSegment);
4286 waHVCable.SetName("ITSsddWaHVCableD");
4287 waHVCable.ResetPoints();
4288 waHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4289 waHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4290 segment = waHVCable.CreateAndInsertBoxCableSegment(1, 90, &ctSegment);
4291 fSDDsensor4->AddNode(segment, 1, ctSegment);
4293 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
4295 waHVCableFold.SetPhi(180,360);
4296 waHVCableFold.SetNLayers(2);
4297 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
4298 polyhamideSDD, fColorPolyhamide);
4299 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
4300 waHVCableFold.SetInitialNode(fSDDsensor3);
4303 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
4305 waHVCableFold.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4306 waHVCableFold.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4307 segment = waHVCableFold.CreateAndInsertCableSegment(1, &ctSegment);
4308 fSDDsensor4->AddNode(segment, 1, ctSegment);
4311 //****************************
4313 //****************************
4314 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
4315 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
4316 /(2.*fgkTransitHVHeadLZ);
4317 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
4318 headRadius-fgkTransitHVHeadLZ)
4321 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
4322 fgkTransitHVPolyThick/2,
4324 headPoly->SetName("headPoly");
4325 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
4326 -fgkTransitHVPolyThick/2);
4327 headPolyTr->SetName("headPolyTr");
4328 headPolyTr->RegisterYourself();
4330 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
4331 fgkTransitHVAlThick/2,
4333 headAl->SetName("headAl");
4334 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
4335 -fgkTransitHVPolyThick
4336 -fgkTransitHVAlThick/2);
4337 headAlTr->SetName("headAlTr");
4338 headAlTr->RegisterYourself();
4340 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
4341 (headRadius-fgkTransitHVHeadLZ)/2,
4342 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
4343 cache->SetName("cache");
4345 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
4346 (headRadius-fgkTransitHVHeadLZ)/2,
4347 -(fgkTransitHVPolyThick
4348 +fgkTransitHVAlThick)/2);
4349 headCacheTr->SetName("cacheTr");
4350 headCacheTr->RegisterYourself();
4352 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
4353 "headPoly:headPolyTr-cache:cacheTr");
4354 TGeoVolume *vHeadPolyComp = new TGeoVolume(
4355 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
4356 vHeadPolyComp->SetLineColor(fColorPolyhamide);
4357 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
4358 "headAl:headAlTr-cache:cacheTr");
4359 TGeoVolume *vHeadAlComp = new TGeoVolume(
4360 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
4361 vHeadAlComp->SetLineColor(fColorAl);
4364 // TGeoRotation rotHead("",0,90,0);
4365 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
4366 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
4368 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
4369 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
4370 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
4373 fSDDsensor3->AddNode(vHeadPolyComp,1,rotHeadTr);
4374 fSDDsensor3->AddNode(vHeadAlComp,1,rotHeadTr);
4375 fSDDsensor4->AddNode(vHeadPolyComp,1,rotHeadTr);
4376 fSDDsensor4->AddNode(vHeadAlComp,1,rotHeadTr);
4379 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
4380 fgkTransitHVBondingLZ,
4381 fgkTransitHVPolyThick+fgkTransitHVAlThick);
4382 transitHVCable.SetNLayers(2);
4383 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
4385 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
4386 transitHVCable.SetInitialNode(fSDDsensor3);
4388 x1[0] = -fgkTransitHVHeadLX/2;
4390 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
4394 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vX);
4395 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vX);
4396 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,-90,&ctSegment);
4397 fSDDsensor4->AddNode(segment, 1, ctSegment);
4399 transitHVCable.ResetPoints();
4400 transitHVCable.SetName("ITSsddHVtransitTail");
4401 transitHVCable.SetWidth(fgkTransitHVtailWidth);
4402 x1[0] = fgkTransitHVtailXpos;
4403 x2[0] = fgkTransitHVtailXpos;
4404 x1[2] = -fgkTransitHVBondingLZ/2;
4405 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
4406 Double_t vZ[3] = {0,0,1};
4407 transitHVCable.AddCheckPoint(fSDDsensor3, 0, x1, vZ);
4408 transitHVCable.AddCheckPoint(fSDDsensor3, 1, x2, vZ);
4409 segment = transitHVCable.CreateAndInsertBoxCableSegment(1,0, &ctSegment);
4410 fSDDsensor4->AddNode(segment, 1, ctSegment);
4413 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
4414 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4415 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4416 fgkTransitHVsideLZ);
4417 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4418 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
4419 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4420 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4421 fgkTransitHVsideLZ);
4422 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4423 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
4425 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
4426 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4427 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4428 fgkTransitHVsideLZ);
4429 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4430 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
4431 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
4432 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
4433 fgkTransitHVsideLZ);
4434 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
4435 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
4437 // sideRight is not there actually
4438 // TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
4439 // sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
4440 // sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
4441 // fgkTransitHVsideLZ);
4442 // sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
4443 // sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
4444 // sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
4445 // sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
4446 // fgkTransitHVsideLZ);
4447 // sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
4448 // sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
4450 // TGeoRotation rotSide("",0,-90,0);
4451 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
4452 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4453 // -fgkTransitHVBondingLZ/2,&rotSide);
4454 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
4455 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4456 // -fgkTransitHVBondingLZ/2, &rotSide);
4457 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
4458 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
4459 // -fgkTransitHVBondingLZ/2, &rotSide);
4460 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
4461 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
4462 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4463 // -fgkTransitHVBondingLZ/2,rotSide);
4464 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
4465 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
4466 -fgkTransitHVBondingLZ/2, rotSide);
4467 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
4468 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
4469 -fgkTransitHVBondingLZ/2, rotSide);
4471 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
4472 sideLeft,polyhamideSDD);
4473 vSideLeft->SetLineColor(fColorPolyhamide);
4474 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
4476 vSideLeftAl->SetLineColor(fColorAl);
4478 // TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
4479 // sideRight,polyhamideSDD);
4480 // vSideRight->SetLineColor(fColorPolyhamide);
4482 fSDDsensor3->AddNode(vSideLeft, 1, sideLeftTr);
4483 fSDDsensor3->AddNode(vSideLeftAl, 1, sideLeftAlTr);
4484 // fSDDsensor3->AddNode(vSideRight, 1, sideRightTr);
4486 fSDDsensor4->AddNode(vSideLeft, 1, sideLeftTr);
4487 fSDDsensor4->AddNode(vSideLeftAl, 1, sideLeftAlTr);
4488 // fSDDsensor4->AddNode(vSideRight, 1, sideRightTr);
4491 //****************************
4493 fSDDsensor3->CheckOverlaps(0.01);
4494 fSDDsensor4->CheckOverlaps(0.01);
4497 fSDDsensor3->SetVisibility(kFALSE);
4498 fSDDsensor4->SetVisibility(kFALSE);
4502 //________________________________________________________________________
4503 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
4505 // return a box volume containing the detectors
4508 TGeoMedium *airSDD = GetMedium("SDD AIR$");
4510 Int_t nDetectors = fgkLay3Ndet;
4511 Double_t ladderLength = fgkLay3LadderLength;
4512 Double_t *sensorZPos = fLay3sensorZPos;
4516 nDetectors = fgkLay4Ndet;
4517 ladderLength = fgkLay4LadderLength;
4518 sensorZPos = fLay4sensorZPos;
4520 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
4524 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
4525 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
4527 sprintf(name,"ITSsddDetBox%i",iLay);
4528 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
4529 ladderLength*((nDetectors-0.5)/nDetectors)/2);
4530 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
4532 for (Int_t i=0; i<nDetectors; i++) {
4533 Double_t localZ = sensorZPos[i];
4534 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
4535 if (iLay==3) if (i%2!=0) localY = -localY;
4536 if (iLay==4) if (i%2==0) localY = -localY;
4537 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
4539 if (i >= nDetectors/2) {
4540 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
4541 sensorPos->SetName(name);
4542 virtualDet->AddNode(fSDDsensor, i, sensorPos);
4545 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
4546 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
4548 sensorPos->SetName(name);
4549 virtualDet->AddNode(fSDDsensor, i, sensorPos);
4553 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
4554 virtualDet->SetVisibility(kFALSE);
4559 //________________________________________________________________________
4560 TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssembly(Int_t iLay) {
4562 // return a box volume containing the detectors
4565 Int_t nDetectors = fgkLay3Ndet;
4566 Double_t ladderLength = fgkLay3LadderLength;
4567 Double_t *sensorZPos = fLay3sensorZPos;
4568 TGeoVolume *sensorSDD = fSDDsensor3;
4572 nDetectors = fgkLay4Ndet;
4573 ladderLength = fgkLay4LadderLength;
4574 sensorZPos = fLay4sensorZPos;
4575 sensorSDD = fSDDsensor4;
4577 printf("AliITSv11GeometrySDD::CreateDetectorsAssembly: Error:Wrong layer");
4581 sprintf(name,"ITSsddDetBox%i",iLay);
4583 TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
4585 for (Int_t i=0; i<nDetectors; i++) {
4586 Double_t localZ = sensorZPos[i];
4587 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
4588 if (iLay==3) if (i%2!=0) localY = -localY;
4589 if (iLay==4) if (i%2==0) localY = -localY;
4590 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
4592 if (i >= nDetectors/2) {
4593 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
4594 sensorPos->SetName(name);
4595 virtualDet->AddNode(sensorSDD, i, sensorPos);
4598 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
4599 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
4601 sensorPos->SetName(name);
4602 virtualDet->AddNode(sensorSDD, i, sensorPos);
4606 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
4611 //________________________________________________________________________
4612 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
4615 // export the geometry in a AliITSgeom object
4620 printf("error:Try to fill null (AliITSgeom *) object");
4624 printf("error:Try to set sensor geometry while geometry is not defined\n");
4628 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
4629 fgkWaferLengthSens/2.};
4630 if(!(geom->IsShapeDefined(kSDD)))
4631 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
4634 char ladderName[30];
4635 char sensorName[30];
4636 char senstivName[30];
4637 const Int_t kNLay = 2;
4638 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
4639 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
4642 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
4644 Int_t firstSDDmod = startMod;
4645 for (Int_t iLay=0; iLay<kNLay; iLay++) {
4646 /////////////////////////////////////////
4647 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
4648 TGeoNode *layNode = fMotherVol->GetNode(layerName);
4650 if (GetDebug(1)) printf("%s\n",layNode->GetName());
4651 TGeoVolume *layVolume = layNode->GetVolume();
4652 TGeoHMatrix layMatrix(*layNode->GetMatrix());
4654 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
4655 /////////////////////////////////////////
4656 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
4657 TGeoNode *laddNode = layVolume->GetNode(ladderName);
4659 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
4660 TGeoVolume *laddVolume = laddNode->GetVolume();
4661 TGeoHMatrix laddMatrix(layMatrix);
4662 laddMatrix.Multiply(laddNode->GetMatrix());
4664 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
4665 /////////////////////////////////////////
4666 sprintf(sensorName, "ITSsddSensor_%i",iDet);
4667 TGeoNode *detNode = laddVolume->GetNode(sensorName);
4669 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
4670 TGeoVolume *detVolume = detNode->GetVolume();
4671 TGeoHMatrix detMatrix(laddMatrix);
4672 detMatrix.Multiply(detNode->GetMatrix());
4674 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
4676 TGeoVolume *wafVolume = wafNode->GetVolume();
4677 TGeoHMatrix wafMatrix(detMatrix);
4678 detMatrix.Multiply(wafNode->GetMatrix());
4679 //--------------------------------------------------------
4680 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName3,"_1");
4681 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
4683 TGeoHMatrix sensMatrix(wafMatrix);
4684 sensMatrix.Multiply(sensitivNode->GetMatrix());
4686 // Sticking to the convention for local wafer coordinate
4688 if (iDet >= kNDet[iLay]/2) {
4689 // TGeoRotation rotY("",0,180,0);
4690 TGeoRotation rotY("",-180,-180,0);
4691 sensMatrix.Multiply(&rotY);
4693 // Creating the matrix in AliITSgeom for
4694 // this sensitive volume :
4695 Double_t *trans = sensMatrix.GetTranslation();
4696 Double_t *r = sensMatrix.GetRotationMatrix();
4697 Double_t rot[10] = {r[0],r[1],r[2],
4699 r[6],r[7],r[8], 1.0};
4700 //rot[9]!=0.0 => not a unity matrix
4701 geom->CreateMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
4703 // iLadd+1, iDet+1 because ladd. and det. start at +1
4708 printf("Error (ExportSensorGeometry) %s not found !\n",
4711 printf("Error (ExportSensorGeometry) %s not found !\n",
4714 printf("Error (ExportSensorGeometry) %s not found !\n",
4718 printf("Error (ExportSensorGeometry) %s not found !\n",
4722 printf("Error (ExportSensorGeometry) %s not found !\n",
4726 return (startMod-firstSDDmod);
4730 //________________________________________________________________________
4731 Int_t AliITSv11GeometrySDD::
4732 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
4734 // Function which gives the layer, ladder and det.
4735 // index of the current volume. To be used in
4736 // AliITS::StepManager()
4739 if (gGeoManager->GetLevel()<3) return kFALSE;
4740 // Get the det index :
4741 TGeoNode *node = gGeoManager->GetMother(2);
4742 if (!node) return kFALSE;
4743 det = node->GetNumber()+1;
4745 // Get the ladder index :
4746 node = gGeoManager->GetMother(3);
4747 if (!node) return kFALSE;
4748 ladd = node->GetNumber()+1;
4750 // Get the layer index :
4751 if (node->GetNdaughters()==fgkLay3Ndet)
4752 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!