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