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