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