1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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. *
14 **************************************************************************/
17 //*************************************************************************
18 // SDD geometry, based on ROOT geometrical modeler
20 // Ludovic Gaudichet gaudichet@to.infn.it
21 //*************************************************************************
25 // General Root includes
26 //#include <Riostream.h>
29 // Root Geometry includes
30 #include <TGeoManager.h>
31 #include <TGeoVolume.h>
35 #include <TGeoCompositeShape.h>
36 #include <TGeoMatrix.h>
39 #include "AliITSgeom.h"
40 #include "AliITSgeomSDD.h"
41 #include "AliITSv11GeometrySDD.h"
42 #include "AliITSv11GeomCableFlat.h"
43 #include "AliITSv11GeomCableRound.h"
46 const char* AliITSv11GeometrySDD::fgSDDsensitiveVolName = "ITSsddSensitiv";
47 const Double_t AliITSv11GeometrySDD::fgkSegmentLength = 37.2*2*fgkmm;
48 const Double_t AliITSv11GeometrySDD::fgkLadderWidth = 50.0*fgkmm;
49 const Double_t AliITSv11GeometrySDD::fgkLadderHeight = 30.0*fgkmm;
50 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDW = 3.5*fgkmm;
51 const Double_t AliITSv11GeometrySDD::fgkLadderSegBoxDH = 3.*fgkmm;
53 const Double_t AliITSv11GeometrySDD::fgkLadderBeamRadius = 0.6*fgkmm;
54 const Double_t AliITSv11GeometrySDD::fgkLadderLa = 3.*fgkmm;
55 const Double_t AliITSv11GeometrySDD::fgkLadderHa = 0.721979*fgkmm;
56 const Double_t AliITSv11GeometrySDD::fgkLadderLb = 3.7*fgkmm;
57 const Double_t AliITSv11GeometrySDD::fgkLadderHb = 0.890428*fgkmm;
58 const Double_t AliITSv11GeometrySDD::fgkLadderl = 0.25*fgkmm;
60 const Double_t AliITSv11GeometrySDD::fgkBottomBeamAngle = 56.5;
61 const Double_t AliITSv11GeometrySDD::fgkBeamSidePhi = 65;
63 const Double_t AliITSv11GeometrySDD::fgkLadWaferSep = 2*fgkmm;
64 const Double_t AliITSv11GeometrySDD::fgkPinSuppWidth = 2.5*fgkmm;
65 const Double_t AliITSv11GeometrySDD::fgkPinSuppHeight = 2.*fgkmm;
66 const Double_t AliITSv11GeometrySDD::fgkPinSuppRmax = 2.5/2.*fgkmm;
67 const Double_t AliITSv11GeometrySDD::fgkPinR = 1.5/2.*fgkmm;
68 const Double_t AliITSv11GeometrySDD::fgkPinSuppLength = 5.*fgkmm;
69 const Double_t AliITSv11GeometrySDD::fgkPinSuppThickness = 0.5*fgkmm;
70 const Double_t AliITSv11GeometrySDD::fgkPinSuppConeAngle = 4;
71 const Double_t AliITSv11GeometrySDD::fgkPinDXminOnSensor = (39./2.)*fgkmm;
72 const Double_t AliITSv11GeometrySDD::fgkPinPinDDXOnSensor = 3*fgkmm;
73 const Double_t AliITSv11GeometrySDD::fgkPinDYOnSensor = (52.5/2.)*fgkmm;
75 // parameters from ALR-0752/3
76 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHeight = 3.2*fgkmm;
77 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppMaxLength = 14*fgkmm;
78 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthExt = 0.4*fgkmm;
79 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppWidthIn = 0.65*fgkmm;
80 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppHoleDiam = 2*fgkmm;
81 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppFulWidth = 5.15*fgkmm;
82 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppTongW = 0.8*fgkmm;
83 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAngle = 22.5;
84 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppSlitL = 4.9*fgkmm;
85 const Double_t AliITSv11GeometrySDD::fgkCoolPipeSuppAxeDist = 3.05*fgkmm;
86 const Double_t AliITSv11GeometrySDD::fgkCoolPipeInnerDiam = 1.84*fgkmm;
87 const Double_t AliITSv11GeometrySDD::fgkCoolPipeOuterDiam = 2.*fgkmm;
89 const Double_t AliITSv11GeometrySDD::fgkBTBthick = 0.25 *fgkmm;
90 const Double_t AliITSv11GeometrySDD::fgkBTBlength = 55. *fgkmm;
91 const Double_t AliITSv11GeometrySDD::fgkBTBwidth = 18*fgkmm;
92 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBottom = 4*fgkmm;
93 const Double_t AliITSv11GeometrySDD::fgkBTBaxisAtoBase = 1.2*fgkmm;
94 const Double_t AliITSv11GeometrySDD::fgkRadiusAminBTB = 1. *fgkmm;
95 const Double_t AliITSv11GeometrySDD::fgkRadiusBminBTB = 0.53 *fgkmm;
96 const Double_t AliITSv11GeometrySDD::fgkBTBHoleLength = 15 *fgkmm;
97 const Double_t AliITSv11GeometrySDD::fgkBTBHolewidth = 6 *fgkmm;
98 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefX = 10 *fgkmm;
99 const Double_t AliITSv11GeometrySDD::fgkBTBHoleRefY = 6.5 *fgkmm;
101 const Double_t AliITSv11GeometrySDD::fgkLay3Rmin = 145.*fgkmm; // not min! Rmin virtual tube
102 const Double_t AliITSv11GeometrySDD::fgkLay3Rmax = 205.*fgkmm; // not min! Rmax virtual tube
103 const Double_t AliITSv11GeometrySDD::fgkLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
104 const Double_t AliITSv11GeometrySDD::fgkLay3LadderLength = 524.*fgkmm;
105 const Double_t AliITSv11GeometrySDD::fgkLay3DetShortRadius = 146.0*fgkmm;
106 const Double_t AliITSv11GeometrySDD::fgkLay3DetLongRadius = 152.0*fgkmm;
107 const Double_t AliITSv11GeometrySDD::fgkLay3LaddTopCornerEnd = 15.6*fgkmm;
108 const Int_t AliITSv11GeometrySDD::fgkLay3Ndet = 6;
109 const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
110 const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
112 const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 220.*fgkmm; // not min! Rmin virtual tube
113 const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 290.*fgkmm; // not min! Rmax virtual tube
114 const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
115 const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
116 const Double_t AliITSv11GeometrySDD::fgkLay4DetShortRadius = 235.0*fgkmm;
117 const Double_t AliITSv11GeometrySDD::fgkLay4DetLongRadius = 240.5*fgkmm;
118 const Double_t AliITSv11GeometrySDD::fgkLay4LaddTopCornerEnd = 15.6*fgkmm;
119 const Int_t AliITSv11GeometrySDD::fgkLay4Ndet = 8;
120 const Int_t AliITSv11GeometrySDD::fgkLay4Nladd = 22;
121 const Double_t AliITSv11GeometrySDD::fgkLay4CoolPipeSuppH = 7.5*fgkmm;
124 const Double_t AliITSv11GeometrySDD::fgkHybridAngle = 46; // approx !!!
125 // Origine taken at the hybrid corner :
126 const Double_t AliITSv11GeometrySDD::fgkHybridLength = 65*fgkmm;
127 const Double_t AliITSv11GeometrySDD::fgkHybridWidth = 41*fgkmm;
128 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleRad = 1.05*fgkmm;
129 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleZ = 2.5*fgkmm;
130 const Double_t AliITSv11GeometrySDD::fgkHybRndHoleX = fgkHybridWidth-23.599*fgkmm;
132 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleDZ = 9.698*fgkmm;
133 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHolePasDX = 10.754*fgkmm;
134 const Double_t AliITSv11GeometrySDD::fgkHybFLlowHoleAmbDX = 9.122*fgkmm;
135 // center of ships to the border
136 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ4 = fgkHybridLength-(4.654 )*fgkmm-fgkHybFLlowHoleDZ/2;
137 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ3 = fgkHybridLength-(4.654+15. )*fgkmm-fgkHybFLlowHoleDZ/2;
138 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ2 = fgkHybridLength-(4.654+15.*2)*fgkmm-fgkHybFLlowHoleDZ/2;
139 const Double_t AliITSv11GeometrySDD::fgkHybFLlowChipZ1 = fgkHybridLength-(4.654+15.*3)*fgkmm-fgkHybFLlowHoleDZ/2;
140 const Double_t AliITSv11GeometrySDD::fgkHybFLlowPasX = fgkHybridWidth-32.775*fgkmm;
141 const Double_t AliITSv11GeometrySDD::fgkHybFLlowAmbX = fgkHybridWidth-20.791*fgkmm;
142 const Double_t AliITSv11GeometrySDD::fgkHybChipsDZ = 9.221*fgkmm;
143 const Double_t AliITSv11GeometrySDD::fgkHybPascalDX = 10.245*fgkmm;
144 const Double_t AliITSv11GeometrySDD::fgkHybAmbraDX = 8.51*fgkmm;
145 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperWidth = 15.012*fgkmm;
146 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperLength = 59.878*fgkmm;
147 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAlDZ = 11.183*fgkmm;
148 const Double_t AliITSv11GeometrySDD::fgkHybFLUpperAldx = 2.307*fgkmm;
150 const Double_t AliITSv11GeometrySDD::fgkmu = 1*fgkmicron; // 1*fgkmicron; // can be increase for checking thin objects
151 const Double_t AliITSv11GeometrySDD::fgkHybridThBridgeThick = 0.25*fgkmm; // ???
152 const Double_t AliITSv11GeometrySDD::fgkHybAlThick = 30*fgkmu;
153 const Double_t AliITSv11GeometrySDD::fgkHybUpThick = 20*fgkmu;
154 const Double_t AliITSv11GeometrySDD::fgkHybGlueScrnThick = 50*fgkmu; // ??? ?????
155 const Double_t AliITSv11GeometrySDD::fgkHybGlueLowThick = 90*fgkmu;
156 const Double_t AliITSv11GeometrySDD::fgkHybGlueUpThick = 90*fgkmu; // sur ?????
157 const Double_t AliITSv11GeometrySDD::fgkHybAlCCThick = 12*fgkmu;
158 const Double_t AliITSv11GeometrySDD::fgkHybUpCCThick = 12*fgkmu;
159 const Double_t AliITSv11GeometrySDD::fgkHybChipThick = 150*fgkmu;
160 const Double_t AliITSv11GeometrySDD::fgkHybGlueAgThick = 50*fgkmu; // ??? ????
161 const Double_t AliITSv11GeometrySDD::fgkHybUnderNiThick = 20*fgkmu; // ??? ????
162 const Int_t AliITSv11GeometrySDD::fgkNHybSMD = 25;
163 const Double_t AliITSv11GeometrySDD::fgkHybSMDposX[fgkNHybSMD] =
164 {2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,21.40*fgkmm,
165 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
166 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,17.09*fgkmm,21.40*fgkmm,
167 2.92*fgkmm,6.5*fgkmm,10.13*fgkmm,13.59*fgkmm,19.91*fgkmm,
168 1.63*fgkmm,5.22*fgkmm,13.59*fgkmm,21.40*fgkmm};
169 const Double_t AliITSv11GeometrySDD::fgkHybSMDposZ[fgkNHybSMD] =
170 { 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm, 2.3 *fgkmm,
171 17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,17.315*fgkmm,
172 32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,32.31*fgkmm,
173 47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,47.38*fgkmm,
174 62.68*fgkmm,62.06*fgkmm,62.06*fgkmm,62.06*fgkmm};
175 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleW = 0.954*fgkmm;
176 const Double_t AliITSv11GeometrySDD::fgkHybSMDmiddleL = 0.47 *fgkmm;
177 const Double_t AliITSv11GeometrySDD::fgkHybSMDendW = 1.132*fgkmm;
178 const Double_t AliITSv11GeometrySDD::fgkHybSMDendL = 0.925*fgkmm;
179 const Double_t AliITSv11GeometrySDD::fgkHybSMDheight = 400.*fgkmu; // ??? ????!!!!!!!
181 const Double_t AliITSv11GeometrySDD::fgkWaferThickness = 300.*fgkmu;
182 const Double_t AliITSv11GeometrySDD::fgkWaferWidth = 72.5 *fgkmm;
183 const Double_t AliITSv11GeometrySDD::fgkWaferLength = 87.6 *fgkmm;
184 const Double_t AliITSv11GeometrySDD::fgkWaferThickSens = 299.8*fgkmu;
185 const Double_t AliITSv11GeometrySDD::fgkWaferWidthSens = 70.17*fgkmm;
186 const Double_t AliITSv11GeometrySDD::fgkWaferLengthSens = 74.97*fgkmm;
188 const Double_t AliITSv11GeometrySDD::fgkDigitCablWidth = 18.4*fgkmm;
189 const Double_t AliITSv11GeometrySDD::fgkDigitCablAlThick = (30+30*8./10.)*fgkmicron; // will probably change
190 const Double_t AliITSv11GeometrySDD::fgkDigitCablPolyThick = (20+12)*fgkmicron; // will probably change
192 const Double_t AliITSv11GeometrySDD::fgkWaHVcableAlThick = 30*2./10.*fgkmu; // will probably change // Al ratio is random !!!
193 const Double_t AliITSv11GeometrySDD::fgkWaHVcablePolyThick = 175*fgkmu; // will probably change
194 const Double_t AliITSv11GeometrySDD::fgkWaHVcableLength = 67.08*fgkmm;
195 const Double_t AliITSv11GeometrySDD::fgkWaHVcableWitdh = 17.4 *fgkmm; // check !!!
196 const Double_t AliITSv11GeometrySDD::fgkWaHVcableDW = 13.*fgkmm; //5.24*fgkmm; // check !!!
198 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLX = 5. *fgkmm;
199 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLZ = 5. *fgkmm;
200 const Double_t AliITSv11GeometrySDD::fgkSensorGlassLY = 150. *fgkmu;
201 const Double_t AliITSv11GeometrySDD::fgkGlassDXOnSensor = 26.28*fgkmm; // check !!!
202 const Double_t AliITSv11GeometrySDD::fgkGlassDZOnSensor = 22.50*fgkmm; // check !!!
204 const Double_t AliITSv11GeometrySDD::fgkTransitHVAlThick = 30*2./10.*fgkmu; // check // will probably change //Al ratio is random
205 const Double_t AliITSv11GeometrySDD::fgkTransitHVPolyThick = 100*fgkmu; // check // will probably change
206 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLX = 71.46*fgkmm; // check !!!
207 const Double_t AliITSv11GeometrySDD::fgkTransitHVHeadLZ = 21.3*fgkmm;
208 const Double_t AliITSv11GeometrySDD::fgkTransitHVBondingLZ = 3.6*fgkmm;
209 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailLength = 27*fgkmm; // ???, not yet fixed ...
210 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailWidth = 26*fgkmm;
211 const Double_t AliITSv11GeometrySDD::fgkTransitHVtailXpos = 8*fgkmm; // ???, a mesurer !!!
212 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLZ = 10.34*fgkmm;
213 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideLeftZ = 4.11*fgkmm;
214 const Double_t AliITSv11GeometrySDD::fgkTransitHVsideRightZ = 3.5*fgkmm; // ???, a mesurer !!!
216 const Double_t AliITSv11GeometrySDD::fgkLongHVcablePolyThick= (20+30+125+30+20+30+125+30+20)*fgkmu; // check // will probably change
217 const Double_t AliITSv11GeometrySDD::fgkLongHVcableAlThick = (30+30*2/10+30)*fgkmu; // check // will probably change
218 const Double_t AliITSv11GeometrySDD::fgkLongHVcableSeparation = 600*fgkmicron;
221 ClassImp(AliITSv11GeometrySDD)
223 //________________________________________________________________________
224 AliITSv11GeometrySDD::AliITSv11GeometrySDD():
225 AliITSv11Geometry(), fMotherVol(0), fAddHybrids(kTRUE), fAddSensors(kTRUE),
226 fAddHVcables(kTRUE), fAddCables(kTRUE), fAddCoolingSyst(kTRUE),
228 fAddOnlyLadder3min(-1), fAddOnlyLadder3max(-1),
229 fAddOnlyLadder4min(-1), fAddOnlyLadder4max(-1)
232 // Standard constructor
234 fDigitCableLay3A = 0;
235 fDigitCableLay3B = 0;
236 fDigitCableLay4A = 0;
237 fDigitCableLay4B = 0;
241 //________________________________________________________________________
242 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug) :
243 AliITSv11Geometry(debug),fMotherVol(0),fAddHybrids(kTRUE),fAddSensors(kTRUE),
244 fAddHVcables(kTRUE), fAddCables(kTRUE), fAddCoolingSyst(kTRUE),
246 fAddOnlyLadder3min(-1), fAddOnlyLadder3max(-1),
247 fAddOnlyLadder4min(-1), fAddOnlyLadder4max(-1)
250 // Constructor setting debugging level
252 fDigitCableLay3A = 0;
253 fDigitCableLay3B = 0;
254 fDigitCableLay4A = 0;
255 fDigitCableLay4B = 0;
259 //________________________________________________________________________
260 AliITSv11GeometrySDD::AliITSv11GeometrySDD(const AliITSv11GeometrySDD &s) :
261 AliITSv11Geometry(s.GetDebug()),fMotherVol(s.fMotherVol),
262 fAddHybrids(s.fAddHybrids),fAddSensors(s.fAddSensors),
263 fAddHVcables(s.fAddHVcables), fAddCables(s.fAddCables),
264 fAddCoolingSyst(s.fAddCoolingSyst),fCoolingOn(s.fCoolingOn),
265 fAddOnlyLadder3min(s.fAddOnlyLadder3min),fAddOnlyLadder3max(s.fAddOnlyLadder3max),
266 fAddOnlyLadder4min(s.fAddOnlyLadder4min), fAddOnlyLadder4max(s.fAddOnlyLadder4max)
269 fDigitCableLay3A = 0;
270 fDigitCableLay3B = 0;
271 fDigitCableLay4A = 0;
272 fDigitCableLay4B = 0;
276 //________________________________________________________________________
277 AliITSv11GeometrySDD& AliITSv11GeometrySDD::
278 operator=(const AliITSv11GeometrySDD &s) {
279 // Assignment operator
280 if(&s == this) return *this;
281 fMotherVol = s.fMotherVol;
282 fAddHybrids = s.fAddHybrids;
283 fAddSensors = s.fAddSensors;
284 fAddHVcables = s.fAddHVcables;
285 fAddCables = s.fAddCables;
286 fAddCoolingSyst = s.fAddCoolingSyst;
287 fCoolingOn = s.fCoolingOn;
288 fAddOnlyLadder3min = s.fAddOnlyLadder3min;
289 fAddOnlyLadder3max = s.fAddOnlyLadder3max;
290 fAddOnlyLadder4min = s.fAddOnlyLadder4min;
291 fAddOnlyLadder4max = s.fAddOnlyLadder4max;
295 //________________________________________________________________________
296 AliITSv11GeometrySDD::~AliITSv11GeometrySDD() {
297 // Look like a destructor
298 // Smell like a destructor
299 // And actually is the destructor
300 if (fDigitCableLay3A) delete [] fDigitCableLay3A;
301 if (fDigitCableLay3B) delete [] fDigitCableLay3B;
302 if (fDigitCableLay4A) delete [] fDigitCableLay4A;
303 if (fDigitCableLay4B) delete [] fDigitCableLay4B;
306 //________________________________________________________________________
307 void AliITSv11GeometrySDD::SetParameters() {
309 // Define display colors and the non constant geometry parameters
312 fColorCarbonFiber = 4;
317 fColorPolyhamide = 5;
323 fCoolPipeSupportL = 0;
324 fCoolPipeSupportR = 0;
326 fBaseThermalBridge= 0;
329 Double_t detLadderDist = 8*fgkmm;
331 fLay3LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
332 fLay4LadderUnderSegDH = detLadderDist - (fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
334 // radius from the center to the CF ladder :
335 fLay3LaddShortRadius = (fgkLay3DetShortRadius
336 + fgkLadWaferSep+2*fgkWaferThickness
338 fLay3LaddLongRadius = (fgkLay3DetLongRadius
339 + fgkLadWaferSep+2*fgkWaferThickness
341 fLay4LaddShortRadius = (fgkLay4DetShortRadius
342 + fgkLadWaferSep+2*fgkWaferThickness
344 fLay4LaddLongRadius = (fgkLay4DetLongRadius
345 + fgkLadWaferSep+2*fgkWaferThickness
348 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
349 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
350 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
351 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
352 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
353 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
355 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
356 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
357 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
358 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
359 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
360 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
361 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
362 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
366 //________________________________________________________________________
367 TGeoMedium* AliITSv11GeometrySDD::GetMedium(const char* mediumName) {
369 // Called to get a medium, checks that it exists.
370 // If not, prints an error and returns 0
374 sprintf(ch, "ITS_%s",mediumName);
375 TGeoMedium* medium = gGeoManager->GetMedium(ch);
377 printf("Error(AliITSv11GeometrySDD)::medium %s not found !\n", mediumName);
382 //________________________________________________________________________
383 Int_t AliITSv11GeometrySDD::GetLay3NLadders() const{
384 // Get the actual number of ladder in layer 3
385 if ( (fAddOnlyLadder3min<0) ||
386 (fAddOnlyLadder3min >= fgkLay3Nladd) ||
387 (fAddOnlyLadder3max<0) ||
388 (fAddOnlyLadder3max >= fgkLay3Nladd) )
390 else return (fAddOnlyLadder3max-fAddOnlyLadder3min+1);
394 //________________________________________________________________________
395 Int_t AliITSv11GeometrySDD::GetLay4NLadders() const{
396 // Get the actual number of ladder in layer 4
397 if ( (fAddOnlyLadder4min<0) ||
398 (fAddOnlyLadder4min >= fgkLay4Nladd) ||
399 (fAddOnlyLadder4max<0) ||
400 (fAddOnlyLadder4max >= fgkLay4Nladd) )
402 else return (fAddOnlyLadder4max-fAddOnlyLadder4min+1);
406 //________________________________________________________________________
407 void AliITSv11GeometrySDD::CreateBasicObjects() {
409 // Create basics objets which will be assembled together
410 // in Layer3 and Layer4 functions
414 fDigitCableLay3A = new AliITSv11GeomCableFlat[fgkLay3Ndet];
415 fDigitCableLay3B = new AliITSv11GeomCableFlat[fgkLay3Ndet];
416 fDigitCableLay4A = new AliITSv11GeomCableFlat[fgkLay4Ndet];
417 fDigitCableLay4B = new AliITSv11GeomCableFlat[fgkLay4Ndet];
419 fPinSupport = CreatePinSupport();
420 fCoolPipeSupportL = CreateCoolPipeSupportL();
421 fCoolPipeSupportR = CreateCoolPipeSupportR();
422 fSDDsensor = CreateSDDsensor();
423 fBaseThermalBridge = CreateBaseThermalBridge();
424 fHybrid = CreateHybrid(0);
427 TGeoMedium *carbonFiberLadderStruct = GetMedium("ITSsddCarbonM55J");
428 TGeoMedium *polyhamideSDD = GetMedium("ITSsddKAPTON_POLYCH2");
429 TGeoMedium *alSDD = GetMedium("ITSal");
431 //********************************************************************
432 // pieces of the carbon fiber structure
433 //********************************************************************
434 Double_t dy = fgkLadderSegBoxDH/2;
435 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
436 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
437 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
438 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
439 Double_t dYTranslation = (fgkLadderHeight/2.
440 -0.5*fgkLadderWidth*TMath::Tan(beta)
441 -fgkLadderBeamRadius);
442 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
444 //--- the top V of the Carbon Fiber Ladder (segment)
445 TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
446 -1, fgkLadderLa, fgkLadderHa, fgkLadderl);
447 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
448 cfLaddTop1,carbonFiberLadderStruct);
449 TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
450 1, fgkLadderLa, fgkLadderHa, fgkLadderl);
451 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
452 cfLaddTop2, carbonFiberLadderStruct);
453 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
454 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
455 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
458 TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
459 fgkLadderLb, fgkLadderHb, fgkLadderl);
460 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
461 cfLaddSide1,carbonFiberLadderStruct);
462 TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
463 fgkLadderLb, fgkLadderHb, fgkLadderl);
464 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
465 cfLaddSide2,carbonFiberLadderStruct);
466 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
467 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
468 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
469 alpha*TMath::RadToDeg());
470 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation-dy, 0);
471 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
472 -alpha*TMath::RadToDeg());
473 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation-dy, 0);
476 // Beams on the sides
477 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
478 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
479 //cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
480 Double_t beamLength = TMath::Sqrt( fgkLadderHeight*fgkLadderHeight/
481 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
482 + fgkLadderWidth*fgkLadderWidth/4.)-fgkLadderLa/2-fgkLadderLb/2;
483 TGeoTubeSeg *sideBeamS = new TGeoTubeSeg(0, fgkLadderBeamRadius,beamLength/2.,
485 TGeoVolume *sideBeam = new TGeoVolume("ITSsddCFSideBeamVol", sideBeamS,
486 carbonFiberLadderStruct);
487 sideBeam->SetLineColor(fColorCarbonFiber);
489 //Euler rotation : about Z, then new X, then new Z
490 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
491 -beamPhiPrime*TMath::RadToDeg(),-90);
492 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
493 beamPhiPrime*TMath::RadToDeg(), -90);
494 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
495 beamPhiPrime*TMath::RadToDeg(), -90);
496 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
497 -beamPhiPrime*TMath::RadToDeg(),-90);
499 TGeoCombiTrans *beamTransf[8];
500 beamTransf[0] = new TGeoCombiTrans( 0.5*triangleHeight*
501 TMath::Tan(halfTheta),
502 fgkLadderBeamRadius/2. - dy,
503 -3*fgkSegmentLength/8, beamRot1);
504 beamTransf[1] = new TGeoCombiTrans(*beamTransf[0]);
505 AddTranslationToCombiTrans(beamTransf[1], 0, 0, fgkSegmentLength/2);
507 beamTransf[2] = new TGeoCombiTrans(0.5*triangleHeight*
508 TMath::Tan(halfTheta),
509 fgkLadderBeamRadius/2. - dy,
510 -fgkSegmentLength/8, beamRot2);
511 beamTransf[3] = new TGeoCombiTrans(*beamTransf[2]);
512 AddTranslationToCombiTrans(beamTransf[3], 0, 0, fgkSegmentLength/2);
514 beamTransf[4] = new TGeoCombiTrans(-0.5*triangleHeight*
515 TMath::Tan(halfTheta),
516 fgkLadderBeamRadius/2. - dy,
517 -3*fgkSegmentLength/8, beamRot3);
518 beamTransf[5] = new TGeoCombiTrans(*beamTransf[4]);
519 AddTranslationToCombiTrans(beamTransf[5], 0, 0, fgkSegmentLength/2);
521 beamTransf[6] = new TGeoCombiTrans(-0.5*triangleHeight*
522 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy, -fgkSegmentLength/8,beamRot4);
523 beamTransf[7] = new TGeoCombiTrans(-0.5*triangleHeight*
524 TMath::Tan(halfTheta),fgkLadderBeamRadius/2.-dy,3*fgkSegmentLength/8,beamRot4);
526 //--- Beams of the bottom
527 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
528 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
529 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
530 bottomBeam1, carbonFiberLadderStruct);
531 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
532 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
533 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
534 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
535 bottomBeam2, carbonFiberLadderStruct);
536 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
537 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
538 0.5*fgkLadderWidth/SinD(fgkBottomBeamAngle)
539 - fgkLadderLb/3, 0, 180);
540 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
541 bottomBeam3, carbonFiberLadderStruct);
542 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
543 //bottomBeam3Vol->SetLineColor(2);
544 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
545 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
547 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans
548 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,0, bottomBeamRot1);
549 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
550 -(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,
551 -fgkSegmentLength/2, bottomBeamRot1);
552 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
553 -(fgkLadderHeight/2 - fgkLadderBeamRadius)
554 - dy, fgkSegmentLength/2, bottomBeamRot2);
555 // be careful for beams #3: when "reading" from -z to +z and
556 // from the bottom of the ladder, it should draw a Lambda, and not a V
557 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fgkBottomBeamAngle, -90);
558 TGeoRotation *bottomBeamRot5 = new TGeoRotation("" ,-90,-fgkBottomBeamAngle, -90);
559 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans
560 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,-fgkSegmentLength/4,bottomBeamRot4);
561 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans
562 (0,-(fgkLadderHeight/2-fgkLadderBeamRadius)-dy,fgkSegmentLength/4, bottomBeamRot5);
564 fLaddSegCommonVol[0] = cfLaddTopVol1; fLaddSegCommonTr[0] = trTop1;
565 fLaddSegCommonVol[1] = cfLaddTopVol2; fLaddSegCommonTr[1] = trTop1;
566 fLaddSegCommonVol[2] = cfLaddSideVol1; fLaddSegCommonTr[2] = ctSideR;
567 fLaddSegCommonVol[3] = cfLaddSideVol1; fLaddSegCommonTr[3] = ctSideL;
568 fLaddSegCommonVol[4] = cfLaddSideVol2; fLaddSegCommonTr[4] = ctSideR;
569 fLaddSegCommonVol[5] = cfLaddSideVol2; fLaddSegCommonTr[5] = ctSideL;
570 fLaddSegCommonVol[6] = sideBeam; fLaddSegCommonTr[6] = beamTransf[0];
571 fLaddSegCommonVol[7] = sideBeam; fLaddSegCommonTr[7] = beamTransf[1];
572 fLaddSegCommonVol[8] = sideBeam; fLaddSegCommonTr[8] = beamTransf[2];
573 fLaddSegCommonVol[9] = sideBeam; fLaddSegCommonTr[9] = beamTransf[3];
574 fLaddSegCommonVol[10]= sideBeam; fLaddSegCommonTr[10]= beamTransf[4];
575 fLaddSegCommonVol[11]= sideBeam; fLaddSegCommonTr[11]= beamTransf[5];
576 fLaddSegCommonVol[12]= sideBeam; fLaddSegCommonTr[12]= beamTransf[6];
577 fLaddSegCommonVol[13]= sideBeam; fLaddSegCommonTr[13]= beamTransf[7];
578 fLaddSegCommonVol[14]= bottomBeam1Vol; fLaddSegCommonTr[14]= bottomBeamTransf1;
579 fLaddSegCommonVol[15]= bottomBeam2Vol; fLaddSegCommonTr[15]= bottomBeamTransf2;
580 fLaddSegCommonVol[16]= bottomBeam2Vol; fLaddSegCommonTr[16]= bottomBeamTransf3;
581 fLaddSegCommonVol[17]= bottomBeam3Vol; fLaddSegCommonTr[17]= bottomBeamTransf4;
582 fLaddSegCommonVol[18]= bottomBeam3Vol; fLaddSegCommonTr[18]= bottomBeamTransf5;
585 //********************************************************************
587 //********************************************************************
589 for (Int_t i=0; i<fgkLay3Ndet; i++) {
590 sprintf(cableName, "digitCableLay3A_%i",i);
591 fDigitCableLay3A[i].SetName(cableName);
592 fDigitCableLay3A[i].SetWidth(fgkDigitCablWidth);
593 fDigitCableLay3A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
594 fDigitCableLay3A[i].SetNLayers(2);
595 fDigitCableLay3A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
597 fDigitCableLay3A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
598 sprintf(cableName, "digitCableLay3B_%i",i);
599 fDigitCableLay3B[i].SetName(cableName);
600 fDigitCableLay3B[i].SetWidth(fgkDigitCablWidth);
601 fDigitCableLay3B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
602 fDigitCableLay3B[i].SetNLayers(2);
603 fDigitCableLay3B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
605 fDigitCableLay3B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
607 for (Int_t i=0; i<fgkLay4Ndet; i++) {
608 sprintf(cableName, "digitCableLay4A_%i",i);
609 fDigitCableLay4A[i].SetName(cableName);
610 fDigitCableLay4A[i].SetWidth(fgkDigitCablWidth);
611 fDigitCableLay4A[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
612 fDigitCableLay4A[i].SetNLayers(2);
613 fDigitCableLay4A[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
615 fDigitCableLay4A[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
616 sprintf(cableName, "digitCableLay4B_%i",i);
617 fDigitCableLay4B[i].SetName(cableName);
618 fDigitCableLay4B[i].SetWidth(fgkDigitCablWidth);
619 fDigitCableLay4B[i].SetThickness(fgkDigitCablPolyThick+fgkDigitCablAlThick);
620 fDigitCableLay4B[i].SetNLayers(2);
621 fDigitCableLay4B[i].SetLayer( 0, fgkDigitCablPolyThick, polyhamideSDD,
623 fDigitCableLay4B[i].SetLayer(1, fgkDigitCablAlThick, alSDD, fColorAl);
625 // Well, those digit cables could also include the analog cables
626 // which have the same width and the same path, at least in the ladder.
627 // It will gain some computing ressources (less volumes) and some
628 // coding efforts ... !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
629 // The only thing to do is to change the names and put the correct total
634 //________________________________________________________________________
635 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
637 // a debugging function for checking some possible overlaps
639 if (fSDDsensor) fSDDsensor->CheckOverlaps(precision);
640 if (fHybrid) fHybrid->CheckOverlaps(precision);
644 //________________________________________________________________________
645 TGeoCombiTrans *AliITSv11GeometrySDD::
646 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi) {
648 // return the TGeoCombiTrans which make a translation in y and z
649 // and a rotation in phi in the global coord system
652 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
653 TGeoRotation r1("",0.,0.,dphi);
655 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
656 combiTrans1->SetTranslation(t1);
657 combiTrans1->SetRotation(r1);
662 //________________________________________________________________________
663 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
667 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
668 const Double_t *vect = ct->GetTranslation();
669 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
670 ct->SetTranslation(newVect);
674 //________________________________________________________________________
675 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
676 // for code developpment and debugging purposes
678 if (! fSDDsensor) CreateBasicObjects();
680 // moth->AddNode(fPinSupport, 1, 0);
681 // moth->AddNode(fCoolPipeSupportL, 1, 0);
682 moth->AddNode(fSDDsensor, 1, 0);
683 // moth->AddNode(fBaseThermalBridge, 1, 0);
684 // moth->AddNode(fHybrid,100,0);
687 // TGeoVolume* seg = CreateLadderSegment( 3, 0);
688 // moth->AddNode(seg, 1, 0);
691 // TGeoVolume *lay3Ladder = CreateLadder(3);
692 // moth->AddNode(lay3Ladder, 1, 0);
694 // TGeoVolume *lay3Detectors = CreateDetectors(3);
695 // moth->AddNode(lay3Detectors, 1, 0);
700 //________________________________________________________________________
701 void AliITSv11GeometrySDD::Layer3(TGeoVolume *moth) {
703 // Insert the layer 3 in the mother volume. This is a virtual volume
704 // containing ladders of layer 3 and the supporting rings
708 printf("Error::AliITSv11GeometrySDD: Can't insert layer3, mother is null!\n");
712 TGeoMedium *airSDD = GetMedium("ITSair");
715 if (! fSDDsensor) CreateBasicObjects();
717 TGeoVolume *lay3Ladder = CreateLadder(3);
718 TGeoVolume *lay3Detectors = CreateDetectors(3);
719 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
720 fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
721 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
722 virtualLayer3Shape, airSDD);
724 Double_t dPhi = 360./fgkLay3Nladd;
725 Double_t detectorsThick = fgkLadWaferSep + 2*fgkWaferThickness;
726 // Placing virtual ladder and detectors volumes following
727 // ladder ordering convention
730 Int_t iLaddMax = fgkLay3Nladd;
731 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fgkLay3Nladd)) {
732 iLaddMin = fAddOnlyLadder3min;
733 iLaddMax = fAddOnlyLadder3max+1;
736 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
738 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
739 Double_t minRadiusLadBox = fLay3LaddShortRadius-fLay3LadderUnderSegDH;
741 minRadiusLadBox = fLay3LaddLongRadius-fLay3LadderUnderSegDH;
742 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
743 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
745 virtualLayer3->AddNode(lay3Ladder, iLadd, ctLadd);
746 ///////////////////////////////////////////////////
747 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
748 Double_t minRadiusDetBox = fgkLay3DetShortRadius;
749 if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
750 minRadiusDetBox += detectorsThick/2;
751 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
753 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
754 ///////////////////////////////////////////////////
757 if(GetDebug(1)) virtualLayer3->CheckOverlaps(0.01);
758 virtualLayer3->SetVisibility(kFALSE);
759 moth->AddNode(virtualLayer3, 1, 0);
763 //________________________________________________________________________
764 void AliITSv11GeometrySDD::Layer4(TGeoVolume *moth) {
766 // Insert the layer 4 in the mother volume. This is a virtual volume
767 // containing ladders of layer 4 and the supporting rings
771 printf("Error::AliITSv11GeometrySDD: Can't insert layer4, mother is null!\n");
777 if (! fSDDsensor) CreateBasicObjects();
779 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
780 fgkLay4Rmin,fgkLay4Rmax,fgkLay4Length*0.5);
781 TGeoMedium *airSDD = GetMedium("ITSair");
782 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
783 virtualLayer4Shape, airSDD);
784 TGeoVolume *lay4Ladder = CreateLadder(4);
785 TGeoVolume *lay4Detectors = CreateDetectors(4);
786 Double_t dPhi = 360./fgkLay4Nladd;
787 Double_t detBoxThickness = fgkLadWaferSep + 2*fgkWaferThickness;
788 // placing virtual ladder and detectors volumes following ladder
789 // ordering convention
792 Int_t iLaddMax = fgkLay4Nladd;
793 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fgkLay4Nladd)) {
794 iLaddMin = fAddOnlyLadder4min;
795 iLaddMax = fAddOnlyLadder4max+1;
797 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
798 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
799 Double_t minRadiusLadBox = fLay4LaddShortRadius-fLay4LadderUnderSegDH;
801 minRadiusLadBox = fLay4LaddLongRadius-fLay4LadderUnderSegDH;
802 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
803 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
805 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
806 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
807 Double_t minRadiusDetBox = fgkLay4DetShortRadius;
809 minRadiusDetBox = fgkLay4DetLongRadius;
810 minRadiusDetBox += detBoxThickness/2;
811 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
813 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
816 if(GetDebug(1)) virtualLayer4->CheckOverlaps(0.01);
817 virtualLayer4->SetVisibility(kFALSE);
818 moth->AddNode(virtualLayer4,1,0);
822 //________________________________________________________________________
823 TGeoVolume *AliITSv11GeometrySDD::CreateLadder(Int_t iLay) {
825 // return a box volume containing the CF ladder
828 Int_t nDetectors = fgkLay3Ndet;
829 Double_t ladderLength = fgkLay3LadderLength;
830 Double_t underSegDH = fLay3LadderUnderSegDH;
831 Double_t *sensorZPos = fLay3sensorZPos;
832 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
833 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
837 nDetectors = fgkLay4Ndet;
838 ladderLength = fgkLay4LadderLength;
839 digitCableA = fDigitCableLay4A;
840 digitCableB = fDigitCableLay4B;
841 underSegDH = fLay4LadderUnderSegDH;
842 sensorZPos = fLay4sensorZPos;
845 printf("AliITSv11GeometrySDD::CreateLadder : error=wrong layer\n");
847 Double_t ladderBoxDH = fgkLadderHeight+fgkLadderSegBoxDH+underSegDH;
848 TGeoBBox *ladBox = new TGeoBBox("ITSsddLadBox",
849 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
850 ladderBoxDH/2, ladderLength/2);
851 TGeoMedium *airSDD = GetMedium("ITSair");
852 TGeoVolume *virtualLadder = new TGeoVolume("ITSsddLadder",ladBox, airSDD);
854 // placing virtual ladder segment following detector ordering convention
855 //=======================================================================
858 // adding segment this way to create cable points in the correct order ...
859 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
861 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
862 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
863 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
864 + fgkSegmentLength/2;
865 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
866 underSegDH/2,segmentPos);
868 virtualLadder->AddNode(laddSegment, iSegment, segTr);
870 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
872 TGeoVolume *laddSegment = CreateLadderSegment(iLay, iSegment);
873 sprintf(transName, "ITSsddLay%iLaddSeg%i", iLay, iSegment);
874 Double_t segmentPos = fgkSegmentLength*(nDetectors/2-1-iSegment)
875 + fgkSegmentLength/2;
876 TGeoTranslation *segTr = new TGeoTranslation(transName, 0,
877 underSegDH/2,segmentPos);
879 virtualLadder->AddNode(laddSegment, iSegment, segTr);
882 // putting virtual volume corresponding to the end of ladder
883 //=======================================================================
884 TGeoVolume *endLadder = CreateEndLadder( iLay );
885 Double_t endLength = (ladderLength - nDetectors*fgkSegmentLength)/2.;
886 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
887 fgkSegmentLength*(nDetectors/2)+endLength/2.);
888 // Euler rotation : about Z, then new X, then new Z
889 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
890 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
891 -fgkSegmentLength*(nDetectors/2)-endLength/2.,endZNegRot);
892 virtualLadder->AddNode(endLadder, 1, endTrZPos);
893 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
895 // creating and inserting cable segments
896 // (check points are placed while creating segments)
897 //=======================================================================
899 for (Int_t iSegment = 0; iSegment < nDetectors; iSegment++ ) {
901 digitCableA[iSegment].SetInitialNode(virtualLadder);
902 digitCableB[iSegment].SetInitialNode(virtualLadder);
904 for (Int_t iPt=1; iPt<digitCableA[iSegment].GetNCheckPoints(); iPt++ ) {
905 Double_t rotation = 0;
906 if (iPt>1) rotation = 90-fgkHybridAngle;
907 digitCableA[iSegment].CreateAndInsertCableSegment(iPt, rotation);
910 for (Int_t iPt=1; iPt<digitCableB[iSegment].GetNCheckPoints(); iPt++ ) {
911 Double_t rotation = 0;
912 if (iPt>1) rotation = fgkHybridAngle-90;
913 digitCableB[iSegment].CreateAndInsertCableSegment(iPt, rotation);
918 //=======================================================================
920 TGeoMedium *polyhamideSDD = GetMedium("ITSsddKAPTON_POLYCH2");
921 TGeoMedium *alSDD = GetMedium("ITSal");
923 AliITSv11GeomCableFlat cableHV[fgkLay4Ndet]; // temp !!!
924 char cableHVname[30];
925 for (Int_t iSegment = 0; iSegment<nDetectors; iSegment++) {
926 sprintf(cableHVname,"ITSsddHVcable%i", iSegment);
927 cableHV[iSegment].SetName(cableHVname);
928 cableHV[iSegment].SetThickness(fgkLongHVcablePolyThick+fgkLongHVcableAlThick);
929 cableHV[iSegment].SetWidth(fgkTransitHVtailWidth);
930 cableHV[iSegment].SetNLayers(2);
931 cableHV[iSegment].SetLayer(0, fgkLongHVcablePolyThick, polyhamideSDD,
933 cableHV[iSegment].SetLayer(1, fgkLongHVcableAlThick, alSDD, fColorAl);
934 cableHV[iSegment].SetInitialNode(virtualLadder);
936 Double_t x1[3], x2[3], x3[3],
937 vY[3] = {0,1,0}, vZ[3] = {0,0,1}, vYZ[3]={0,1,1};
939 x1[0] = -fgkTransitHVtailXpos;
940 x2[0] = -fgkTransitHVtailXpos;
941 x3[0] = -fgkTransitHVtailXpos;
942 for (Int_t iSegment = nDetectors/2-1; iSegment >= 0; iSegment-- ) {
943 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
944 *fgkLongHVcableSeparation;
945 x1[1] = - ladderBoxDH/2;
946 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
947 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
949 x1[2] = sensorZPos[iSegment]+fgkTransitHVtailLength-5*fgkmm;
950 x2[2] = x1[2]+5*fgkmm;
951 x3[2] = ladderLength/2-endLength;
952 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
953 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vYZ );
954 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
956 cableHV[iSegment].CreateAndInsertCableSegment(1,0);
957 cableHV[iSegment].CreateAndInsertCableSegment(2,0);
961 x1[0] = fgkTransitHVtailXpos;
962 x2[0] = fgkTransitHVtailXpos;
963 x3[0] = fgkTransitHVtailXpos;
965 for (Int_t iSegment = nDetectors/2; iSegment < nDetectors; iSegment++ ) {
966 Double_t cableSeparation = TMath::Abs(iSegment - (nDetectors/2-1))
967 *fgkLongHVcableSeparation;
968 x1[1] = - ladderBoxDH/2;
969 x2[1] = - ladderBoxDH/2 + underSegDH - cableSeparation
970 - (fgkLongHVcablePolyThick+fgkLongHVcableAlThick)/2;
972 x1[2] = sensorZPos[iSegment]-fgkTransitHVtailLength+5*fgkmm;
973 x2[2] = x1[2]-5*fgkmm;
974 x3[2] = -ladderLength/2+endLength;
975 cableHV[iSegment].AddCheckPoint( virtualLadder, 0, x1, vY );
976 cableHV[iSegment].AddCheckPoint( virtualLadder, 1, x2, vYZ );
977 cableHV[iSegment].AddCheckPoint( virtualLadder, 2, x3, vZ );
979 cableHV[iSegment].CreateAndInsertCableSegment(1,0);
980 cableHV[iSegment].CreateAndInsertCableSegment(2,0);
984 //**********************************
985 if(GetDebug(1)) virtualLadder->CheckOverlaps(0.01);
986 virtualLadder->SetVisibility(kFALSE);
987 return virtualLadder;
991 //________________________________________________________________________
992 TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
993 Double_t xSign, Double_t L, Double_t H, Double_t l) {
994 // Create one half of the V shape corner of CF ladder
996 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
997 cfLaddSide->SetVertex( 0, 0, 0);
998 cfLaddSide->SetVertex( 1, 0, -H);
999 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1000 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1001 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1002 cfLaddSide->SetVertex( 4, 0, 0);
1003 cfLaddSide->SetVertex( 5, 0, -H);
1004 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
1005 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
1006 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
1011 //________________________________________________________________________
1012 TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iLRSide) {
1014 // return a box containing the front-end hybrid
1017 Double_t roundHoleX = -fgkHybridWidth/2+fgkHybRndHoleX;
1019 Double_t screenTotalThick = fgkHybGlueScrnThick+fgkHybUpThick+fgkHybAlThick;
1020 Double_t lowFLTotalThick = fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick;
1021 // Double_t upFLTotalThick = fgkHybGlueUpThick +fgkHybUpThick+fgkHybAlThick;
1022 Double_t chipsCCTotThick = fgkHybUnderNiThick+fgkHybGlueAgThick
1023 +fgkHybChipThick+2*(fgkHybUpCCThick+fgkHybAlCCThick);
1024 Double_t ccUpLayerTotThick = fgkHybUpCCThick+fgkHybAlCCThick+fgkHybUpCCThick;
1025 // Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1026 // + upFLTotalThick + ccUpLayerTotThick);
1027 Double_t volumeThick = (fgkHybridThBridgeThick+screenTotalThick+lowFLTotalThick
1029 Double_t lowLayerYmin = -volumeThick/2+fgkHybridThBridgeThick
1031 Double_t flUpThick = fgkHybGlueUpThick+fgkHybUpThick;
1033 //**************************************************** media :
1034 TGeoMedium *airSDD = GetMedium("ITSair");
1035 TGeoMedium *carbonFiberLadderStruct = GetMedium("ITSsddCarbonM55J");
1036 TGeoMedium *alSDD = GetMedium("ITSal");
1037 TGeoMedium *alSDD80p100 = GetMedium("ITSal"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1038 TGeoMedium *alSDD50p100 = GetMedium("ITSal"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1039 TGeoMedium *polyhamideSDD = GetMedium("ITSsddKAPTON_POLYCH2");
1040 TGeoMedium *niSDD = GetMedium("COPPER"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1041 TGeoMedium *glueAG = GetMedium("ITSsddKAPTON_POLYCH2"); // to code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1042 TGeoMedium *siliconSDD = GetMedium("ITSsddSiChip");
1043 TGeoMedium *medSMD = GetMedium("SDDX7Rcapacitors"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1044 TGeoMedium *medSMDweld = GetMedium("SDDX7Rcapacitors"); // TO CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1046 //**************************************************** main volume :
1047 TGeoBBox *hybridBox = new TGeoBBox("",fgkHybridWidth/2, volumeThick/2,
1048 (fgkHybridLength)/2);
1049 TGeoVolume *hybrid = new TGeoVolume("ITSsddHybridVol", hybridBox,
1052 TGeoBBox *sThermalBridge = new TGeoBBox( "", fgkHybridWidth/2,
1053 fgkHybridThBridgeThick/2,
1056 //**************************************************** Thermal bridge :
1057 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
1059 carbonFiberLadderStruct);
1060 vThermalBridge->SetLineColor(fColorCarbonFiber);
1061 TGeoTranslation *thBridgeTr = new TGeoTranslation(0, -volumeThick/2
1062 +fgkHybridThBridgeThick/2, 0);
1063 hybrid->AddNode(vThermalBridge, 1, thBridgeTr);
1065 //**************************************************** Screen layer :
1066 TGeoBBox *sAlScreenLayer = new TGeoBBox("sAlScreenLayer", fgkHybridWidth/2,
1067 fgkHybAlThick/2, fgkHybridLength/2);
1068 //here the upedex and glue layers are both assumed to be polyimide
1069 TGeoBBox *sUpGlueScreenLayer = new TGeoBBox("sUpGlueScreenLayer",
1071 (fgkHybUpThick+fgkHybGlueScrnThick)/2,
1073 TGeoTube *sRoundHole = new TGeoTube("sRoundHole", 0, fgkHybRndHoleRad,
1074 (screenTotalThick+lowFLTotalThick)/2);
1076 TGeoTranslation *upGlueScreenTr = new TGeoTranslation("upGlueScreenTr",0,
1077 -volumeThick/2+fgkHybridThBridgeThick+(fgkHybUpThick+fgkHybGlueScrnThick)/2,0);
1079 TGeoTranslation *alScreenTr = new TGeoTranslation("AlScreenTr", 0,
1080 -volumeThick/2+fgkHybridThBridgeThick+fgkHybUpThick+fgkHybGlueScrnThick
1081 +fgkHybAlThick/2, 0);
1083 TGeoTranslation hybHolePos1Tr(roundHoleX,
1084 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
1085 -fgkHybridLength/2+fgkHybRndHoleZ);
1086 TGeoTranslation hybHolePos2Tr(roundHoleX,
1087 -volumeThick/2+fgkHybridThBridgeThick+(screenTotalThick+lowFLTotalThick)/2,
1088 fgkHybridLength/2-fgkHybRndHoleZ);
1090 TGeoRotation *rotHole = new TGeoRotation("", 0, 90, 0);
1091 TGeoCombiTrans *hybHolePos1 = new TGeoCombiTrans(hybHolePos1Tr, *rotHole);
1092 hybHolePos1->SetName("hybHolePos1");
1093 TGeoCombiTrans *hybHolePos2 = new TGeoCombiTrans(hybHolePos2Tr, *rotHole);
1094 hybHolePos2->SetName("hybHolePos2");
1096 upGlueScreenTr->RegisterYourself();
1097 alScreenTr->RegisterYourself();
1098 hybHolePos1->RegisterYourself();
1099 hybHolePos2->RegisterYourself();
1102 TGeoCompositeShape *sScreenAl = new TGeoCompositeShape(
1103 "sAlScreenLayer:AlScreenTr-(sRoundHole:hybHolePos1"
1104 "+sRoundHole:hybHolePos2)");
1105 TGeoVolume *vScreenAl = new TGeoVolume("vScreenAl",sScreenAl, alSDD);
1106 vScreenAl->SetLineColor(fColorAl);
1107 TGeoCompositeShape *sScreenUpGlue = new TGeoCompositeShape(
1108 "sUpGlueScreenLayer:upGlueScreenTr-(sRoundHole:hybHolePos1"
1109 "+sRoundHole:hybHolePos2)");
1110 TGeoVolume *vScreenUpGlue = new TGeoVolume("vScreenUpGlue",
1111 sScreenUpGlue,polyhamideSDD);
1112 vScreenUpGlue->SetLineColor(fColorPolyhamide);
1114 hybrid->AddNode(vScreenUpGlue, 1, 0);
1115 hybrid->AddNode(vScreenAl, 1, 0);
1117 //**************************************************** FL low layer :
1118 Double_t sideWidth1 = fgkHybFLlowChipZ1 - fgkHybFLlowHoleDZ/2;
1119 Double_t sideWidth2 = fgkHybridLength - fgkHybFLlowChipZ4 - fgkHybFLlowHoleDZ/2;
1121 //here the upedex and glue layers are both assumed to be polyimide
1122 TGeoBBox *sUpGlueBar1 = new TGeoBBox("sUpGlueBar1", fgkHybridWidth/2,
1123 (fgkHybGlueLowThick+fgkHybUpThick)/2,
1125 TGeoBBox *sAlBar1 = new TGeoBBox("sAlBar1", fgkHybridWidth/2,
1126 fgkHybAlThick/2, sideWidth1/2);
1128 TGeoTranslation *upGlueBarTr1 = new TGeoTranslation("upGlueBarTr1", 0,
1129 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
1130 -(fgkHybridLength-sideWidth1)/2);
1131 TGeoTranslation *alBarTr1 = new TGeoTranslation("alBarTr1", 0,
1132 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
1133 -(fgkHybridLength-sideWidth1)/2);
1134 upGlueBarTr1->RegisterYourself();
1135 alBarTr1->RegisterYourself();
1137 TGeoCompositeShape *sLowUpGlueBar1 = new TGeoCompositeShape(
1138 "sUpGlueBar1:upGlueBarTr1-sRoundHole:hybHolePos1");
1139 TGeoCompositeShape *sLowAlBar1 = new TGeoCompositeShape(
1140 "sAlBar1:alBarTr1-sRoundHole:hybHolePos1");
1141 TGeoVolume *vLowUpGlueBar1 = new TGeoVolume("vLowUpGlueBar1",
1142 sLowUpGlueBar1, polyhamideSDD);
1143 TGeoVolume *vLowAlBar1 = new TGeoVolume("vLowAlBar1",
1145 vLowUpGlueBar1->SetLineColor(fColorPolyhamide);
1146 vLowAlBar1->SetLineColor(fColorAl);
1147 hybrid->AddNode(vLowUpGlueBar1,1,0);
1148 hybrid->AddNode(vLowAlBar1,1,0);
1151 //here the upedex and glue layers are both assumed to be polyimide
1152 TGeoBBox *sUpGlueBar2 = new TGeoBBox("sUpGlueBar2", fgkHybridWidth/2,
1153 (fgkHybGlueLowThick+fgkHybUpThick)/2,
1155 TGeoBBox *sAlBar2 = new TGeoBBox("sAlBar2", fgkHybridWidth/2,
1156 fgkHybAlThick/2, sideWidth2/2);
1158 TGeoTranslation *upGlueBarTr2 = new TGeoTranslation("upGlueBarTr2", 0,
1159 lowLayerYmin+(fgkHybGlueLowThick+fgkHybUpThick)/2,
1160 (fgkHybridLength-sideWidth2)/2);
1161 TGeoTranslation *alBarTr2 = new TGeoTranslation("alBarTr2", 0,
1162 lowLayerYmin+fgkHybGlueLowThick+fgkHybUpThick+fgkHybAlThick/2,
1163 (fgkHybridLength-sideWidth2)/2);
1164 upGlueBarTr2->RegisterYourself();
1165 alBarTr2->RegisterYourself();
1167 TGeoCompositeShape *sLowUpGlueBar2 = new TGeoCompositeShape(
1168 "sUpGlueBar2:upGlueBarTr2-sRoundHole:hybHolePos2");
1169 TGeoCompositeShape *sLowAlBar2 = new TGeoCompositeShape(
1170 "sAlBar2:alBarTr2-sRoundHole:hybHolePos2");
1171 TGeoVolume *vLowUpGlueBar2 = new TGeoVolume("vLowUpGlueBar2",sLowUpGlueBar2,
1173 TGeoVolume *vLowAlBar2 = new TGeoVolume("vLowAlBar2",sLowAlBar2,
1175 vLowUpGlueBar2->SetLineColor(fColorPolyhamide);
1176 vLowAlBar2->SetLineColor(fColorAl);
1177 hybrid->AddNode(vLowUpGlueBar2, 1, 0);
1178 hybrid->AddNode(vLowAlBar2, 1, 0);
1180 if(GetDebug(3)){ // Remove compiler warning.
1181 sAlScreenLayer->InspectShape();
1182 sUpGlueScreenLayer->InspectShape();
1183 sRoundHole->InspectShape();
1184 sUpGlueBar1->InspectShape();
1185 sUpGlueBar2->InspectShape();
1186 sAlBar1->InspectShape();
1187 sAlBar2->InspectShape();
1190 //using class AliITSv11GeomCableFlat to add 2-layer segments ...
1191 Double_t piece1width = fgkHybFLlowPasX-fgkHybFLlowHolePasDX/2;
1192 AliITSv11GeomCableFlat lowFLpiece("lowFLpiece1",piece1width,
1194 lowFLpiece.SetNLayers(2);
1195 lowFLpiece.SetLayer(0, fgkHybGlueLowThick+fgkHybUpThick, polyhamideSDD,
1197 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD80p100, fColorAl);
1198 // alSDD at 80% : mostly to take into account strips of piece 3
1200 Double_t x1[3] = { -fgkHybridWidth/2 + piece1width/2,
1201 lowLayerYmin + lowFLTotalThick/2,
1202 -fgkHybridLength/2 + sideWidth1 };
1203 Double_t x2[3] ={ x1[0], x1[1], fgkHybridLength/2 - sideWidth2 };
1204 Double_t vZ[3] = {0,0,1};
1205 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
1206 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
1207 lowFLpiece.SetInitialNode(hybrid);
1208 lowFLpiece.CreateAndInsertCableSegment(1);
1209 lowFLpiece.ResetPoints();
1211 Double_t piece2width = fgkHybFLlowAmbX-fgkHybFLlowPasX
1212 -fgkHybFLlowHolePasDX/2-fgkHybFLlowHoleAmbDX/2;
1214 lowFLpiece.SetWidth(piece2width);
1215 lowFLpiece.SetName("lowFLpiece2");
1216 x1[0] = piece2width/2+fgkHybFLlowPasX+fgkHybFLlowHolePasDX/2-fgkHybridWidth/2;
1218 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
1219 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
1220 lowFLpiece.CreateAndInsertCableSegment(1);
1221 lowFLpiece.ResetPoints();
1223 Double_t piece3width = fgkHybridWidth - fgkHybFLlowAmbX
1224 - fgkHybFLlowHoleAmbDX/2;
1226 lowFLpiece.SetWidth(piece3width);
1227 lowFLpiece.SetName("lowFLpiece3");
1228 x1[0] = fgkHybridWidth/2-piece3width/2;
1230 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vZ );
1231 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vZ );
1232 lowFLpiece.CreateAndInsertCableSegment(1);
1234 Double_t zChips[4] = {fgkHybFLlowChipZ1,fgkHybFLlowChipZ2,
1235 fgkHybFLlowChipZ3,fgkHybFLlowChipZ4};
1236 Double_t vX[3] = {1,0,0};
1237 for (Int_t i=0; i<3; i++) {
1239 sprintf(ch, "lowFLpieceA%i", i+4);
1240 lowFLpiece.SetName(ch);
1241 lowFLpiece.SetWidth(zChips[i+1]-zChips[i]-fgkHybFLlowHoleDZ);
1243 lowFLpiece.SetLayer(1, fgkHybAlThick, alSDD, fColorAl);
1244 x1[0] = -fgkHybridWidth/2 + piece1width;
1245 x2[0] = x1[0] + fgkHybFLlowHolePasDX;
1246 Double_t zPiece = (zChips[i+1]+zChips[i])/2 - fgkHybridLength/2;
1247 x1[2] = zPiece; x2[2] = zPiece;
1248 lowFLpiece.AddCheckPoint( hybrid, 0, x2, vX );
1249 lowFLpiece.AddCheckPoint( hybrid, 1, x1, vX );
1250 lowFLpiece.CreateAndInsertCableSegment(1,90);
1251 lowFLpiece.ResetPoints();
1253 sprintf(ch, "lowFLpieceB%i", i+4);
1254 lowFLpiece.SetName(ch);
1255 x1[0] = fgkHybridWidth/2 - piece3width;
1256 x2[0] = x1[0] - fgkHybFLlowHoleAmbDX;
1257 lowFLpiece.AddCheckPoint( hybrid, 0, x1, vX );
1258 lowFLpiece.AddCheckPoint( hybrid, 1, x2, vX );
1259 lowFLpiece.CreateAndInsertCableSegment(1,90);
1262 //**************************************************** chips+CC:
1263 AliITSv11GeomCableFlat chip("", fgkHybChipsDZ, chipsCCTotThick);
1264 chip.SetInitialNode(hybrid);
1266 chip.SetLayer(0, fgkHybUnderNiThick, niSDD, 2);
1267 chip.SetLayer(1, fgkHybGlueAgThick, glueAG, 4);
1268 chip.SetLayer(2, fgkHybChipThick, siliconSDD, fColorSilicon);
1269 chip.SetLayer(3, fgkHybUpCCThick+fgkHybUpCCThick, polyhamideSDD,
1271 chip.SetLayer(4, fgkHybAlCCThick+fgkHybAlCCThick, alSDD80p100, fColorAl);
1272 // Here the tho CC (low+up) are merged
1273 // In fact, the last layer has a smaller surface of Al -> I put 80%
1275 x1[1] = lowLayerYmin + chipsCCTotThick/2;
1279 for (Int_t i=0; i<4; i++) {
1280 sprintf(ch, "pascalCC%i", i);
1282 x1[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
1283 x2[0] = x1[0] + fgkHybPascalDX;
1284 x1[2] = zChips[i] - fgkHybridLength/2;
1286 chip.AddCheckPoint( hybrid, 0, x1, vX );
1287 chip.AddCheckPoint( hybrid, 1, x2, vX );
1288 chip.CreateAndInsertCableSegment(1,-90);
1291 sprintf(ch, "ambraCC%i", i);
1293 x1[0] = fgkHybFLlowAmbX - fgkHybridWidth/2 - fgkHybAmbraDX/2;
1294 x2[0] = x1[0] + fgkHybAmbraDX;
1295 chip.AddCheckPoint( hybrid, 0, x1, vX );
1296 chip.AddCheckPoint( hybrid, 1, x2, vX );
1297 chip.CreateAndInsertCableSegment(1,-90);
1301 //**************************************************** CC outside chips:
1302 // je crois qu'il n'y a pas de 2ieme couche d'alu ici ...
1303 for (Int_t i = 0; i<4; i++) {
1305 sprintf(ch, "ccLayerA%i", i);
1307 AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
1308 ccLayer1.SetInitialNode(hybrid);
1309 ccLayer1.SetNLayers(2);
1310 ccLayer1.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
1311 ccLayer1.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
1314 x1[0] = -fgkHybridWidth/2;
1315 x2[0] = fgkHybFLlowPasX - fgkHybridWidth/2 - fgkHybPascalDX/2;
1316 x1[1] = lowLayerYmin + fgkHybUnderNiThick + fgkHybGlueAgThick
1317 + fgkHybChipThick + ccUpLayerTotThick/2;
1319 x1[2] = zChips[i] - fgkHybridLength/2;
1321 ccLayer1.AddCheckPoint( hybrid, 0, x1, vX );
1322 ccLayer1.AddCheckPoint( hybrid, 1, x2, vX );
1323 ccLayer1.CreateAndInsertCableSegment(1,-90);
1325 sprintf(ch, "ccLayerB%i", i);
1326 AliITSv11GeomCableFlat ccLayer2(ch, fgkHybChipsDZ, ccUpLayerTotThick);
1327 ccLayer2.SetInitialNode(hybrid);
1328 ccLayer2.SetNLayers(2);
1329 ccLayer2.SetLayer(0, 2*fgkHybUpCCThick, polyhamideSDD, fColorPolyhamide);
1330 ccLayer2.SetLayer(1, fgkHybAlCCThick, alSDD50p100, fColorAl);
1333 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowPasX + fgkHybPascalDX/2;
1334 x2[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX - fgkHybAmbraDX/2;
1335 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
1336 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
1337 ccLayer2.CreateAndInsertCableSegment(1,-90);
1338 ccLayer2.ResetPoints();
1339 sprintf(ch, "ccLayerC%i", i);
1340 ccLayer2.SetName(ch);
1341 x1[0] = -fgkHybridWidth/2 + fgkHybFLlowAmbX + fgkHybAmbraDX/2;
1342 x2[0] = fgkHybridWidth/2 - fgkHybFLUpperWidth + 3*fgkmm;
1343 x1[1] = lowLayerYmin + lowFLTotalThick + flUpThick + fgkHybAlThick
1344 + ccUpLayerTotThick/2;
1347 ccLayer2.AddCheckPoint( hybrid, 0, x1, vX );
1348 ccLayer2.AddCheckPoint( hybrid, 1, x2, vX );
1349 ccLayer2.CreateAndInsertCableSegment(1,-90);
1352 //**************************************************** FL UP:
1353 // (last Al layer will be a special triangular shape)
1354 TGeoBBox *sFLupPolyhamide = new TGeoBBox("sFLupPolyhamide",
1355 fgkHybFLUpperWidth/2, flUpThick/2,
1356 fgkHybFLUpperLength/2);
1357 TGeoVolume *vFLupPolyhamide = new TGeoVolume("vFLupPolyhamide",
1358 sFLupPolyhamide, polyhamideSDD);
1359 vFLupPolyhamide->SetLineColor(fColorPolyhamide);
1360 TGeoTranslation *trFLupPolyhamide =
1361 new TGeoTranslation(fgkHybridWidth/2-fgkHybFLUpperWidth/2,
1362 lowLayerYmin+lowFLTotalThick+flUpThick/2,0);
1364 hybrid->AddNode(vFLupPolyhamide, 1, trFLupPolyhamide);
1366 TGeoArb8 *aluStrip = new TGeoArb8(fgkHybAlThick/2);
1367 aluStrip->SetVertex( 0,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1368 aluStrip->SetVertex( 1, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1369 aluStrip->SetVertex( 2, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
1370 aluStrip->SetVertex( 3,-fgkHybFLUpperAlDZ/2, 0);
1371 aluStrip->SetVertex( 4,-fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1372 aluStrip->SetVertex( 5, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth);
1373 aluStrip->SetVertex( 6, fgkHybFLUpperAlDZ/2, fgkHybFLUpperWidth-fgkHybFLUpperAldx);
1374 aluStrip->SetVertex( 7,-fgkHybFLUpperAlDZ/2, 0);
1375 TGeoVolume *vAluStrip = new TGeoVolume("vAluStrip",aluStrip, alSDD50p100);
1378 vAluStrip->SetLineColor(fColorAl);
1379 //TGeoRotation rotAluStrip("rotAluStrip",0, -90, 90);
1380 TGeoRotation *rotAluStrip = new TGeoRotation("rotAluStrip",0, -90, 90);
1382 Double_t yRotAluStrip = lowLayerYmin+lowFLTotalThick
1383 +flUpThick+fgkHybAlThick/2;
1384 TGeoCombiTrans *aluStripTr1 = new TGeoCombiTrans(
1385 fgkHybridWidth/2,yRotAluStrip,
1386 fgkHybridLength/2-fgkHybFLlowChipZ1+1*fgkmm, rotAluStrip);
1387 TGeoCombiTrans *aluStripTr2 = new TGeoCombiTrans(*aluStripTr1);
1388 AddTranslationToCombiTrans(aluStripTr2,0,0,
1389 fgkHybFLlowChipZ1-fgkHybFLlowChipZ2);
1390 TGeoCombiTrans *aluStripTr3 = new TGeoCombiTrans(*aluStripTr2);
1391 AddTranslationToCombiTrans(aluStripTr3,0,0,
1392 fgkHybFLlowChipZ2-fgkHybFLlowChipZ3);
1393 TGeoCombiTrans *aluStripTr4 = new TGeoCombiTrans(*aluStripTr3);
1394 AddTranslationToCombiTrans(aluStripTr4,0,0,
1395 fgkHybFLlowChipZ3-fgkHybFLlowChipZ4);
1397 hybrid->AddNode(vAluStrip, 1, aluStripTr1);
1398 hybrid->AddNode(vAluStrip, 2, aluStripTr2);
1399 hybrid->AddNode(vAluStrip, 3, aluStripTr3);
1400 hybrid->AddNode(vAluStrip, 4, aluStripTr4);
1401 //**************************************************** SMD:
1402 TGeoBBox *hybSMD = new TGeoBBox("ITSsddSMDshape",
1403 fgkHybSMDmiddleL/2+fgkHybSMDendL,
1404 fgkHybSMDheight/2,fgkHybSMDendW/2);
1405 TGeoVolume *vHybSMD = new TGeoVolume("ITSsddSMD",hybSMD,airSDD);
1407 TGeoBBox *hybSMDmiddle = new TGeoBBox("ITSsddSMDmiddleShape",
1408 fgkHybSMDmiddleL/2,fgkHybSMDheight/2,
1409 fgkHybSMDmiddleW/2);
1410 TGeoVolume *vHybSMDmiddle = new TGeoVolume("ITSsddSMDmiddle",
1411 hybSMDmiddle,medSMD);
1412 vHybSMDmiddle->SetLineColor(fColorSMD);
1413 TGeoBBox *hybSMDend = new TGeoBBox("ITSsddSMDendShape",
1414 fgkHybSMDendL/2,fgkHybSMDheight/2,fgkHybSMDendW/2);
1415 TGeoVolume *vHybSMDend = new TGeoVolume("ITSsddSMDend",
1416 hybSMDend,medSMDweld);
1417 vHybSMDend->SetLineColor(fColorSMDweld);
1418 TGeoTranslation *vHybSMDendTr1 = new TGeoTranslation("",
1419 (fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
1420 TGeoTranslation *vHybSMDendTr2 = new TGeoTranslation("",
1421 -(fgkHybSMDmiddleL+fgkHybSMDendL)/2,0,0);
1422 vHybSMD->AddNode(vHybSMDmiddle,1,0);
1423 vHybSMD->AddNode(vHybSMDend,1,vHybSMDendTr1);
1424 vHybSMD->AddNode(vHybSMDend,2,vHybSMDendTr2);
1425 for (Int_t i=0; i<fgkNHybSMD; i++) {
1426 TGeoTranslation *vHybSMDtr = new TGeoTranslation("",
1427 -fgkHybridWidth/2+fgkHybSMDposX[i],
1428 lowLayerYmin+lowFLTotalThick+fgkHybSMDheight/2,
1429 -fgkHybridLength/2+fgkHybSMDposZ[i]);
1430 hybrid->AddNode(vHybSMD, i+1, vHybSMDtr);
1437 if(GetDebug(1)) hybrid->CheckOverlaps(0.01);
1438 hybrid->SetVisibility(kFALSE);
1443 //________________________________________________________________________
1444 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
1446 // Return a box volume containing a segment of a ladder.
1449 TGeoMedium *airSDD = GetMedium("ITSair");
1450 TGeoMedium *phynoxSDD = GetMedium("ITSal"); // phynoxSDD To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1451 TGeoMedium *coolerMediumSDD = GetMedium("WATER");
1453 Double_t tDY = fgkLadderSegBoxDH/2; //space left on top of the ladder
1454 Double_t segmentLength = fgkSegmentLength;
1455 Double_t spaceBetweenCables = 500*fgkmicron;
1457 //*****************************************
1458 // Set parameters according to (iLay,iSeg):
1459 //*****************************************
1460 Int_t nDetectors = fgkLay3Ndet;
1461 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
1462 Double_t sensorCenterZPos = fLay3sensorZPos[iSeg]-
1463 (fgkSegmentLength*fgkLay3Ndet/2. -
1464 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
1465 // sensorCenterZPos = z in segment local coord syst.
1467 AliITSv11GeomCableFlat *digitCableA = fDigitCableLay3A;
1468 AliITSv11GeomCableFlat *digitCableB = fDigitCableLay3B;
1471 } else if (iLay==4) {
1472 nDetectors = fgkLay4Ndet;
1473 coolPipeSuppH = fgkLay4CoolPipeSuppH;
1474 sensorCenterZPos = fLay4sensorZPos[iSeg]-
1475 (fgkSegmentLength*fgkLay4Ndet/2. -
1476 fgkSegmentLength/2-(iSeg)*fgkSegmentLength);
1477 digitCableA = fDigitCableLay4A;
1478 digitCableB = fDigitCableLay4B;
1480 printf("AliITSv11GeometrySDD::CreateLadderSegment Wrong layer index !");
1483 Double_t cableSideSign = -1;
1484 if (iSeg<nDetectors/2) cableSideSign = 1;
1485 Double_t spaceForCables = spaceBetweenCables*
1486 (nDetectors-TMath::Abs(nDetectors-2*iSeg-1)-1)/2
1488 // gives [0-1-2-2-1-0]*spaceBetweenCables
1489 // or [0-1-2-3-3-2-1-0]*spaceBetweenCables
1490 Int_t iUpdateCableMin;
1491 Int_t iUpdateCableMax;
1492 if (cableSideSign==-1) {
1493 iUpdateCableMin = nDetectors/2;
1494 iUpdateCableMax = iSeg-1;
1496 iUpdateCableMin = iSeg+1;
1497 iUpdateCableMax = nDetectors/2-1;
1501 cout << "Segment ("<< iLay <<',' << iSeg
1502 << ") : sensor z shift in local segment coord.="
1503 << sensorCenterZPos << endl;
1506 //****************************
1507 // The segment volume
1508 //****************************
1509 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
1510 fgkLadderWidth/2+fgkPinSuppWidth+fgkLadderSegBoxDW,
1511 fgkLadderHeight/2+fgkLadderSegBoxDH/2,
1514 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
1517 //******************************
1518 // Carbon fiber structure :
1519 //******************************
1521 virtualSeg->AddNode(fLaddSegCommonVol[0], 1, fLaddSegCommonTr[0]);
1522 Int_t volumeIndex = 1;
1523 for (Int_t i = 1; i<fgkNladdSegCommonVol;i++ ) {
1524 if (fLaddSegCommonVol[i]==fLaddSegCommonVol[i-1])
1528 virtualSeg->AddNode(fLaddSegCommonVol[i], volumeIndex,
1529 fLaddSegCommonTr[i]);
1532 //**********************************
1533 // Pine support of the sensors :
1534 //**********************************
1535 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
1536 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
1538 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fgkPinDYOnSensor,
1539 - fgkLadderHeight/2.-tDY
1540 + fgkPinSuppHeight/2.,
1541 sensorCenterZPos+fgkPinDXminOnSensor,rotPS1);
1542 TGeoCombiTrans *transPS2 = new TGeoCombiTrans(*transPS1);
1543 AddTranslationToCombiTrans(transPS2, 0, 0, fgkPinPinDDXOnSensor);
1544 TGeoCombiTrans *transPS3 = new TGeoCombiTrans(*transPS1);
1545 AddTranslationToCombiTrans(transPS3, 0, 0, -2*fgkPinDXminOnSensor);
1546 TGeoCombiTrans *transPS4 = new TGeoCombiTrans(*transPS3);
1547 AddTranslationToCombiTrans(transPS4, 0, 0, -fgkPinPinDDXOnSensor);
1549 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fgkPinDYOnSensor,
1550 - fgkLadderHeight/2. - tDY
1551 + fgkPinSuppHeight/2.,
1552 sensorCenterZPos+fgkPinDXminOnSensor,rotPS2);
1553 TGeoCombiTrans *transPS6 = new TGeoCombiTrans(*transPS5);
1554 AddTranslationToCombiTrans(transPS6, 0, 0, fgkPinPinDDXOnSensor);
1555 TGeoCombiTrans *transPS7 = new TGeoCombiTrans(*transPS5);
1556 AddTranslationToCombiTrans(transPS7, 0, 0, -2*fgkPinDXminOnSensor);
1557 TGeoCombiTrans *transPS8 = new TGeoCombiTrans(*transPS7);
1558 AddTranslationToCombiTrans(transPS8, 0, 0, -fgkPinPinDDXOnSensor);
1560 virtualSeg->AddNode(fPinSupport, 1, transPS1);
1561 virtualSeg->AddNode(fPinSupport, 2, transPS2);
1562 virtualSeg->AddNode(fPinSupport, 3, transPS3);
1563 virtualSeg->AddNode(fPinSupport, 4, transPS4);
1564 virtualSeg->AddNode(fPinSupport, 5, transPS5);
1565 virtualSeg->AddNode(fPinSupport, 6, transPS6);
1566 virtualSeg->AddNode(fPinSupport, 7, transPS7);
1567 virtualSeg->AddNode(fPinSupport, 8, transPS8);
1569 //******************************
1570 // Cooling pipe supports :
1571 //******************************
1572 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
1573 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
1574 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
1575 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
1577 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
1578 (triangleHeight+triangleCPaxeDist/
1579 TMath::Sin(halfTheta)-coolPipeSuppH);
1580 if (fAddCoolingSyst) {
1581 TGeoRotation *rotCPS2 = new TGeoRotation("", -halfTheta*TMath::RadToDeg(), -90, 90);
1582 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(), -90, -90);
1583 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
1584 -fgkLadderHeight/2. - tDY
1585 +coolPipeSuppH+fgkLadderBeamRadius,
1586 -segmentLength/2., rotCPS1);
1587 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(*transCPS1);
1588 AddTranslationToCombiTrans(transCPS3, 0, 0, segmentLength);
1590 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
1591 -fgkLadderHeight/2.- tDY
1592 +coolPipeSuppH+fgkLadderBeamRadius,
1593 segmentLength/2., rotCPS2);
1594 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(*transCPS2);
1595 AddTranslationToCombiTrans(transCPS4, 0, 0, -segmentLength);
1597 virtualSeg->AddNode(fCoolPipeSupportL, 1, transCPS1);
1598 virtualSeg->AddNode(fCoolPipeSupportL, 2, transCPS2);
1599 virtualSeg->AddNode(fCoolPipeSupportR, 1, transCPS3);
1600 virtualSeg->AddNode(fCoolPipeSupportR, 2, transCPS4);
1603 //************************
1605 //************************
1606 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
1607 -fgkLadderHeight/2. - tDY +
1608 fgkLadderBeamRadius+coolPipeSuppH, 0);
1609 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
1610 -fgkLadderHeight/2.- tDY +
1611 fgkLadderBeamRadius+coolPipeSuppH, 0);
1613 if (fAddCoolingSyst) {
1614 TGeoTube *coolingPipeShape = new TGeoTube( fgkCoolPipeInnerDiam/2,
1615 fgkCoolPipeOuterDiam/2,
1617 TGeoTube *coolerShape = new TGeoTube( 0, fgkCoolPipeInnerDiam/2,
1620 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
1621 coolingPipeShape, phynoxSDD );
1622 coolingPipe->SetLineColor(fColorPhynox);
1623 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
1627 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
1628 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
1630 virtualSeg->AddNode(cooler, 1, pipeTr1);
1631 virtualSeg->AddNode(cooler, 2, pipeTr2);
1635 //**********************************
1636 // Bases of hybrid thermal bridges
1637 //**********************************
1638 Double_t shiftHyb = 1.05; // shift between thermal Bridge base and thermal bridge
1639 // approx !!! not clear on 0752/14-A
1640 if (fAddCoolingSyst) {
1641 TGeoRotation *rotHybrid1 = new TGeoRotation("", 0, 0, -90 - fgkHybridAngle);
1642 TGeoRotation *rotHybrid2 = new TGeoRotation("", 0 ,180, 90 - fgkHybridAngle);
1643 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, *rotHybrid1);
1644 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, *rotHybrid2);
1646 virtualSeg->AddNode(fBaseThermalBridge, 1, baseTr1);
1647 virtualSeg->AddNode(fBaseThermalBridge, 2, baseTr2);
1650 //*************************
1652 //*************************
1653 Double_t hybDy = ((TGeoBBox*)fHybrid->GetShape())->GetDY();
1654 Double_t distAxeToHybridCenter = fgkBTBaxisAtoBase+hybDy;
1656 Double_t hybrVolX = ( distAxeToHybridCenter*CosD(fgkHybridAngle)
1657 - shiftHyb*SinD(fgkHybridAngle) );
1658 Double_t hybrVolY = ( distAxeToHybridCenter*SinD(fgkHybridAngle)
1659 + shiftHyb*CosD(fgkHybridAngle) );
1661 TGeoRotation rotHybrid3("", 0, 0, 90. - fgkHybridAngle);
1662 TGeoRotation rotHybrid4("", 0 ,180, -90. - fgkHybridAngle);
1663 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid3);
1664 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid4);
1665 AddTranslationToCombiTrans( hybTr1, -hybrVolX, hybrVolY, 0);
1666 AddTranslationToCombiTrans( hybTr2, hybrVolX, hybrVolY, 0);
1668 virtualSeg->AddNode(fHybrid, 1, hybTr1);
1669 virtualSeg->AddNode(fHybrid, 2, hybTr2);
1676 // Starting from this segment
1677 Double_t hybDz = ((TGeoBBox*)fHybrid->GetShape())->GetDZ();
1678 Double_t hybDx = ((TGeoBBox*)fHybrid->GetShape())->GetDX();
1679 Double_t posDigitCableAlongHyb = shiftHyb+ hybDx
1680 - digitCableA->GetWidth()/2;
1681 Double_t distAxeToDigitCableCenter = distAxeToHybridCenter+hybDy
1682 - digitCableA->GetThickness()/2;
1684 Double_t digitCableX = ( coolPipeSuppL
1685 + distAxeToDigitCableCenter*CosD(fgkHybridAngle)
1686 - posDigitCableAlongHyb*SinD(fgkHybridAngle) );
1687 Double_t digitCableY = ( - fgkLadderHeight/2.-TMath::Abs(tDY)
1688 + fgkLadderBeamRadius+coolPipeSuppH
1689 + distAxeToDigitCableCenter*SinD(fgkHybridAngle)
1690 + posDigitCableAlongHyb*CosD(fgkHybridAngle) );
1693 Double_t digitCableCenterA0[3]={ -cableSideSign*digitCableX,
1694 digitCableY, cableSideSign*hybDz };
1695 Double_t digitCableCenterA1[3] = {
1696 -cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
1697 digitCableY+spaceForCables*SinD(fgkHybridAngle),
1698 cableSideSign*segmentLength/2 };
1700 Double_t digitCableCenterB0[3]={ cableSideSign*digitCableX,
1701 digitCableY,cableSideSign*hybDz};
1702 Double_t digitCableCenterB1[3]={
1703 cableSideSign*(digitCableX+spaceForCables*CosD(fgkHybridAngle)),
1704 digitCableY+spaceForCables*SinD(fgkHybridAngle),
1705 cableSideSign*segmentLength/2 };
1707 Double_t vZ[3] = {0,0,1};
1708 digitCableA[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterA0, vZ);
1709 digitCableA[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterA1, vZ);
1710 digitCableB[iSeg].AddCheckPoint( virtualSeg, 0, digitCableCenterB0, vZ);
1711 digitCableB[iSeg].AddCheckPoint( virtualSeg, 1, digitCableCenterB1, vZ);
1713 // Updating the other cables
1714 for (Int_t iCable=iUpdateCableMin; iCable<=iUpdateCableMax; iCable++) {
1716 Int_t iPoint = TMath::Abs(iCable-iSeg)+1;
1718 digitCableA[iCable].GetPoint( 1, coord);
1719 digitCableA[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
1720 digitCableB[iCable].GetPoint( 1, coord);
1721 digitCableB[iCable].AddCheckPoint( virtualSeg, iPoint, coord, vZ);
1725 //**********************************
1726 if(GetDebug(1)) virtualSeg->CheckOverlaps(0.01);
1727 virtualSeg->SetVisibility(kFALSE);
1732 //________________________________________________________________________
1733 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
1735 // Create a pine support
1736 // axis of rotation is the cone axis, center in its middle
1738 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fgkPinSuppHeight/2.,
1739 0,fgkPinSuppRmax,0,fgkPinSuppRmax-
1740 fgkPinSuppHeight*TanD(fgkPinSuppConeAngle) );
1741 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fgkPinSuppRmax,
1742 fgkPinSuppLength/2.,fgkPinSuppThickness/2.);
1743 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fgkPinR,
1744 fgkPinSuppHeight/2.);
1745 if(GetDebug(3)){// Remove compiler warning.
1746 cone->InspectShape();
1747 tong->InspectShape();
1748 hole->InspectShape();
1751 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
1752 fgkPinSuppLength/2.,-fgkPinSuppHeight/2.+fgkPinSuppThickness/2.);
1753 tongTrans->RegisterYourself();
1754 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
1755 "ITSsddPinSupportShape","(ITSsddPinSuppCone+"
1756 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
1759 TGeoMedium *rytonSDD = GetMedium("ITSsddCarbonM55J"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1760 TGeoVolume *pinSupport = new TGeoVolume("ITSsddPinSupport",pinSupportShape,
1762 pinSupport->SetLineColor(fColorRyton);
1764 // include the pin itself !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1768 //________________________________________________________________________
1769 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
1771 // Create half of the cooling pipe support (ALR-0752/3)
1774 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
1776 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
1777 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
1778 side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
1779 -fgkCoolPipeSuppWidthExt/2.);
1780 side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
1781 fgkCoolPipeSuppWidthExt/2.);
1782 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
1783 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
1784 side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
1785 -fgkCoolPipeSuppWidthExt/2.);
1786 side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
1787 fgkCoolPipeSuppWidthExt/2.);
1788 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
1789 side1->SetName("ITSsddCPSside1");
1791 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
1792 - fgkCoolPipeSuppAxeDist
1793 + fgkCoolPipeSuppWidthExt/2., 0);
1794 side1Tr->RegisterYourself();
1795 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
1796 - fgkCoolPipeSuppAxeDist
1797 + fgkCoolPipeSuppWidthExt*3/2.
1798 + fgkCoolPipeSuppWidthIn,0);
1799 side2Tr->RegisterYourself();
1801 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
1802 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
1803 fgkCoolPipeSuppWidthIn/2., fgkCoolPipeSuppHeight/2.);
1804 TGeoTranslation *middleTr =
1805 new TGeoTranslation("ITSsddCPStr3",
1806 (fgkCoolPipeSuppMaxLength/2.-fgkCoolPipeSuppSlitL)/2.,
1807 -fgkCoolPipeSuppAxeDist+fgkCoolPipeSuppWidthExt
1808 +fgkCoolPipeSuppWidthIn/2., 0);
1809 middleTr->RegisterYourself();
1811 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
1812 fgkCoolPipeSuppTongW/4.,
1813 (fgkCoolPipeSuppFulWidth
1814 - 2*fgkCoolPipeSuppWidthExt
1815 - fgkCoolPipeSuppWidthIn)/2,
1816 fgkCoolPipeSuppHeight/2.);
1818 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
1819 fgkCoolPipeSuppTongW/4.,
1820 - fgkCoolPipeSuppAxeDist
1821 + fgkCoolPipeSuppFulWidth
1822 - axeBox->GetDY(), 0);
1823 axeBoxTr->RegisterYourself();
1825 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fgkCoolPipeSuppHoleDiam/2.,
1826 fgkCoolPipeSuppTongW/4.);
1828 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
1829 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
1830 fgkCoolPipeSuppTongW/4.,0,0,axeRot);
1831 axeTrans->RegisterYourself();
1832 //delete axeRot; // make the code crash, no idea of why !!!
1835 middle->InspectShape();
1836 axe->InspectShape();
1839 TGeoMedium *rytonSDD = GetMedium("ITSsddCarbonM55J"); //medium = ryton ? !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1841 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
1842 "ITSsddCoolPipeSuppShapeL",
1843 "ITSsddCPSmiddle:ITSsddCPStr3"
1844 "+ITSsddCPSside1:ITSsddCPStr1"
1845 "+ITSsddCPSside1:ITSsddCPStr2"
1846 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
1847 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
1848 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
1849 coolPipeSuppShape, rytonSDD);
1851 coolPipeSupp->SetLineColor(fColorRyton);
1853 return coolPipeSupp;
1857 //________________________________________________________________________
1858 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
1860 //Create half of the cooling pipe support (ALR-0752/3)
1863 Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
1865 TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
1866 side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
1867 side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
1868 -fgkCoolPipeSuppWidthExt/2.);
1869 side1->SetVertex( 2, -(fgkCoolPipeSuppMaxLength/2.-diffX),
1870 fgkCoolPipeSuppWidthExt/2.);
1871 side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
1872 side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
1873 side1->SetVertex( 5, -fgkCoolPipeSuppMaxLength/2.,
1874 -fgkCoolPipeSuppWidthExt/2.);
1875 side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
1876 fgkCoolPipeSuppWidthExt/2.);
1877 side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
1878 side1->SetName("ITSsddCPSside1R");
1880 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
1881 - fgkCoolPipeSuppAxeDist
1882 + fgkCoolPipeSuppWidthExt/2., 0);
1883 side1Tr->RegisterYourself();
1884 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
1885 - fgkCoolPipeSuppAxeDist
1886 + fgkCoolPipeSuppWidthExt*3/2.
1887 + fgkCoolPipeSuppWidthIn, 0);
1888 side2Tr->RegisterYourself();
1890 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
1891 (fgkCoolPipeSuppMaxLength/2.
1892 - fgkCoolPipeSuppSlitL)/2.,
1893 fgkCoolPipeSuppWidthIn/2.,
1894 fgkCoolPipeSuppHeight/2.);
1895 TGeoTranslation *middleTr =
1896 new TGeoTranslation("ITSsddCPStr3R",
1897 -( fgkCoolPipeSuppMaxLength/2.
1898 -fgkCoolPipeSuppSlitL)/2.,
1899 -fgkCoolPipeSuppAxeDist + fgkCoolPipeSuppWidthExt
1900 + fgkCoolPipeSuppWidthIn/2.,0);
1901 middleTr->RegisterYourself();
1903 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
1904 fgkCoolPipeSuppTongW/4.,
1905 (fgkCoolPipeSuppFulWidth
1906 - 2*fgkCoolPipeSuppWidthExt
1907 - fgkCoolPipeSuppWidthIn)/2,
1908 fgkCoolPipeSuppHeight/2.);
1910 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
1911 - fgkCoolPipeSuppTongW/4.,
1912 - fgkCoolPipeSuppAxeDist
1913 + fgkCoolPipeSuppFulWidth
1914 - axeBox->GetDY(),0);
1915 axeBoxTr->RegisterYourself();
1917 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fgkCoolPipeSuppHoleDiam/2.,
1918 fgkCoolPipeSuppTongW/4.);
1920 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
1921 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
1922 -fgkCoolPipeSuppTongW/4.,0,0,axeRot);
1923 axeTrans->RegisterYourself();
1927 middle->InspectShape();
1928 axe->InspectShape();
1931 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
1932 "ITSsddCoolPipeSuppShapeR",
1933 "ITSsddCPSmiddleR:ITSsddCPStr3R"
1934 "+ITSsddCPSside1R:ITSsddCPStr1R"
1935 "+ITSsddCPSside1R:ITSsddCPStr2R"
1936 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
1937 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
1939 TGeoMedium *rytonSDD = GetMedium("ITSsddCarbonM55J"); //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1940 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
1941 coolPipeSuppShape, rytonSDD);
1942 coolPipeSupp->SetLineColor(fColorRyton);
1944 return coolPipeSupp;
1947 //________________________________________________________________________
1948 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
1951 Double_t dy = fgkBTBaxisAtoBase - fgkRadiusBminBTB - fgkBTBthick;
1953 Double_t base1width = fgkBTBwidth - fgkBTBaxisAtoBottom - fgkRadiusBminBTB
1954 - (fgkRadiusAminBTB+fgkBTBthick);
1955 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
1956 fgkBTBthick/2., fgkBTBlength/2.);
1957 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
1958 fgkBTBaxisAtoBottom-fgkBTBwidth+base1width/2.,
1959 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
1960 base1Tr->RegisterYourself();
1962 Double_t base2width = fgkBTBaxisAtoBottom - fgkRadiusAminBTB - fgkBTBthick
1964 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
1965 fgkBTBthick/2., fgkBTBlength/2.);
1966 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
1967 fgkBTBaxisAtoBottom - base2width/2.,
1968 -(fgkBTBaxisAtoBase-fgkBTBthick/2.), 0);
1969 base2Tr->RegisterYourself();
1971 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
1972 fgkBTBthick/2., dy/2., fgkBTBlength/2.);
1973 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
1974 -fgkRadiusAminBTB-fgkBTBthick/2., -dy/2., 0);
1975 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
1976 fgkRadiusAminBTB+fgkBTBthick/2., -dy/2., 0);
1977 sideTr1->RegisterYourself();
1978 sideTr2->RegisterYourself();
1980 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fgkBTBHolewidth/2.,
1981 fgkBTBthick/2., fgkBTBHoleLength/2.);
1982 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
1983 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
1984 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
1985 fgkBTBHoleRefY+(fgkBTBHoleLength-fgkBTBlength)/2.);
1986 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
1987 - fgkBTBHoleRefX + fgkBTBHolewidth/2.,
1988 - (fgkBTBaxisAtoBase-fgkBTBthick/2.),
1989 - fgkBTBHoleRefY-(fgkBTBHoleLength-fgkBTBlength)/2.);
1990 holeTr1->RegisterYourself();
1991 holeTr2->RegisterYourself();
1993 Double_t radiusAmaxBTB = fgkRadiusAminBTB + fgkBTBthick;
1994 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
1995 fgkRadiusAminBTB, radiusAmaxBTB,
1996 fgkBTBlength/2., 0., 180.);
1997 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
1998 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
1999 fgkBTBlength/2., 270., 360.);
2000 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
2001 -(fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
2003 roundTr1->RegisterYourself();
2005 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
2006 fgkRadiusBminBTB, fgkRadiusBminBTB+fgkBTBthick,
2007 fgkBTBlength/2., 180., 270.);
2008 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
2009 (fgkRadiusAminBTB+fgkBTBthick+fgkRadiusBminBTB),
2011 roundTr2->RegisterYourself();
2013 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
2014 "ITSsddBaseThermalBridgeShape",
2015 "ITSsddBTBbase1:ITSsddBTBtr1"
2016 "+ ITSsddBTBbase2:ITSsddBTBtr2"
2017 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
2018 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
2019 "+ ITSsddBTBside:ITSsddBTBsideTr1"
2020 "+ ITSsddBTBside:ITSsddBTBsideTr2"
2021 "- ITSsddBTBhole:ITSsddBTBholeTr1"
2022 "- ITSsddBTBhole:ITSsddBTBholeTr2"
2023 "+ ITSsddBTBmainAxis");
2025 if(GetDebug(3)){// Remove compiler warning.
2026 base1->InspectShape();
2027 base2->InspectShape();
2028 side->InspectShape();
2029 hole->InspectShape();
2030 mainAxis->InspectShape();
2031 round1->InspectShape();
2032 round2->InspectShape();
2035 TGeoMedium *carbonFiberLadderStruct = GetMedium("ITSsddCarbonM55J");
2036 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
2038 carbonFiberLadderStruct);
2040 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
2041 return vBaseThermalBridge;
2045 //________________________________________________________________________
2046 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay) {
2048 // Return a box volume containing a end of a CF ladder.
2051 TGeoMedium *airSDD = GetMedium("ITSair");
2052 TGeoMedium *carbonFiberLadderStruct = GetMedium("ITSsddCarbonM55J");
2054 Double_t length = (fgkLay3LadderLength-fgkLay3Ndet*fgkSegmentLength)/2.;
2055 Double_t coolPipeSuppH = fgkLay3CoolPipeSuppH;
2056 Double_t underSegDH = fLay3LadderUnderSegDH;
2058 } else if (iLay==4) {
2059 length = (fgkLay4LadderLength-fgkLay4Ndet*fgkSegmentLength)/2.;
2060 coolPipeSuppH = fgkLay4CoolPipeSuppH;
2061 underSegDH = fLay4LadderUnderSegDH;
2063 printf("error in AliITSv11GeometrySDD::CreateEndLadder: Wrong layer");
2067 Double_t tDY = (- fgkLadderSegBoxDH/2 //space left on top of the ladder
2068 + underSegDH/2); //space under ladder segment
2069 // here tDY is not the same as for the segment because the end ladder
2070 // does not have a space under it, inside the general ladder volume.
2071 Double_t segmentLength = fgkSegmentLength;
2072 Double_t topCornerLength = fgkSegmentLength/2.-fgkLay4LaddTopCornerEnd;
2074 TGeoBBox *endBox = new TGeoBBox("ITSsddEndLaddBox",
2076 fgkLadderHeight/2+fgkLadderSegBoxDH/2+underSegDH/2,
2078 TGeoVolume *virtualEnd = new TGeoVolume("ITSsddEnd",endBox, airSDD);
2080 //**********************************
2081 // coding real matter :
2082 //**********************************
2083 Double_t triangleHeight = fgkLadderHeight - fgkLadderBeamRadius;
2084 Double_t halfTheta = TMath::ATan( 0.5*fgkLadderWidth/triangleHeight );
2085 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
2086 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
2088 //--- The 3 V shape corners of the Carbon Fiber Ladder
2090 TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
2091 fgkLadderLa, fgkLadderHa, fgkLadderl);
2092 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
2093 cfLaddTop1,carbonFiberLadderStruct);
2094 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
2095 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
2096 fgkLadderLa, fgkLadderHa, fgkLadderl);
2097 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
2098 cfLaddTop2,carbonFiberLadderStruct);
2099 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
2100 TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2+tDY,
2101 -(length-topCornerLength)/2.);
2102 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
2103 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
2106 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
2107 fgkLadderLb, fgkLadderHb, fgkLadderl);
2108 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
2109 cfLaddSide1,carbonFiberLadderStruct);
2110 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
2111 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
2112 fgkLadderLb, fgkLadderHb, fgkLadderl);
2113 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
2114 cfLaddSide2,carbonFiberLadderStruct);
2115 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
2116 Double_t dYTranslation = ( fgkLadderHeight/2. - 0.5*fgkLadderWidth*
2117 TMath::Tan(beta) - fgkLadderBeamRadius );
2119 // because center of the triangle doesn't correspond to virtual vol. center
2120 Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
2121 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
2122 alpha*TMath::RadToDeg());
2123 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
2124 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
2125 -alpha*TMath::RadToDeg());
2126 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
2127 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
2128 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
2129 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
2130 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
2133 // Beams on the sides
2134 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
2135 TMath::Sin(2*beta)/(TanD(fgkBeamSidePhi)*TanD(fgkBeamSidePhi))) ));
2137 //Euler rotation : about Z, then new X, then new Z
2138 TGeoRotation *beamRot1 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
2139 -beamPhiPrime*TMath::RadToDeg(), -90);
2140 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
2141 beamPhiPrime*TMath::RadToDeg(), -90);
2142 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
2143 beamPhiPrime*TMath::RadToDeg(), -90);
2144 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
2145 -beamPhiPrime*TMath::RadToDeg(), -90);
2146 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
2147 TMath::Tan(halfTheta),
2148 fgkLadderBeamRadius/2. + tDY,
2149 -length/2 + segmentLength/8, beamRot1);
2150 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
2151 TMath::Tan(halfTheta),
2152 fgkLadderBeamRadius/2.+tDY,
2153 -length/2 + 3*segmentLength/8, beamRot2);
2154 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
2155 TMath::Tan(halfTheta),
2156 fgkLadderBeamRadius/2.+tDY,
2157 -length/2 + segmentLength/8, beamRot3);
2158 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
2159 TMath::Tan(halfTheta),
2160 fgkLadderBeamRadius/2. + tDY,
2161 -length/2+3*segmentLength/8, beamRot4);
2163 virtualEnd->AddNode(fLaddSegCommonVol[6], 1, beamTransf1);
2164 virtualEnd->AddNode(fLaddSegCommonVol[6], 2, beamTransf3);
2165 virtualEnd->AddNode(fLaddSegCommonVol[6], 3, beamTransf5);
2166 virtualEnd->AddNode(fLaddSegCommonVol[6], 4, beamTransf7);
2168 //--- Beams of the bottom
2169 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
2170 fgkLadderWidth/2.-fgkLadderLb/3, 0, 180);
2171 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
2172 bottomBeam1, carbonFiberLadderStruct);
2173 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
2175 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
2176 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
2177 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,
2178 -length/2+fgkSegmentLength/2, bottomBeamRot1);
2179 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
2180 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fgkLadderBeamRadius,
2181 fgkLadderWidth/2.-fgkLadderLb/3, 0, 90);
2182 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
2183 bottomBeam2, carbonFiberLadderStruct);
2184 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
2185 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
2186 -(fgkLadderHeight/2-fgkLadderBeamRadius)+tDY,-length/2,bottomBeamRot1);
2187 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
2189 //**********************************
2190 //the cooling pipe supports
2191 Double_t triangleCPaxeDist = fgkCoolPipeSuppAxeDist-fgkCoolPipeSuppWidthExt-
2192 fgkCoolPipeSuppWidthIn+fgkLadderBeamRadius;
2194 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
2195 (triangleHeight+triangleCPaxeDist/
2196 TMath::Sin(halfTheta)-coolPipeSuppH);
2198 if (fAddCoolingSyst) {
2199 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90, 90);
2200 TGeoRotation *rotCPS1 = new TGeoRotation("", halfTheta*TMath::RadToDeg(),-90,-90);
2201 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
2202 -fgkLadderHeight/2.+ tDY +
2203 coolPipeSuppH+fgkLadderBeamRadius,
2204 -length/2., rotCPS1);
2205 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
2206 -fgkLadderHeight/2.+ tDY +
2207 coolPipeSuppH+fgkLadderBeamRadius,
2208 -length/2., rotCPS2);
2210 virtualEnd->AddNode(fCoolPipeSupportL, 1, transCPS1);
2211 virtualEnd->AddNode(fCoolPipeSupportR, 1, transCPS4);
2214 //**********************************
2215 if(GetDebug(1)) virtualEnd->CheckOverlaps(0.01);
2216 virtualEnd->SetVisibility(kFALSE);
2221 //________________________________________________________________________
2222 TGeoVolume* AliITSv11GeometrySDD::CreateSDDsensor() {
2224 // return a box containing the SDD sensor
2227 TGeoMedium *airSDD = GetMedium("ITSair");
2228 TGeoMedium *siliconSDD = GetMedium("ITSsddSi");
2229 TGeoMedium *alSDD = GetMedium("ITSal");
2230 TGeoMedium *polyhamideSDD = GetMedium("ITSsddKAPTON_POLYCH2");
2231 TGeoMedium *glassSDD = GetMedium("ITSsddSi"); // To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2234 Double_t rWraping = fgkWaferThickness/2+fgkWaHVcableAlThick+fgkWaHVcablePolyThick;
2235 Double_t witdhCableBox = (fgkWaHVcableWitdh - TMath::Pi()*rWraping)/2;
2237 Double_t sensoxBoxLength = ( fgkWaferLength +
2238 2*(rWraping+witdhCableBox-fgkWaHVcableDW) );
2239 // Makes life easier to include the space for the WA HV cable on both sides
2240 Double_t sensoxBoxThick = fgkWaferThickness +
2241 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
2243 TGeoBBox *box = new TGeoBBox("ITSsddSensorBox",
2244 fgkWaferWidth/2, sensoxBoxThick/2, sensoxBoxLength/2);
2245 TGeoVolume *virtualSensor = new TGeoVolume("ITSsddSensor",box,airSDD);
2247 //****************************
2249 //****************************
2251 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
2252 fgkWaferWidth/2, fgkWaferThickness/2, fgkWaferLength/2);
2253 TGeoVolume *wafer = new TGeoVolume("ITSsddWafer", waferShape, siliconSDD);
2254 wafer->SetLineColor(fColorSilicon);
2255 TGeoBBox *sensBox = new TGeoBBox("ITSsddSensorSensBox",
2256 fgkWaferWidthSens/2,fgkWaferThickSens/2,fgkWaferLengthSens/2);
2257 TGeoVolume *sensVol=new TGeoVolume(fgSDDsensitiveVolName,sensBox,siliconSDD);
2258 sensVol->SetLineColor(fColorSilicon);
2260 wafer->AddNode(sensVol, 1, 0);
2261 virtualSensor->AddNode(wafer, 1, 0);
2264 //****************************
2266 //****************************
2267 TGeoBBox *glass = new TGeoBBox("ITSsddGlassBox", fgkSensorGlassLX/2,
2268 fgkSensorGlassLY/2, fgkSensorGlassLZ/2);
2269 TGeoVolume *vGlass = new TGeoVolume("ITSsddGlass",glass, glassSDD);
2270 vGlass->SetLineColor(fColorGlass);
2271 TGeoTranslation *glassTr1 = new TGeoTranslation("",fgkGlassDXOnSensor,
2272 fgkWaferThickness/2+fgkSensorGlassLY/2,
2273 fgkGlassDZOnSensor);
2274 TGeoTranslation *glassTr2 = new TGeoTranslation("",-fgkGlassDXOnSensor,
2275 fgkWaferThickness/2+fgkSensorGlassLY/2,
2276 fgkGlassDZOnSensor);
2277 TGeoTranslation *glassTr3 = new TGeoTranslation("",fgkGlassDXOnSensor,
2278 fgkWaferThickness/2+fgkSensorGlassLY/2,
2279 -fgkGlassDZOnSensor);
2280 TGeoTranslation *glassTr4 = new TGeoTranslation("",-fgkGlassDXOnSensor,
2281 fgkWaferThickness/2+fgkSensorGlassLY/2,
2282 -fgkGlassDZOnSensor);
2283 virtualSensor->AddNode(vGlass, 1, glassTr1);
2284 virtualSensor->AddNode(vGlass, 2, glassTr2);
2285 virtualSensor->AddNode(vGlass, 3, glassTr3);
2286 virtualSensor->AddNode(vGlass, 4, glassTr4);
2288 //****************************
2289 // Wrap-around cable
2290 //****************************
2292 AliITSv11GeomCableFlat waHVCable("ITSsddWaHVCableU",witdhCableBox,
2293 fgkWaHVcableAlThick+fgkWaHVcablePolyThick);
2294 waHVCable.SetNLayers(2);
2295 waHVCable.SetLayer(0, fgkWaHVcablePolyThick,polyhamideSDD,fColorPolyhamide);
2296 waHVCable.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
2297 waHVCable.SetInitialNode(virtualSensor);
2299 Double_t x1[3], x2[3], vX[3] = {1,0,0};
2300 x1[0] = -fgkWaHVcableLength/2;
2302 x1[1] = (fgkWaferThickness + waHVCable.GetThickness())/2;
2304 x1[2] = fgkWaferLength/2+waHVCable.GetWidth()/2-fgkWaHVcableDW;
2307 waHVCable.AddCheckPoint(virtualSensor, 0, x1, vX);
2308 waHVCable.AddCheckPoint(virtualSensor, 1, x2, vX);
2309 waHVCable.CreateAndInsertCableSegment(1,-90);
2312 waHVCable.SetName("ITSsddWaHVCableD");
2313 waHVCable.ResetPoints();
2314 waHVCable.AddCheckPoint(virtualSensor, 0, x1, vX);
2315 waHVCable.AddCheckPoint(virtualSensor, 1, x2, vX);
2316 waHVCable.CreateAndInsertCableSegment(1, 90);
2318 AliITSv11GeomCableRound waHVCableFold("ITSsddWaHVCableFold",
2320 waHVCableFold.SetPhi(180,360);
2321 waHVCableFold.SetNLayers(2);
2322 waHVCableFold.SetLayer(0, fgkWaferThickness/2+fgkWaHVcablePolyThick,
2323 polyhamideSDD, fColorPolyhamide);
2324 waHVCableFold.SetLayer(1, fgkWaHVcableAlThick, alSDD, fColorAl);
2325 waHVCableFold.SetInitialNode(virtualSensor);
2328 x1[2] = fgkWaferLength/2-fgkWaHVcableDW+witdhCableBox;
2330 waHVCableFold.AddCheckPoint(virtualSensor, 0, x1, vX);
2331 waHVCableFold.AddCheckPoint(virtualSensor, 1, x2, vX);
2332 waHVCableFold.CreateAndInsertCableSegment(1);
2334 //****************************
2336 //****************************
2337 Double_t headRadius = (fgkTransitHVHeadLX*fgkTransitHVHeadLX/4.+
2338 fgkTransitHVHeadLZ*fgkTransitHVHeadLZ)
2339 /(2.*fgkTransitHVHeadLZ);
2340 Double_t theta = TMath::ATan2(fgkTransitHVHeadLX/2,
2341 headRadius-fgkTransitHVHeadLZ)
2344 TGeoTubeSeg *headPoly = new TGeoTubeSeg(0,headRadius,
2345 fgkTransitHVPolyThick/2,
2347 headPoly->SetName("headPoly");
2348 TGeoTranslation *headPolyTr = new TGeoTranslation(0,0,
2349 -fgkTransitHVPolyThick/2);
2350 headPolyTr->SetName("headPolyTr");
2351 headPolyTr->RegisterYourself();
2353 TGeoTubeSeg *headAl = new TGeoTubeSeg(0,headRadius,
2354 fgkTransitHVAlThick/2,
2356 headAl->SetName("headAl");
2357 TGeoTranslation *headAlTr = new TGeoTranslation(0,0,
2358 -fgkTransitHVPolyThick
2359 -fgkTransitHVAlThick/2);
2360 headAlTr->SetName("headAlTr");
2361 headAlTr->RegisterYourself();
2363 TGeoBBox *cache = new TGeoBBox(fgkTransitHVHeadLX/2,
2364 (headRadius-fgkTransitHVHeadLZ)/2,
2365 (fgkTransitHVPolyThick+fgkTransitHVAlThick)/2);
2366 cache->SetName("cache");
2368 TGeoTranslation *headCacheTr = new TGeoTranslation(0,
2369 (headRadius-fgkTransitHVHeadLZ)/2,
2370 -(fgkTransitHVPolyThick
2371 +fgkTransitHVAlThick)/2);
2372 headCacheTr->SetName("cacheTr");
2373 headCacheTr->RegisterYourself();
2375 TGeoCompositeShape *headPolyComp = new TGeoCompositeShape(
2376 "headPoly:headPolyTr-cache:cacheTr");
2377 TGeoVolume *vHeadPolyComp = new TGeoVolume(
2378 "ITSsddHVtransitHeadPoly",headPolyComp, polyhamideSDD);
2379 vHeadPolyComp->SetLineColor(fColorPolyhamide);
2380 TGeoCompositeShape *headAlComp = new TGeoCompositeShape(
2381 "headAl:headAlTr-cache:cacheTr");
2382 TGeoVolume *vHeadAlComp = new TGeoVolume(
2383 "ITSsddHVtransitHeadAl",headAlComp, alSDD);
2384 vHeadAlComp->SetLineColor(fColorAl);
2387 // TGeoRotation rotHead("",0,90,0);
2388 // TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
2389 // -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
2391 TGeoRotation *rotHead = new TGeoRotation("",0,90,0);
2392 TGeoCombiTrans *rotHeadTr = new TGeoCombiTrans(0,fgkWaferThickness/2,
2393 -headRadius+fgkTransitHVHeadLZ+fgkTransitHVBondingLZ/2,
2396 virtualSensor->AddNode(vHeadPolyComp,1,rotHeadTr);
2397 virtualSensor->AddNode(vHeadAlComp,1,rotHeadTr);
2400 AliITSv11GeomCableFlat transitHVCable("ITSsddHVtransitCenter",
2401 fgkTransitHVBondingLZ,
2402 fgkTransitHVPolyThick+fgkTransitHVAlThick);
2403 transitHVCable.SetNLayers(2);
2404 transitHVCable.SetLayer(0, fgkTransitHVPolyThick,polyhamideSDD,
2406 transitHVCable.SetLayer(1, fgkTransitHVAlThick, alSDD, fColorAl);
2407 transitHVCable.SetInitialNode(virtualSensor);
2409 x1[0] = -fgkTransitHVHeadLX/2;
2411 x1[1] = (fgkWaferThickness+fgkTransitHVPolyThick+fgkTransitHVAlThick)/2;
2415 transitHVCable.AddCheckPoint(virtualSensor, 0, x1, vX);
2416 transitHVCable.AddCheckPoint(virtualSensor, 1, x2, vX);
2417 transitHVCable.CreateAndInsertCableSegment(1,-90);
2418 transitHVCable.ResetPoints();
2419 transitHVCable.SetName("ITSsddHVtransitTail");
2420 transitHVCable.SetWidth(fgkTransitHVtailWidth);
2421 x1[0] = fgkTransitHVtailXpos;
2422 x2[0] = fgkTransitHVtailXpos;
2423 x1[2] = -fgkTransitHVBondingLZ/2;
2424 x2[2] = -fgkTransitHVBondingLZ/2-fgkTransitHVtailLength;
2425 Double_t vZ[3] = {0,0,1};
2426 transitHVCable.AddCheckPoint(virtualSensor, 0, x1, vZ);
2427 transitHVCable.AddCheckPoint(virtualSensor, 1, x2, vZ);
2428 transitHVCable.CreateAndInsertCableSegment(1,0);
2431 TGeoArb8 *sideLeft = new TGeoArb8( fgkTransitHVPolyThick/2 );
2432 sideLeft->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
2433 sideLeft->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
2434 fgkTransitHVsideLZ);
2435 sideLeft->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
2436 sideLeft->SetVertex(3, fgkTransitHVHeadLX/2, 0);
2437 sideLeft->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
2438 sideLeft->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
2439 fgkTransitHVsideLZ);
2440 sideLeft->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
2441 sideLeft->SetVertex(7, fgkTransitHVHeadLX/2, 0);
2443 TGeoArb8 *sideLeftAl = new TGeoArb8( fgkTransitHVAlThick/2 );
2444 sideLeftAl->SetVertex(0, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
2445 sideLeftAl->SetVertex(1, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
2446 fgkTransitHVsideLZ);
2447 sideLeftAl->SetVertex(2, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
2448 sideLeftAl->SetVertex(3, fgkTransitHVHeadLX/2, 0);
2449 sideLeftAl->SetVertex(4, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,0);
2450 sideLeftAl->SetVertex(5, fgkTransitHVtailXpos+fgkTransitHVtailWidth/2,
2451 fgkTransitHVsideLZ);
2452 sideLeftAl->SetVertex(6, fgkTransitHVHeadLX/2, fgkTransitHVsideLeftZ);
2453 sideLeftAl->SetVertex(7, fgkTransitHVHeadLX/2, 0);
2455 TGeoArb8 *sideRight = new TGeoArb8( fgkTransitHVPolyThick/2 );
2456 sideRight->SetVertex(0, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
2457 sideRight->SetVertex(1, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
2458 fgkTransitHVsideLZ);
2459 sideRight->SetVertex(2, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
2460 sideRight->SetVertex(3, -fgkTransitHVHeadLX/2, 0);
2461 sideRight->SetVertex(4, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,0);
2462 sideRight->SetVertex(5, fgkTransitHVtailXpos-fgkTransitHVtailWidth/2,
2463 fgkTransitHVsideLZ);
2464 sideRight->SetVertex(6, -fgkTransitHVHeadLX/2, fgkTransitHVsideRightZ);
2465 sideRight->SetVertex(7, -fgkTransitHVHeadLX/2, 0);
2467 // TGeoRotation rotSide("",0,-90,0);
2468 // TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
2469 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
2470 // -fgkTransitHVBondingLZ/2,&rotSide);
2471 // TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
2472 // (fgkWaferThickness+fgkTransitHVPolyThick)/2,
2473 // -fgkTransitHVBondingLZ/2, &rotSide);
2474 // TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
2475 // fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
2476 // -fgkTransitHVBondingLZ/2, &rotSide);
2477 TGeoRotation *rotSide = new TGeoRotation("",0,-90,0);
2478 TGeoCombiTrans *sideRightTr = new TGeoCombiTrans(0,
2479 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
2480 -fgkTransitHVBondingLZ/2,rotSide);
2481 TGeoCombiTrans *sideLeftTr = new TGeoCombiTrans(0,
2482 (fgkWaferThickness+fgkTransitHVPolyThick)/2,
2483 -fgkTransitHVBondingLZ/2, rotSide);
2484 TGeoCombiTrans *sideLeftAlTr = new TGeoCombiTrans(0,
2485 fgkTransitHVPolyThick+(fgkWaferThickness+fgkTransitHVAlThick)/2,
2486 -fgkTransitHVBondingLZ/2, rotSide);
2489 TGeoVolume *vSideLeft = new TGeoVolume("ITSsddHVtransitSideLeft",
2490 sideLeft,polyhamideSDD);
2491 vSideLeft->SetLineColor(fColorPolyhamide);
2492 TGeoVolume *vSideLeftAl = new TGeoVolume("ITSsddHVtransitSideLeftAl",
2494 vSideLeftAl->SetLineColor(fColorAl);
2495 TGeoVolume *vSideRight = new TGeoVolume("ITSsddHVtransitSideRight",
2496 sideRight,polyhamideSDD);
2497 vSideRight->SetLineColor(fColorPolyhamide);
2499 virtualSensor->AddNode(vSideLeft, 1, sideLeftTr);
2500 virtualSensor->AddNode(vSideLeftAl, 1, sideLeftAlTr);
2501 virtualSensor->AddNode(vSideRight, 1, sideRightTr);
2504 //****************************
2505 if(GetDebug(1)) virtualSensor->CheckOverlaps(0.01);
2506 virtualSensor->SetVisibility(kFALSE);
2507 return virtualSensor;
2511 //________________________________________________________________________
2512 TGeoVolume *AliITSv11GeometrySDD::CreateDetectors(Int_t iLay) {
2514 // return a box volume containing the detectors
2517 TGeoMedium *airSDD = GetMedium("ITSair");
2519 Int_t nDetectors = fgkLay3Ndet;
2520 Double_t ladderLength = fgkLay3LadderLength;
2521 Double_t *sensorZPos = fLay3sensorZPos;
2525 nDetectors = fgkLay4Ndet;
2526 ladderLength = fgkLay4LadderLength;
2527 sensorZPos = fLay4sensorZPos;
2529 printf("AliITSv11GeometrySDD::CreateDetectors: Error : Wrong layer");
2533 Double_t volThickness = ( fgkLadWaferSep + 2*fgkWaferThickness +
2534 2*(fgkWaHVcableAlThick+fgkWaHVcablePolyThick));
2536 sprintf(name,"ITSsddDetBox%i",iLay);
2537 TGeoBBox *detBox = new TGeoBBox(name, fgkWaferWidth/2, volThickness/2,
2538 ladderLength*((nDetectors-0.5)/nDetectors)/2);
2539 TGeoVolume *virtualDet = new TGeoVolume("ITSsddLadd",detBox, airSDD);
2541 for (Int_t i=0; i<nDetectors; i++) {
2542 Double_t localZ = sensorZPos[i];
2543 Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
2544 if (iLay==3) if (i%2!=0) localY = -localY;
2545 if (iLay==4) if (i%2==0) localY = -localY;
2546 sprintf(name, "ITSsddLay%iSensorPos%i",iLay, i);
2548 if (i >= nDetectors/2) {
2549 TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
2550 sensorPos->SetName(name);
2551 virtualDet->AddNode(fSDDsensor, i, sensorPos);
2554 TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
2555 TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
2557 sensorPos->SetName(name);
2558 virtualDet->AddNode(fSDDsensor, i, sensorPos);
2562 if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
2563 virtualDet->SetVisibility(kFALSE);
2568 //________________________________________________________________________
2569 Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
2572 // export the geometry in a AliITSgeom object
2576 printf("error:Try to fill null (AliITSgeom *) object");
2580 printf("error:Try to set sensor geometry while geometry is not defined\n");
2584 const Float_t kDxyz[3] = {fgkWaferWidthSens/2., fgkWaferThickSens/2.,
2585 fgkWaferLengthSens/2.};
2586 if(!(geom->IsShapeDefined(kSDD)))
2587 geom->ReSetShape(kSDD, new AliITSgeomSDD256(3, kDxyz));
2590 char ladderName[30];
2591 char sensorName[30];
2592 char senstivName[30];
2593 const Int_t kNLay = 2;
2594 const Int_t kNLadd[kNLay] = {fgkLay3Nladd, fgkLay4Nladd};
2595 const Int_t kNDet[kNLay] = {fgkLay3Ndet, fgkLay4Ndet};
2598 printf("AliITSv11GeometrySDD::SetSensorGeometry(), nodes found :\n");
2600 Int_t firstSDDmod = startMod;
2601 for (Int_t iLay=0; iLay<kNLay; iLay++) {
2602 /////////////////////////////////////////
2603 sprintf(layerName, "ITSsddLayer%i_1",iLay+3);
2604 TGeoNode *layNode = fMotherVol->GetNode(layerName);
2606 if (GetDebug(1)) printf("%s\n",layNode->GetName());
2607 TGeoVolume *layVolume = layNode->GetVolume();
2608 TGeoHMatrix layMatrix(*layNode->GetMatrix());
2610 for (Int_t iLadd=0; iLadd<kNLadd[iLay]; iLadd++) {
2611 /////////////////////////////////////////
2612 sprintf(ladderName, "ITSsddLadd_%i", iLadd);
2613 TGeoNode *laddNode = layVolume->GetNode(ladderName);
2615 if (GetDebug(1)) printf("| %s\n",laddNode->GetName());
2616 TGeoVolume *laddVolume = laddNode->GetVolume();
2617 TGeoHMatrix laddMatrix(layMatrix);
2618 laddMatrix.Multiply(laddNode->GetMatrix());
2620 for (Int_t iDet=0; iDet<kNDet[iLay]; iDet++) {
2621 /////////////////////////////////////////
2622 sprintf(sensorName, "ITSsddSensor_%i",iDet);
2623 TGeoNode *detNode = laddVolume->GetNode(sensorName);
2625 if (GetDebug(1)) printf("| | %s\n",detNode->GetName());
2626 TGeoVolume *detVolume = detNode->GetVolume();
2627 TGeoHMatrix detMatrix(laddMatrix);
2628 detMatrix.Multiply(detNode->GetMatrix());
2630 TGeoNode *wafNode = detVolume->GetNode("ITSsddWafer_1");
2632 TGeoVolume *wafVolume = wafNode->GetVolume();
2633 TGeoHMatrix wafMatrix(detMatrix);
2634 detMatrix.Multiply(wafNode->GetMatrix());
2635 //--------------------------------------------------------
2636 sprintf(senstivName, "%s%s", fgSDDsensitiveVolName,"_1");
2637 TGeoNode *sensitivNode = wafVolume->GetNode(senstivName);
2639 TGeoHMatrix sensMatrix(wafMatrix);
2640 sensMatrix.Multiply(sensitivNode->GetMatrix());
2642 // Sticking to the convention for local wafer coordinate
2644 if (iDet >= kNDet[iLay]/2) {
2645 // TGeoRotation rotY("",0,180,0);
2646 TGeoRotation rotY("",-180,-180,0);
2647 sensMatrix.Multiply(&rotY);
2649 // Creating the matrix in AliITSgeom for
2650 // this sensitive volume :
2651 Double_t *trans = sensMatrix.GetTranslation();
2652 Double_t *r = sensMatrix.GetRotationMatrix();
2653 Double_t rot[10] = {r[0],r[1],r[2],
2655 r[6],r[7],r[8], 1.0};
2656 //rot[9]!=0.0 => not a unity matrix
2657 geom->CreatMatrix(startMod,iLay+iLaySDD,iLadd+1,iDet+1,
2659 // iLadd+1, iDet+1 because ladd. and det. start at +1
2664 printf("Error (ExportSensorGeometry) %s not found !\n",
2667 printf("Error (ExportSensorGeometry) %s not found !\n",
2670 printf("Error (ExportSensorGeometry) %s not found !\n",
2674 printf("Error (ExportSensorGeometry) %s not found !\n",
2678 printf("Error (ExportSensorGeometry) %s not found !\n",
2682 return (startMod-firstSDDmod);
2686 //________________________________________________________________________
2687 Int_t AliITSv11GeometrySDD::
2688 GetCurrentLayLaddDet(Int_t &lay, Int_t &ladd, Int_t&det) const {
2690 // Function which gives the layer, ladder and det.
2691 // index of the current volume. To be used in
2692 // AliITS::StepManager()
2695 if (gGeoManager->GetLevel()<3) return kFALSE;
2696 // Get the det index :
2697 TGeoNode *node = gGeoManager->GetMother(2);
2698 if (!node) return kFALSE;
2699 det = node->GetNumber()+1;
2701 // Get the ladder index :
2702 node = gGeoManager->GetMother(3);
2703 if (!node) return kFALSE;
2704 ladd = node->GetNumber()+1;
2706 // Get the layer index :
2707 if (node->GetNdaughters()==fgkLay3Ndet)
2708 lay = 3; // this has to be equal to the iLaySDD argument given to ExportSensorGeometry() !!!