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