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