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