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