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