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