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