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