]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/AliITSv11GeometrySPD.cxx
Added 3 new methods regarding Si detectors from the Particle data book.
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySPD.cxx
CommitLineData
db486a6e 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16// This class Defines the Geometry for the ITS services and support cones
17// outside of the ceneteral volume (except for the Ceneteral support
18// cylinders. Other classes define the rest of the ITS. Specificaly the ITS
19// The SSD support cone,SSD Support centeral cylinder, SDD support cone,
20// The SDD cupport centeral cylinder, the SPD Thermal Sheald, The supports
21// and cable trays on both the RB26 (muon dump) and RB24 sides, and all of
22// the cabling from the ladders/stave ends out past the TPC.
23
24/* $Id$ */
25// General Root includes
26#include <Riostream.h>
27#include <TMath.h>
28#include <TLatex.h>
29#include <TCanvas.h>
c789ee28 30#include <TView.h>
db486a6e 31#include <TPolyLine.h>
32// Root Geometry includes
33#include <TGeoManager.h>
34#include <TGeoVolume.h>
35#include <TGeoPcon.h>
36#include <TGeoCone.h>
37#include <TGeoTube.h> // contaings TGeoTubeSeg
38#include <TGeoArb8.h>
39#include <TGeoEltu.h>
40#include <TGeoXtru.h>
41#include <TGeoCompositeShape.h>
42#include <TGeoMatrix.h>
db486a6e 43#include "AliITSv11GeometrySPD.h"
44
45ClassImp(AliITSv11GeometrySPD)
46
47#define SQ(A) (A)*(A)
48
49//______________________________________________________________________
c789ee28 50AliITSv11GeometrySPD::AliITSv11GeometrySPD() :
51AliITSv11Geometry(),
52fSPDSensitiveVolumeName("ITSSPDDetectorSensitiveVolume"),
53fThickDetector(0.0),
54fThickChip(0.0){
55 // Default Constructor for the AliITSv11GeometrySPD
56 // Inputs:
57 // none.
58 // Outputs:
59 // none.
60 // Return:
61 // One Default Constructed AliITSv11GeometrySPD class
62
63 fThickDetector = fkLadDetectorThick;
64 fThickChip = fkLadChipHight;
65}
66//______________________________________________________________________
67AliITSv11GeometrySPD::AliITSv11GeometrySPD(Int_t debug) :
68AliITSv11Geometry(debug),
69fSPDSensitiveVolumeName("ITSSPDDetectorSensitiveVolume"),
70fThickDetector(0.0),
71fThickChip(0.0),
72fkGrdFoilThick(0.05*fgkmm),
73fkGrdFoilWidthA(15.95*fgkmm),
74fkGrdFoilWidthC(4.4*fgkmm),
75fkGrdFoilLngA(139.89*fgkmm),
76fkGrdFoilLngB(11.55*fgkmm),
77fkGrdFoilLngC(82.0*fgkmm),
78fkGrdFoilNholesAB(5),
79fkGrdFoilHoleCenterAB(7.8*fgkmm),
80fkGrdFoilHoleLengthAB(12.0*fgkmm),
81fkGrdFoilHoleWidthAB(7.5*fgkmm),
82fkGrdFoilHoleSpacingAB(14.0*fgkmm),
83fkGrdFoilHoleStartA(1.36*fgkmm),
84fkGrdFoilHoleStartB(73.08*fgkmm),
85 // Ladder
86fkLadNChips(5),
87fkLadChipWidth(15950.0*fgkmicron),
88fkLadChipHight(150.0*fgkmicron),
89fkLadChipLength(13490.0*fgkmicron),
90fkLadGlue0Thick(0.100*fgkmm),
91fkLadBumpBondThick(30.0*fgkmicron),
92fkLadDetectorWidth(13700.0*fgkmicron),
93fkLadDetectorThick(200.0*fgkmicron),
94fkLadDetectorLength(70710.0*fgkmicron),
95fkLadSensDetWidth(12800.0*fgkmicron),
96fkLadSensDetThick(200.0*fgkmicron),
97fkLadSensDetLength(69490.0*fgkmicron),
98fkLadChipSpacing0(610.0*fgkmicron),
99fkLadChipSpacing1((fkLadDetectorLength-(2.*fkLadChipSpacing0+
100 ((Double_t)fkLadNChips)*fkLadChipLength))/((Double_t)(fkLadNChips-1)))
101{
102 // Default Constructor for the AliITSv11GeometrySPD
103 // Inputs:
104 // none.
105 // Outputs:
106 // none.
107 // Return:
108 // One Default Constructed AliITSv11GeometrySPD class
109
110 fThickDetector = fkLadDetectorThick;
111 fThickChip = fkLadChipHight;
112}
113//______________________________________________________________________
114TGeoVolume* AliITSv11GeometrySPD::CenteralSPD(TGeoVolume *moth){
115 // Define The Centeral part of the SPD detector.
116 // Inputs:
117 // TGeoVolume* moth
118 // Outputs:
119 // none.
120 // Return:
121 // TGeoVolume * moth
122 Int_t i=2;
123 TGeoVolume *vHSGF,*vLad,*vMoth;
124 TGeoTube *tube;
125
126 tube = new TGeoTube("ITSSPD Temp SPD Mother voluem",0.0,7.0,17.0);
127 vMoth = new TGeoVolume("ITSSPDTempSPDMotherVolume",tube,0);
128
129 moth->AddNode(vMoth,1,0);
130 switch(i){
131 case 0:
132 CarbonFiberSector(vMoth);
133 break;
134 case 1:
135 vHSGF = CreateHalfStaveGroundFoil();
136 vMoth->AddNode(vHSGF,1,0);
137 break;
138 case 2:
139 vLad = CreateSPDLadder();
140 vMoth->AddNode(vLad,1,0);
141 break;
142 } // end sithch
143
144 return moth;
145}
146//______________________________________________________________________
147TGeoVolume* AliITSv11GeometrySPD::CarbonFiberSector(TGeoVolume *moth){
db486a6e 148 // Define the detail SPD Carbon fiber support Sector geometry.
149 // Based on the drawings ALICE-Pixel "Construzione Profilo Modulo"
150 // March 25 2004 and ALICE-SUPPORTO "construzione Profilo Modulo"
151 // Define Outside radii as negitive, Outside in the sence that the
152 // center of the arc is outside of the object.
153 // February 16 2004.
154 // Inputs:
c789ee28 155 // TGeoVolume* moth The mother volume which this object is to be
156 // placed in
db486a6e 157 // Outputs:
158 // none.
159 // Return:
c789ee28 160 // TGeoVolume*
db486a6e 161 TGeoManager *mgr = gGeoManager;
162 TGeoMedium *medSPDcf = 0; // SPD support cone Carbon Fiber materal number.
163 //TGeoMedium *medSPDfs = 0; // SPD support cone inserto stesalite 4411w.
164 //TGeoMedium *medSPDfo = 0; // SPD support cone foam, Rohacell 50A.
165 TGeoMedium *medSPDss = 0; // SPD support cone screw material,Stainless
166 TGeoMedium *medSPDair = 0; // SPD support cone Air
167 //TGeoMedium *medSPDal = 0; // SPD support cone SDD mounting bracket Al
168 TGeoMedium *medSPDcoolfl = 0; // SPD cooling fluid, Freeon
169 medSPDcf = mgr->GetMedium("ITSspdCarbonFiber");
170 //medSPDfs = mgr->GetMedium("ITSspdStaselite4411w");
171 //medSPDfo = mgr->GetMedium("ITSspdRohacell50A");
172 medSPDss = mgr->GetMedium("ITSspdStainlessSteal");
173 medSPDair= mgr->GetMedium("ITSspdAir");
174 medSPDcoolfl= mgr->GetMedium("ITSspdCoolingFluid");
175 //
176 const Double_t ksecDz = 0.5*500.0*fgkmm;
177 const Double_t ksecLen = 30.0*fgkmm;
178 const Double_t ksecCthick = 0.20*fgkmm;
179 const Double_t ksecDipLength = 3.2*fgkmm;
180 const Double_t ksecDipRadii = 0.4*fgkmm;
181 //const Double_t ksecCoolingTubeExtraDepth = 0.86*fgkmm;
182 //
183 const Double_t ksecX0 = -10.725*fgkmm;
184 const Double_t ksecY0 = -14.853*fgkmm;
185 const Double_t ksecR0 = -0.8*fgkmm; // Outside
186 const Double_t ksecX1 = -13.187*fgkmm;
187 const Double_t ksecY1 = -19.964*fgkmm;
188 const Double_t ksecR1 = +0.6*fgkmm; // Inside
189 //const Double_t ksecDip0 = 5.9*fgkmm;
190 //
191 const Double_t ksecX2 = -3.883*fgkmm;
192 const Double_t ksecY2 = -17.805*fgkmm;
193 const Double_t ksecR2 = +0.80*fgkmm; // Inside Guess.
194 const Double_t ksecX3 = -3.123*fgkmm;
195 const Double_t ksecY3 = -14.618*fgkmm;
196 const Double_t ksecR3 = -0.6*fgkmm; // Outside
197 //const Double_t ksecDip1 = 8.035*fgkmm;
198 //
199 const Double_t ksecX4 = +11.280*fgkmm;
200 const Double_t ksecY4 = -14.473*fgkmm;
201 const Double_t ksecR4 = +0.8*fgkmm; // Inside
202 const Double_t ksecX5 = +19.544*fgkmm;
203 const Double_t ksecY5 = +10.961*fgkmm;
204 const Double_t ksecR5 = +0.8*fgkmm; // Inside
205 //const Double_t ksecDip2 = 4.553*fgkmm;
206 //
207 const Double_t ksecX6 = +10.830*fgkmm;
208 const Double_t ksecY6 = +16.858*fgkmm;
209 const Double_t ksecR6 = +0.6*fgkmm; // Inside
210 const Double_t ksecX7 = +11.581*fgkmm;
211 const Double_t ksecY7 = +13.317*fgkmm;
212 const Double_t ksecR7 = -0.6*fgkmm; // Outside
213 //const Double_t ksecDip3 = 6.978*fgkmm;
214 //
215 const Double_t ksecX8 = -0.733*fgkmm;
216 const Double_t ksecY8 = +17.486*fgkmm;
217 const Double_t ksecR8 = +0.6*fgkmm; // Inside
218 const Double_t ksecX9 = +0.562*fgkmm;
219 const Double_t ksecY9 = +14.486*fgkmm;
220 const Double_t ksecR9 = -0.6*fgkmm; // Outside
221 //const Double_t ksecDip4 = 6.978*fgkmm;
222 //
223 const Double_t ksecX10 = -12.252*fgkmm;
224 const Double_t ksecY10 = +16.298*fgkmm;
225 const Double_t ksecR10 = +0.6*fgkmm; // Inside
226 const Double_t ksecX11 = -10.445*fgkmm;
227 const Double_t ksecY11 = +13.162*fgkmm;
228 const Double_t ksecR11 = -0.6*fgkmm; // Outside
229 //const Double_t ksecDip5 = 6.978*fgkmm;
230 //
231 const Double_t ksecX12 = -22.276*fgkmm;
232 const Double_t ksecY12 = +12.948*fgkmm;
233 const Double_t ksecR12 = +0.85*fgkmm; // Inside
234 //const Double_t ksecX13 = *fgkmm;
235 //const Double_t ksecY13 = *fgkmm;
236 const Double_t ksecR13 = -0.8*fgkmm; // Outside
237 const Double_t ksecAngleSide13 = 36.0*fgkDegree;
238 //
239 const Int_t ksecNRadii = 20;
240 const Int_t ksecNPointsPerRadii = 4;
241 const Int_t ksecNCoolingTubeDips = 6;
242 // Since the Rounded parts are aproximated by a regular polygon and
243 // a cooling tube of the propper diameter must fit, a scaling factor
244 // increases the size of the polygon for the tube to fit.
245 //const Double_t ksecRCoolScale = 1./TMath::Cos(TMath::Pi()/
246 // (Double_t)ksecNPointsPerRadii);
247 const Double_t ksecZEndLen = 30.00*fgkmm;
248 //const Double_t ksecZFlangLen= 45.00*fgkmm;
249 const Double_t ksecTl = 0.860*fgkmm;
250 const Double_t ksecCthick2 = 0.600*fgkmm;
251 //const Double_t ksecCthick3 = 1.800*fgkmm;
252 //const Double_t ksecSidelen = 22.00*fgkmm;
253 //const Double_t ksecSideD5 = 3.679*fgkmm;
254 //const Double_t ksecSideD12 = 7.066*fgkmm;
255 const Double_t ksecRCoolOut = 2.400*fgkmm;
256 const Double_t ksecRCoolIn = 2.000*fgkmm;
257 const Double_t ksecDl1 = 5.900*fgkmm;
258 const Double_t ksecDl2 = 8.035*fgkmm;
259 const Double_t ksecDl3 = 4.553*fgkmm;
260 const Double_t ksecDl4 = 6.978*fgkmm;
261 const Double_t ksecDl5 = 6.978*fgkmm;
262 const Double_t ksecDl6 = 6.978*fgkmm;
263 const Double_t ksecCoolTubeThick = 0.04*fgkmm;
264 const Double_t ksecCoolTubeROuter = 2.6*fgkmm;
265 const Double_t ksecCoolTubeFlatX = 3.696*fgkmm;
266 const Double_t ksecCoolTubeFlatY = 0.68*fgkmm;
267 //const Double_t ksecBeamX0 = 0.0*fgkmm; // guess
268 //const Double_t ksecBeamY0 = (15.223+40.)*fgkmm; // guess
269 //
270 const Int_t ksecNPoints = (ksecNPointsPerRadii+1)*ksecNRadii + 8;
271 Double_t secX[ksecNRadii] = {ksecX0,ksecX1,-1000.0,ksecX2 ,ksecX3 ,-1000.0,
272 ksecX4,ksecX5,-1000.0,ksecX6 ,ksecX7 ,-1000.0,
273 ksecX8,ksecX9,-1000.0,ksecX10,ksecX11,-1000.0,
274 ksecX12,-1000.0};
275 Double_t secY[ksecNRadii] = {ksecY0,ksecY1,-1000.0,ksecY2 ,ksecY3 ,-1000.0,
276 ksecY4,ksecY5,-1000.0,ksecY6 ,ksecY7 ,-1000.0,
277 ksecY8,ksecY9,-1000.0,ksecY10,ksecY11,-1000.0,
278 ksecY12,-1000.0};
279 Double_t secR[ksecNRadii] ={ksecR0 ,ksecR1 ,-.5*ksecDipLength-ksecDipRadii,
280 ksecR2 ,ksecR3 ,-.5*ksecDipLength-ksecDipRadii,
281 ksecR4 ,ksecR5 ,-.5*ksecDipLength-ksecDipRadii,
282 ksecR6 ,ksecR7 ,-.5*ksecDipLength-ksecDipRadii,
283 ksecR8 ,ksecR9 ,-.5*ksecDipLength-ksecDipRadii,
284 ksecR10,ksecR11,-.5*ksecDipLength-ksecDipRadii,
285 ksecR12,ksecR13};/*
286 Double_t secDip[ksecNRadii]={0.0,0.0,ksecDip0,0.0,0.0,ksecDip1,
287 0.0,0.0,ksecDip2,0.0,0.0,ksecDip3,
288 0.0,0.0,ksecDip4,0.0,0.0,ksecDip5,
289 0.0,0.0};*/
290 Double_t secX2[ksecNRadii];
291 Double_t secY2[ksecNRadii];
292 Double_t secR2[ksecNRadii] = {
293 ksecR0,ksecR1,ksecRCoolOut,ksecR2,ksecR3,ksecRCoolOut,ksecR4,ksecR5,
294 ksecRCoolOut,ksecR6,ksecR7,ksecRCoolOut,ksecR8,ksecR9,ksecRCoolOut,
295 ksecR10,ksecR11,ksecRCoolOut,ksecR12,ksecR13};
296 Double_t secDip2[ksecNCoolingTubeDips]={ksecDl1,ksecDl2,ksecDl3,
297 ksecDl4,ksecDl5,ksecDl6};
298 Double_t secX3[ksecNRadii];
299 Double_t secY3[ksecNRadii];
300 const Int_t ksecDipIndex[ksecNCoolingTubeDips] = {2,5,8,11,14,17};
301 Double_t secAngleStart[ksecNRadii];
302 Double_t secAngleEnd[ksecNRadii];
303 Double_t secAngleStart2[ksecNRadii];
304 Double_t secAngleEnd2[ksecNRadii];
305 Double_t secAngleTurbo[ksecNCoolingTubeDips] = {0.0,0.0,0.0,0.0,0.0,0.0};
306 //Double_t secAngleStart3[ksecNRadii];
307 //Double_t secAngleEnd3[ksecNRadii];
308 Double_t xpp[ksecNPoints],ypp[ksecNPoints];
309 Double_t xpp2[ksecNPoints],ypp2[ksecNPoints];
310 Double_t *xp[ksecNRadii],*xp2[ksecNRadii];
311 Double_t *yp[ksecNRadii],*yp2[ksecNRadii];
312 TGeoXtru *sA0,*sA1,*sB0,*sB1;
313 TGeoEltu *sTA0,*sTA1;
314 TGeoTube *sTB0,*sTB1,*sM0;
315 TGeoRotation *rot;
316 TGeoTranslation *trans;
317 TGeoCombiTrans *rotrans;
318 Double_t t,t0,t1,a,b,x0,y0,x1,y1;
319 Int_t i,j,k,m;
320 Bool_t tst;
321
322 if(moth==0){
323 Error("CarbonFiberSector","moth=%p",moth);
c789ee28 324 return moth;
db486a6e 325 } // end if moth==0
326 //SetDebug(3);
327 for(i=0;i<ksecNRadii;i++){
328 xp[i] = &(xpp[i*(ksecNPointsPerRadii+1)]);
329 yp[i] = &(ypp[i*(ksecNPointsPerRadii+1)]);
330 xp2[i] = &(xpp2[i*(ksecNPointsPerRadii+1)]);
331 yp2[i] = &(ypp2[i*(ksecNPointsPerRadii+1)]);
332 secX2[i] = secX[i];
333 secY2[i] = secY[i];
334 secX3[i] = secX[i];
335 secY3[i] = secY[i];
336 } // end for i
337
338 // Find starting and ending angles for all but cooling tube sections
339 secAngleStart[0] = 0.5*ksecAngleSide13;
340 for(i=0;i<ksecNRadii-2;i++){
341 tst = kFALSE;
342 for(j=0;j<ksecNCoolingTubeDips;j++) tst = tst||i==ksecDipIndex[j];
343 if(tst) continue;
344 tst = kFALSE;
345 for(j=0;j<ksecNCoolingTubeDips;j++) tst = tst||(i+1)==ksecDipIndex[j];
346 if(tst) j = i+2;
347 else j = i+1;
348 AnglesForRoundedCorners(secX[i],secY[i],secR[i],
349 secX[j],secY[j],secR[j],t0,t1);
350 secAngleEnd[i] = t0;
351 secAngleStart[j] = t1;
352 if(secR[i]>0.0&&secR[j]>0.0)if(secAngleStart[i]>secAngleEnd[i])
353 secAngleEnd[i] += 360.0;
354 secAngleStart2[i] = secAngleStart[i];
355 secAngleEnd2[i] = secAngleEnd[i];
356 } // end for i
357 secAngleEnd[ksecNRadii-2] = secAngleStart[ksecNRadii-2] +
358 (secAngleEnd[ksecNRadii-5]-
359 secAngleStart[ksecNRadii-5]);
360 if(secAngleEnd[ksecNRadii-2]<0.0) secAngleEnd[ksecNRadii-2] += 360.0;
361 secAngleStart[ksecNRadii-1] = secAngleEnd[ksecNRadii-2] - 180.0;
362 secAngleEnd[ksecNRadii-1] = secAngleStart[0];
363 secAngleStart2[ksecNRadii-2] = secAngleStart[ksecNRadii-2];
364 secAngleEnd2[ksecNRadii-2] = secAngleEnd[ksecNRadii-2];
365 secAngleStart2[ksecNRadii-1] = secAngleStart[ksecNRadii-1];
366 secAngleEnd2[ksecNRadii-1] = secAngleEnd[ksecNRadii-1];
367 // Find location of circle last rounded corner.
368 i = 0;
369 j = ksecNRadii-2;
370 t0 = TanD(secAngleStart[i]-90.);
371 t1 = TanD(secAngleEnd[j]-90.);
372 t = secY[i] - secY[j];
373 // Note, secR[i=0] <0; secR[j=18]>0; and secR[j+1=19] <0
374 t += (-secR[i]+secR[j+1])*SinD(secAngleStart[i]);
375 t -= (secR[j]-secR[j+1])*SinD(secAngleEnd[j]);
376 t += t1*secX[j] - t0*secX[i];
377 t += t1*(secR[j]-secR[j+1])*CosD(secAngleEnd[j]);
378 t -= t0*(-secR[i]+secR[j+1])*CosD(secAngleStart[i]);
379 secX[ksecNRadii-1] = t/(t1-t0);
380 secY[ksecNRadii-1] = TanD(90.+0.5*ksecAngleSide13)*
381 (secX[ksecNRadii-1]-secX[0]) + secY[0];
382 secX2[ksecNRadii-1] = secX[ksecNRadii-1];
383 secY2[ksecNRadii-1] = secY[ksecNRadii-1];
384 secX3[ksecNRadii-1] = secX[ksecNRadii-1];
385 secY3[ksecNRadii-1] = secY[ksecNRadii-1];
386 // find location of cooling tube centers
387 for(i=0;i<ksecNCoolingTubeDips;i++){
388 j = ksecDipIndex[i];
389 x0 = secX[j-1] + TMath::Abs(secR[j-1])*CosD(secAngleEnd[j-1]);
390 y0 = secY[j-1] + TMath::Abs(secR[j-1])*SinD(secAngleEnd[j-1]);
391 x1 = secX[j+1] + TMath::Abs(secR[j+1])*CosD(secAngleStart[j+1]);
392 y1 = secY[j+1] + TMath::Abs(secR[j+1])*SinD(secAngleStart[j+1]);
393 t0 = TMath::Sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
394 t = secDip2[i]/t0;
395 a = x0+(x1-x0)*t;
396 b = y0+(y1-y0)*t;
397 if(a+b*(a-x0)/(b-y0)>0.0){
398 secX[j] = a + TMath::Abs(y1-y0)*2.0*ksecDipRadii/t0;
399 secY[j] = b - TMath::Sign(2.0*ksecDipRadii,y1-y0)*(x1-x0)/t0;
400 secX2[j] = a + TMath::Abs(y1-y0)*ksecTl/t0;
401 secY2[j] = b - TMath::Sign(ksecTl,y1-y0)*(x1-x0)/t0;
402 secX3[j] = a + TMath::Abs(y1-y0)*(2.0*ksecDipRadii-
403 0.5*ksecCoolTubeFlatY)/t0;
404 secY3[j] = b - TMath::Sign(2.0*ksecDipRadii-0.5*ksecCoolTubeFlatY,
405 y1-y0)*(x1-x0)/t0;
406 }else{
407 secX[j] = a - TMath::Abs(y1-y0)*2.0*ksecDipRadii/t0;
408 secY[j] = b + TMath::Sign(2.0*ksecDipRadii,y1-y0)*(x1-x0)/t0;
409 secX2[j] = a - TMath::Abs(y1-y0)*ksecTl/t0;
410 secY2[j] = b + TMath::Sign(ksecTl,y1-y0)*(x1-x0)/t0;
411 secX3[j] = a - TMath::Abs(y1-y0)*(2.0*ksecDipRadii-
412 0.5*ksecCoolTubeFlatY)/t0;
413 secY3[j] = b + TMath::Sign(2.0*ksecDipRadii-0.5*ksecCoolTubeFlatY,
414 y1-y0)*(x1-x0)/t0;
415 } // end if
416 // Set up Start and End angles to correspond to start/end of dips.
417 t1 = (secDip2[i]-TMath::Abs(secR[j]))/t0;
418 secAngleStart[j] = TMath::RadToDeg()*TMath::ATan2(
419 y0+(y1-y0)*t1-secY[j],x0+(x1-x0)*t1-secX[j]);
420 if(secAngleStart[j]<0.0) secAngleStart[j] += 360.0;
421 secAngleStart2[j] = secAngleStart[j];
422 t1 = (secDip2[i]+TMath::Abs(secR[j]))/t0;
423 secAngleEnd[j] = TMath::RadToDeg()*TMath::ATan2(
424 y0+(y1-y0)*t1-secY[j],x0+(x1-x0)*t1-secX[j]);
425 if(secAngleEnd[j]<0.0) secAngleEnd[j] += 360.0;
426 secAngleEnd2[j] = secAngleEnd[j];
427 if(secAngleEnd[j]>secAngleStart[j]) secAngleEnd[j] -= 360.0;
428 secR[j] = TMath::Sqrt(secR[j]*secR[j]+4.0*ksecDipRadii*ksecDipRadii);
429 } // end if
430 // Spcial cases
431 secAngleStart2[8] -= 360.;
432 secAngleStart2[11] -= 360.;
433 //
434 SPDsectorShape(ksecNRadii,secX,secY,secR,secAngleStart,secAngleEnd,
435 ksecNPointsPerRadii,m,xp,yp);
436 // Fix up dips to be square.
437 for(i=0;i<ksecNCoolingTubeDips;i++){
438 j = ksecDipIndex[i];
439 t = 0.5*ksecDipLength+ksecDipRadii;
440 t0 = TMath::RadToDeg()*TMath::ATan(2.0*ksecDipRadii/t);
441 t1 = secAngleEnd[j] + t0;
442 t0 = secAngleStart[j] - t0;
443 x0 = xp[j][1] = secX[j] + t*CosD(t0);
444 y0 = yp[j][1] = secY[j] + t*SinD(t0);
445 x1 = xp[j][ksecNPointsPerRadii-1] = secX[j] + t*CosD(t1);
446 y1 = yp[j][ksecNPointsPerRadii-1] = secY[j] + t*SinD(t1);
447 t0 = 1./((Double_t)(ksecNPointsPerRadii-2));
448 for(k=2;k<ksecNPointsPerRadii-1;k++){// extra points spread them out.
449 t = ((Double_t)(k-1))*t0;
450 xp[j][k] = x0+(x1-x0)*t;
451 yp[j][k] = y0+(y1-y0)*t;
452 } // end for k
453 secAngleTurbo[i] = -TMath::RadToDeg()*TMath::ATan2(y1-y0,x1-x0);
454 if(GetDebug(3)){
c789ee28 455 Info("CarbonFiberSector","i=%d angle=%f x0,y0{%f,%f} "
456 "x1y1={%f,%f,}",i,secAngleTurbo[i],x0,0,x1,y1);
db486a6e 457 } // end if
458 } // end for i
459 sA0 = new TGeoXtru(2);
460 sA0->SetName("ITS SPD Carbon fiber support Sector A0");
461 sA0->DefinePolygon(m,xpp,ypp);
462 sA0->DefineSection(0,-ksecDz);
463 sA0->DefineSection(1,ksecDz);
464 //
465 InsidePoint(xpp[m-1],ypp[m-1],xpp[0],ypp[0],xpp[1],ypp[1],
466 ksecCthick,xpp2[0],ypp2[0]);
467 for(i=1;i<m-1;i++){
468 j = i/(ksecNPointsPerRadii+1);
469 InsidePoint(xpp[i-1],ypp[i-1],xpp[i],ypp[i],xpp[i+1],ypp[i+1],
470 ksecCthick,xpp2[i],ypp2[i]);
471 } // end for i
472 InsidePoint(xpp[m-2],ypp[m-2],xpp[m-1],ypp[m-1],xpp[0],ypp[0],
473 ksecCthick,xpp2[m-1],ypp2[m-1]);
474 // Fix center value of cooling tube dip.
475 // find location of cooling tube centers
476 for(i=0;i<ksecNCoolingTubeDips;i++){
477 j = ksecDipIndex[i];
478 x0 = xp2[j][1];
479 y0 = yp2[j][1];
480 x1 = xp2[j][ksecNPointsPerRadii-1];
481 y1 = yp2[j][ksecNPointsPerRadii-1];
482 t0 = TMath::Sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
483 t = secDip2[i]/t0;
484 for(k=2;k<ksecNPointsPerRadii-1;k++){// extra points spread them out.
485 t = ((Double_t)(k-1))*t0;
486 xp2[j][k] = x0+(x1-x0)*t;
487 yp2[j][k] = y0+(y1-y0)*t;
488 } // end for k
489 } // end for i
490 sA1 = new TGeoXtru(2);
491 sA1->SetName("ITS SPD Carbon fiber support Sector Air A1");
492 sA1->DefinePolygon(m,xpp2,ypp2);
493 sA1->DefineSection(0,-ksecDz);
494 sA1->DefineSection(1,ksecDz);
495 //
496 // Error in TGeoEltu. Semi-axis X must be < Semi-axis Y (?).
497 sTA0 = new TGeoEltu("ITS SPD Cooling Tube TA0",
498 0.5* ksecCoolTubeFlatY, 0.5* ksecCoolTubeFlatX,ksecDz);
499 sTA1 = new TGeoEltu("ITS SPD Cooling Tube coolant TA1",
500 sTA0->GetA()-ksecCoolTubeThick,
501 sTA0->GetB()-ksecCoolTubeThick,ksecDz);
502 //
503 SPDsectorShape(ksecNRadii,secX2,secY2,secR2,secAngleStart2,secAngleEnd2,
504 ksecNPointsPerRadii,m,xp,yp);
505 //
506 sB0 = new TGeoXtru(2);
507 sB0->SetName("ITS SPD Carbon fiber support Sector End B0");
508 sB0->DefinePolygon(m,xpp,ypp);
509 sB0->DefineSection(0,ksecDz);
510 sB0->DefineSection(1,ksecDz+ksecZEndLen);
511 //
512 InsidePoint(xpp[m-1],ypp[m-1],xpp[0],ypp[0],xpp[1],ypp[1],
513 ksecCthick2,xpp2[0],ypp2[0]);
514 for(i=1;i<m-1;i++){
515 t = ksecCthick2;
516 for(k=0;k<ksecNCoolingTubeDips;k++)
517 if((i/(ksecNPointsPerRadii+1))==ksecDipIndex[k])
518 if(!(ksecDipIndex[k]*(ksecNPointsPerRadii+1)==i ||
519 ksecDipIndex[k]*(ksecNPointsPerRadii+1)+
520 ksecNPointsPerRadii==i ))
521 t = ksecRCoolOut-ksecRCoolIn;
522 InsidePoint(xpp[i-1],ypp[i-1],xpp[i],ypp[i],xpp[i+1],ypp[i+1],
523 t,xpp2[i],ypp2[i]);
524 } // end for i
525 InsidePoint(xpp[m-2],ypp[m-2],xpp[m-1],ypp[m-1],xpp[0],ypp[0],
526 ksecCthick2,xpp2[m-1],ypp2[m-1]);
527 sB1 = new TGeoXtru(2);
528 sB1->SetName("ITS SPD Carbon fiber support Sector Air End B1");
529 sB1->DefinePolygon(m,xpp2,ypp2);
530 sB1->DefineSection(0,ksecDz);
531 sB1->DefineSection(1,ksecDz+ksecLen);
532 sTB0 = new TGeoTube("ITS SPD Cooling Tube End TB0",0.0,
533 0.5*ksecCoolTubeROuter,0.5*ksecLen);
534 sTB1 = new TGeoTube("ITS SPD Cooling Tube End coolant TB0",0.0,
535 sTB0->GetRmax()-ksecCoolTubeThick,0.5*ksecLen);
536 //
537 sM0 = new TGeoTube("ITS SPD Sensitive Virutual Volume M0",0.0,8.0,
538 sA0->GetZ(1)+sB0->GetZ(1));
539 //
540 if(GetDebug()){
541 sM0->InspectShape();
542 sA0->InspectShape();
543 sA1->InspectShape();
544 sB0->InspectShape();
545 sB1->InspectShape();
546 } // end if GetDebug
547 //
548 TGeoVolume *vM0,*vA0,*vA1,*vTA0,*vTA1,*vB0,*vB1,*vTB0,*vTB1;
549 vM0 = new TGeoVolume("ITSSPDSensitiveVirtualvolumeM0",sM0,medSPDair);
550 vM0->SetVisibility(kTRUE);
551 vM0->SetLineColor(7); // light Blue
552 vM0->SetLineWidth(1);
553 vM0->SetFillColor(vM0->GetLineColor());
554 vM0->SetFillStyle(4090); // 90% transparent
555 vA0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorA0",sA0,medSPDcf);
556 vA0->SetVisibility(kTRUE);
557 vA0->SetLineColor(4); // Blue
558 vA0->SetLineWidth(1);
559 vA0->SetFillColor(vA0->GetLineColor());
560 vA0->SetFillStyle(4010); // 10% transparent
561 vA1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorAirA1",sA1,medSPDair);
562 vA1->SetVisibility(kTRUE);
563 vA1->SetLineColor(7); // light Blue
564 vA1->SetLineWidth(1);
565 vA1->SetFillColor(vA1->GetLineColor());
566 vA1->SetFillStyle(4090); // 90% transparent
567 vTA0 = new TGeoVolume("ITSSPDCoolingTubeTA0",sTA0,medSPDss);
568 vTA0->SetVisibility(kTRUE);
569 vTA0->SetLineColor(1); // Black
570 vTA0->SetLineWidth(1);
571 vTA0->SetFillColor(vTA0->GetLineColor());
572 vTA0->SetFillStyle(4000); // 0% transparent
573 vTA1 = new TGeoVolume("ITSSPDCoolingTubeFluidTA1",sTA1,medSPDcoolfl);
574 vTA1->SetVisibility(kTRUE);
575 vTA1->SetLineColor(6); // Purple
576 vTA1->SetLineWidth(1);
577 vTA1->SetFillColor(vTA1->GetLineColor());
578 vTA1->SetFillStyle(4000); // 0% transparent
579 vB0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndB0",sB0,medSPDcf);
580 vB0->SetVisibility(kTRUE);
581 vB0->SetLineColor(4); // Blue
582 vB0->SetLineWidth(1);
583 vB0->SetFillColor(vB0->GetLineColor());
584 vB0->SetFillStyle(4010); // 10% transparent
585 vB1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndAirB1",
586 sB1,medSPDair);
587 vB1->SetVisibility(kTRUE);
588 vB1->SetLineColor(7); // light Blue
589 vB1->SetLineWidth(1);
590 vB1->SetFillColor(vB1->GetLineColor());
591 vB1->SetFillStyle(4090); // 90% transparent
592 vTB0 = new TGeoVolume("ITSSPDCoolingTubeEndTB0",sTB0,medSPDss);
593 vTB0->SetVisibility(kTRUE);
594 vTB0->SetLineColor(1); // Black
595 vTB0->SetLineWidth(1);
596 vTB0->SetFillColor(vTB0->GetLineColor());
597 vTB0->SetFillStyle(4000); // 0% transparent
598 vTB1 = new TGeoVolume("ITSSPDCoolingTubeEndFluidTB1",sTB1,medSPDcoolfl);
599 vTB1->SetVisibility(kTRUE);
600 vTB1->SetLineColor(6); // Purple
601 vTB1->SetLineWidth(1);
602 vTB1->SetFillColor(vTB1->GetLineColor());
603 vTB1->SetFillStyle(4000); // 0% transparent
604 //
605 moth->AddNode(vM0,1,0); // Add virtual volume to mother
606 vA0->AddNode(vA1,1,0); // Put air inside carbon fiber.
607 vB0->AddNode(vB1,1,0); // Put air inside carbon fiber.
608 vTA0->AddNode(vTA1,1,0); // Put air inside carbon fiber.
609 vTB0->AddNode(vTB1,1,0); // Put air inside carbon fiber.
610 for(i=0;i<ksecNCoolingTubeDips;i++){
611 x0 = secX3[ksecDipIndex[i]];
612 y0 = secY3[ksecDipIndex[i]];
613 t = 90.0-secAngleTurbo[i];
614 trans = new TGeoTranslation("",x0,y0,0.5*(sB1->GetZ(0)+sB1->GetZ(1)));
615 vB1->AddNode(vTB0,i+1,trans);
616 rot = new TGeoRotation("",0.0,0.0,t);
617 rotrans = new TGeoCombiTrans("",x0,y0,0.0,rot);
618 vM0->AddNode(vTA0,i+1,rotrans);
619 delete rot; // rot owned by AliITSv11GeometerySPD::CarbonFiberSector
620 } // end for i
621 vM0->AddNode(vA0,1,0);
622 vM0->AddNode(vB0,1,0);
623 // Reflection.
624 vM0->AddNode(vB0,2,new TGeoRotation("",90.,0.,90.,90.,180.,0.));
625 if(GetDebug()){
626 vM0->PrintNodes();
627 vA0->PrintNodes();
628 vA1->PrintNodes();
629 vB0->PrintNodes();
630 vB1->PrintNodes();
631 } // end if GetDebug
632 //
c789ee28 633 return moth;
db486a6e 634}
635//----------------------------------------------------------------------
636void AliITSv11GeometrySPD::SPDsectorShape(Int_t n,const Double_t *xc,
637const Double_t *yc,const Double_t *r,const Double_t *ths,const Double_t *the,
638 Int_t npr,Int_t &m,Double_t **xp,Double_t **yp){
639 // Code to compute the points that make up the shape of the SPD
640 // Carbon fiber support sections
641 // Inputs:
642 // Int_t n Size of arrays xc,yc, and r.
643 // Double_t *xc Array of x values for radii centers.
644 // Double_t *yc Array of y values for radii centers.
645 // Double_t *r Array of signed radii values.
646 // Double_t *ths Array of starting angles [degrees].
647 // Double_t *the Array of ending angles [degrees].
648 // Int_t npr The number of lines segments to aproximate the arc.
649 // Outputs:
650 // Int_t m The number of enetries in the arrays *xp[npr+1]
651 // and *yp[npr+1].
652 // Double_t **xp Array of x coordinate values of the line segments
653 // which make up the SPD support sector shape.
654 // Double_t **yp Array of y coordinate values of the line segments
655 // which make up the SPD support sector shape.
656 // Return:
657 // none.
658 Int_t i,k;
659 Double_t t,t0,t1;
660
661 m = n*(npr+1);
662 if(GetDebug(2)){
c789ee28 663 Info("SPDsectorShape"," X \t Y \t R \t S \t E%d", m);
db486a6e 664 for(i=0;i<n;i++){
c789ee28 665 Info("SPDsectorShape","{%f,%f,%f,%f,%f}",
666 xc[i],yc[i],r[i],ths[i],the[i]);
db486a6e 667 } // end for i
668 } // end if GetDebug
669 //
670 if(GetDebug(3)) cout <<"Double_t sA0 = ["<< n*(npr+1)+1<<"][";
671 if(GetDebug(4)) cout <<"3]{";
672 else if(GetDebug(3)) cout <<"2]{";
673 t0 = (Double_t)npr;
674 for(i=0;i<n;i++){
675 t1 = (the[i]-ths[i])/t0;
676 if(GetDebug(5)) cout<<"t1="<< t1<<endl;
677 for(k=0;k<=npr;k++){
678 t=ths[i]+((Double_t)k)*t1;
679 xp[i][k] = TMath::Abs(r[i])*CosD(t)+xc[i];
680 yp[i][k] = TMath::Abs(r[i])*SinD(t)+yc[i];
681 if(GetDebug(3)){
682 cout << "{"<<xp[i][k]<<","<<yp[i][k];
683 if(GetDebug(4)) cout <<","<<t;
684 cout <<"},";
685 } // end if GetDebug
686 } // end for k
687 if(GetDebug(3)) cout << endl;
688 } // end of i
689 if(GetDebug(3)) cout<<"{"<<xp[0][0]<<","<<yp[0][0];
690 if(GetDebug(4)) cout<<","<< ths[0];
691 if(GetDebug(3)) cout<<"}}"<<endl;
692 //
693 return;
694}
695//______________________________________________________________________
c789ee28 696TGeoVolume* AliITSv11GeometrySPD::CreateHalfStaveGroundFoil(){
db486a6e 697 // Define the detail SPD Half Stave geometry.
698 // Inputs:
699 // none.
700 // Outputs:
701 // none.
702 // Return:
c789ee28 703 // TGeoVolume* The volume containing the half stave grounding foil.
704
705 TGeoManager *mgr = gGeoManager;
706 TGeoMedium *medSPDair = 0; // SPD Air
707 TGeoMedium *medSPDCu = 0; // SPD Copper conductor
708 TGeoMedium *medSPDSiNs = 0; // SPD Silicon non-sensitive material
709 TGeoMedium *medSPDSiSv = 0; // SPD Silicon Sensitive material
710 TGeoMedium *medSPDStaveGlue = 0; // SPD Glue used on Half Staves
711
712 medSPDair = mgr->GetMedium("ITSspdAir");
713 medSPDCu = mgr->GetMedium("ITSspdCopper");
714 medSPDSiNs = mgr->GetMedium("ITSspdSiliconNonSensitive");
715 medSPDSiSv = mgr->GetMedium("ITSspdSiliconSensitive");
716 medSPDStaveGlue = mgr->GetMedium("ITSspdStaveGlue");
717 //
718 Double_t origin[3] = {0.0,0.0,0.0};
719 TGeoBBox *sA0,*sA1,*sA3,*sB2;
720 TGeoArb8 *sA2;
721 TGeoTubeSeg *sB1;
722
723 sA0 = new TGeoBBox("ITS SPD Half Stave Grounding Foil A0",
724 0.5*fkGrdFoilWidthA,0.5*fkGrdFoilThick,0.5*(
725 fkGrdFoilLngA+fkGrdFoilLngB+fkGrdFoilLngC),origin);
726 origin[2] = 0.5*fkGrdFoilLngA;
727 sA1 = new TGeoBBox("ITS SPD Half Stave Gounding Foil Copper A1",
728 0.5*fkGrdFoilWidthA,0.5*fkGrdFoilThick,0.5*fkGrdFoilLngA,origin);
729 origin[0] = 0.5*(fkGrdFoilWidthA-fkGrdFoilWidthC);
730 origin[2] = -(fkGrdFoilLngA+fkGrdFoilLngB+0.5*fkGrdFoilLngC);
731 sA3 = new TGeoBBox("ITS SPD Half Stave Gounding Foil copper A3",
732 0.5*fkGrdFoilWidthC,0.5*fkGrdFoilThick,0.5*fkGrdFoilLngC,origin);
733 sA2 = new TGeoArb8("ITS SPD Half Stave Gounding Foil Copper A2",
734 0.5*fkGrdFoilLngB);
735 sA2->SetVertex(0,-sA1->GetDX(),+sA1->GetDY());
736 sA2->SetVertex(1,+sA1->GetDX(),+sA1->GetDY());
737 sA2->SetVertex(2,+sA1->GetDX(),-sA1->GetDY());
738 sA2->SetVertex(3,-sA1->GetDX(),-sA1->GetDY());
739 sA2->SetVertex(4,origin[0]-sA3->GetDX(),+sA3->GetDY());
740 sA2->SetVertex(5,origin[0]+sA3->GetDX(),+sA3->GetDY());
741 sA2->SetVertex(6,origin[0]+sA3->GetDX(),-sA3->GetDY());
742 sA2->SetVertex(7,origin[0]-sA3->GetDX(),-sA3->GetDY());
743 sB1 = new TGeoTubeSeg("ITS SPD Half Stave Ground Foil Hole B1",
744 0.0,0.5*fkGrdFoilHoleWidthAB,sA1->GetDY(),0.,180.);
745 sB2 = new TGeoBBox("ITS SPD Half Stave Ground Foil Hole B2",
746 0.5*fkGrdFoilHoleWidthAB,sA1->GetDY(),
747 0.5*(fkGrdFoilHoleLengthAB-fkGrdFoilHoleWidthAB),0);
748 //
749 TGeoVolume *vA0,*vA1,*vA2,*vA3,*vB1,*vB2;
750 vA0 = new TGeoVolume("ITSSPDHalfStaveGroundFoilA0",sA0,medSPDair);
751 vA0->SetVisibility(kTRUE);
752 vA0->SetLineColor(7); // light Blue
753 vA0->SetLineWidth(1);
754 vA0->SetFillColor(vA0->GetLineColor());
755 vA0->SetFillStyle(4090); // 90% transparent
756 vB1 = new TGeoVolume("ITSSPDHalfStaveGoundFoilHoleB1",sB1,medSPDair);
757 vB1->SetVisibility(kTRUE);
758 vB1->SetLineColor(7); // light Blue
759 vB1->SetLineWidth(1);
760 vB1->SetFillColor(vB1->GetLineColor());
761 vB1->SetFillStyle(4090); // 90% transparent
762 vB2 = new TGeoVolume("ITSSPDHalfStaveGoundFoilHoleB2",sB2,medSPDair);
763 vB2->SetVisibility(kTRUE);
764 vB2->SetLineColor(7); // light Blue
765 vB2->SetLineWidth(1);
766 vB2->SetFillColor(vB2->GetLineColor());
767 vB2->SetFillStyle(4090); // 90% transparent
768 vA1 = new TGeoVolume("ITSSPDHalfStaveGoundFoilCopperA1",sA1,medSPDCu);
769 vA1->SetVisibility(kTRUE);
770 vA1->SetLineColor(2); // red
771 vA1->SetLineWidth(1);
772 vA1->SetFillColor(vA1->GetLineColor());
773 vA1->SetFillStyle(4000); // 00% transparent
774 vA2 = new TGeoVolume("ITSSPDHalfStaveGoundFoilCopperA2",sA2,medSPDCu);
775 vA2->SetVisibility(kTRUE);
776 vA2->SetLineColor(2); // red
777 vA2->SetLineWidth(1);
778 vA2->SetFillColor(vA2->GetLineColor());
779 vA2->SetFillStyle(4000); // 00% transparent
780 vA3 = new TGeoVolume("ITSSPDHalfStaveGoundFoilCopperA3",sA3,medSPDCu);
781 vA3->SetVisibility(kTRUE);
782 vA3->SetLineColor(2); // red
783 vA3->SetLineWidth(1);
784 vA3->SetFillColor(vA3->GetLineColor());
785 vA3->SetFillStyle(4000); // 00% transparent
786 //
787 vA0->AddNode(vA1,1,0);
788 vA0->AddNode(vA2,1,new TGeoTranslation(0.0,0.0,
789 2.0*sA1->GetDZ()+sA2->GetDz()));
790 vA0->AddNode(vA3,1,0);
791 TGeoRotation left("",-90.0,0.0,0.0), right("",90.0,0.0,0.0);
792 Int_t i,ncopyB1=1,ncopyB2=1;
793 for(i=0;i<fkGrdFoilNholesAB;i++){
794 origin[0] = 0.0;
795 origin[1] = 0.0;
796 origin[2] = fkGrdFoilHoleStartA+((Double_t)i)*fkGrdFoilHoleSpacingAB;
797 vA1->AddNode(vB1,ncopyB1,0); // double check
798 vA1->AddNode(vB2,ncopyB2,new TGeoTranslation(0.0,0.0,
799 origin[2]+0.5*fkGrdFoilHoleLengthAB));
800 vA1->AddNode(vB1,ncopyB1,0); // double check
801 } // end for i
802 for(i=0;i<fkGrdFoilNholesAB;i++){
803 origin[0] = 0.0;
804 origin[1] = 0.0;
805 origin[2] = fkGrdFoilHoleStartB+((Double_t)i)*fkGrdFoilHoleSpacingAB;
806 new TGeoTranslation(0.0,0.0,origin[2]+sB1->GetRmax());
807 vA1->AddNode(vB1,ncopyB1,0); // double check
808 vA1->AddNode(vB2,ncopyB2,new TGeoTranslation(0.0,0.0,
809 origin[2]+0.5*fkGrdFoilHoleLengthAB));
810 new TGeoTranslation(0.0,0.0,origin[2]+sB1->GetRmax()+2.0*sB2->GetDZ());
811 vA1->AddNode(vB1,ncopyB1,0); // double check
812 } // end for i
813 return vA0;
814}
815//______________________________________________________________________
816TGeoVolume* AliITSv11GeometrySPD::CreateSPDLadder(){
817 // Define the detail SPD Half Stave geometry.
818 // Inputs:
819 // none.
820 // Outputs:
db486a6e 821 // none.
c789ee28 822 // Return:
823 // TGeoVolume* of the volume containing the SPD Ladder.
824 TGeoMedium *medSPDair = 0; // SPD Air
825 TGeoMedium *medSPDCu = 0; // SPD Copper conductor
826 TGeoMedium *medSPDSiNs = 0; // SPD Silicon non-sensitive material
827 TGeoMedium *medSPDSiSv = 0; // SPD Silicon Sensitive material
828 TGeoMedium *medSPDStaveGlue = 0; // SPD Glue used on Half Staves
829 TGeoMedium *medSPDLadGlue = 0; // SPD Glue used on Half Staves
830 TGeoMedium *medSPDBumpBonds = 0; // SPD Bump bond material
831 TGeoBBox *sM0,*sGlue0,*sChip,*sBB,*sDet,*sSenDet,*sGlue1;
832 Double_t x,y,z;
db486a6e 833
c789ee28 834 TGeoManager *mgr = gGeoManager;
835 medSPDair = mgr->GetMedium("ITSspdAir");
836 medSPDCu = mgr->GetMedium("ITSspdCopper");
837 medSPDSiNs = mgr->GetMedium("ITSspdSiliconNonSensitive");
838 medSPDSiSv = mgr->GetMedium("ITSspdSiliconSensitive");
839 medSPDStaveGlue = mgr->GetMedium("ITSspdStaveGlue");
840 medSPDLadGlue = mgr->GetMedium("ITSspdLadderGlue");
841 medSPDBumpBonds = mgr->GetMedium("ITSspdBumpBond");
842 //
843 sChip = new TGeoBBox("ITS SPD Chip",0.5*fkLadChipWidth,0.5*fThickChip,
844 0.5*fkLadChipLength);
845 sGlue0 = new TGeoBBox("ITS SPD Ladder bottom Glue0",sChip->GetDX(),
846 0.5*fkLadGlue0Thick,sChip->GetDZ());
847 sDet = new TGeoBBox("ITS SPD Detector Det",0.5*fkLadDetectorWidth,
848 0.5*fThickDetector,0.5*fkLadDetectorLength);
849 sBB = new TGeoBBox("ITS SPD BumpBond BB",sDet->GetDX(),
850 0.5*fkLadBumpBondThick,sChip->GetDZ());
851 sSenDet = new TGeoBBox(CreateSensitivevolumeName("_shape"),
852 0.5*fkLadSensDetWidth,sDet->GetDY(),0.5*fkLadSensDetLength);
853 sGlue1 = new TGeoBBox("ITS SPD Ladder Top Glue1",
854 sDet->GetDX(),0.5*fkLadGlue0Thick,sDet->GetDZ());
855 x = TMath::Max(sChip->GetDX(),sDet->GetDX());
856 y = sGlue0->GetDY()+sChip->GetDY()+sBB->GetDY()+sDet->GetDY()+
857 sGlue1->GetDY();
858 z = ((Double_t) fkLadNChips)*sChip->GetDZ()+2.*0.5*fkLadChipSpacing0 +
859 ((Double_t) fkLadNChips-1)*0.5*fkLadChipSpacing1;
860 z = TMath::Max(z,sDet->GetDZ());
861 sM0 = new TGeoBBox("ITS SPD Ladder M0",x,y,z);
862 if(GetDebug()){
863 sGlue0->InspectShape();
864 sChip->InspectShape();
865 sBB->InspectShape();
866 sDet->InspectShape();
867 sSenDet->InspectShape();
868 sGlue1->InspectShape();
869 sM0->InspectShape();
870 } // end if GetDebug
871 //
872 TGeoVolume *vM0,*vGlue0,*vChip,*vBB,*vDet,*vSenDet,*vGlue1;
873 vM0 = new TGeoVolume("ITSSPDLadderM0",sM0,medSPDair);
874 vM0->SetVisibility(kFALSE);
875 vM0->SetLineColor(8); // White
876 vM0->SetLineWidth(1);
877 vM0->SetFillColor(vM0->GetLineColor());
878 vM0->SetFillStyle(4000); // 100% transparent
879 vGlue0 = new TGeoVolume("ITSSPDLadderGlue0",sGlue0,medSPDLadGlue);
880 vGlue0->SetVisibility(kTRUE);
881 vGlue0->SetLineColor(5); // Yellow
882 vGlue0->SetLineWidth(1);
883 vGlue0->SetFillColor(vGlue0->GetLineColor());
884 vGlue0->SetFillStyle(4050); // 50% transparent
885 vGlue1 = new TGeoVolume("ITSSPDLadderGlue1",sGlue1,medSPDLadGlue);
886 vGlue1->SetVisibility(kTRUE);
887 vGlue1->SetLineColor(5); // Yellow
888 vGlue1->SetLineWidth(1);
889 vGlue1->SetFillColor(vGlue1->GetLineColor());
890 vGlue1->SetFillStyle(4050); // 50% transparent
891 vChip = new TGeoVolume("ITSSPDLadderChip",sChip,medSPDSiNs);
892 vChip->SetVisibility(kTRUE);
893 vChip->SetLineColor(4); // blue
894 vChip->SetLineWidth(1);
895 vChip->SetFillColor(vChip->GetLineColor());
896 vChip->SetFillStyle(4100); // 0% transparent
897 vBB = new TGeoVolume("ITSSPDLadderBumpBond",sBB,medSPDBumpBonds);
898 vBB->SetVisibility(kTRUE);
899 vBB->SetLineColor(1); // black
900 vBB->SetLineWidth(1);
901 vBB->SetFillColor(vBB->GetLineColor());
902 vBB->SetFillStyle(4100); // 0% transparent
903 vDet = new TGeoVolume("ITSSPDLadderDet",sDet,medSPDSiNs);
904 vDet->SetVisibility(kTRUE);
905 vDet->SetLineColor(4); // blue
906 vDet->SetLineWidth(1);
907 vDet->SetFillColor(vDet->GetLineColor());
908 vDet->SetFillStyle(4100); // 0% transparent
909 vSenDet =new TGeoVolume(GetSensitivevolumeName(),sSenDet,medSPDSiSv);
910 vSenDet->SetVisibility(kTRUE);
911 vSenDet->SetLineColor(4); // blue
912 vSenDet->SetLineWidth(1);
913 vSenDet->SetFillColor(vSenDet->GetLineColor());
914 vSenDet->SetFillStyle(4100); // 0% transparent
915 //
916 vDet->AddNode(vSenDet,1,0); // Put sensitive volume inside detector
917 TGeoTranslation *tran;
918 Int_t i,nCopyGlue0=1,nCopyChip=1,nCopyBB=1;
919 Double_t xb,yg0,yc,yb,yd,yg1;
920 x = 0.0;
921 xb = -sM0->GetDX() + sDet->GetDX();
922 yg0 = -sM0->GetDY()+sGlue0->GetDY();
923 yc = yg0 + sGlue0->GetDY() + sChip->GetDY();
924 yb = yc + sChip->GetDY() + sBB->GetDY();
925 yd = yb + sBB->GetDY() + sDet->GetDY();
926 yg1 = yd + sDet->GetDY() + sGlue1->GetDY();
927 z = -sM0->GetDZ() + fkLadChipSpacing0 + sChip->GetDZ();
928 for(i=0;i<fkLadNChips;i++){
929 tran = new TGeoTranslation(x,yg0,z);
930 vM0->AddNode(vGlue0,nCopyGlue0++,tran);
931 tran = new TGeoTranslation(x,yc,z);
932 vM0->AddNode(vChip,nCopyChip++,tran);
933 tran = new TGeoTranslation(xb,yb,z);
934 vM0->AddNode(vBB,nCopyBB++,tran);
935 z += fkLadChipSpacing1 + 2.0*sChip->GetDZ();
936 } // end for i
937 tran = new TGeoTranslation(xb,yd,0.0);
938 vM0->AddNode(vDet,1,tran);
939 tran = new TGeoTranslation(xb,yg1,0.0);
940 vM0->AddNode(vGlue1,1,tran);
941 if(GetDebug()){
942 vGlue0->PrintNodes();
943 vChip->PrintNodes();
944 vBB->PrintNodes();
945 vDet->PrintNodes();
946 vSenDet->PrintNodes();
947 vGlue1->PrintNodes();
948 vM0->PrintNodes();
949 } // end if GetDebug
950 return vM0;
db486a6e 951}
952//----------------------------------------------------------------------
953void AliITSv11GeometrySPD::CreateFigure0(const Char_t *filepath,
954 const Char_t *type){
955 // Creates Figure 0 for the documentation of this class. In this
956 // specific case, it creates the X,Y cross section of the SPD suport
957 // section, center and ends. The output is written to a standard
958 // file name to the path specificed.
959 // Inputs:
960 // const Char_t *filepath Path where the figure is to be drawn
961 // const Char_t *type The type of file, default is gif.
962 // Output:
963 // none.
964 // Return:
965 // none.
966 TGeoXtru *sA0,*sA1,*sB0,*sB1;
967 //TPolyMarker *pmA,*pmB;
968 TPolyLine plA0,plA1,plB0,plB1;
969 TCanvas *canvas;
970 TLatex txt;
971 Double_t x=0.0,y=0.0;
972 Int_t i,kNRadii=6;
973
974 if(strcmp(filepath,"")){
975 Error("CreateFigure0","filepath=%s type=%s",filepath,type);
976 } // end if
977 //
978 sA0 = (TGeoXtru*) gGeoManager->GetVolume(
979 "ITSSPDCarbonFiberSupportSectorA0_1")->GetShape();
980 sA1 = (TGeoXtru*) gGeoManager->GetVolume(
981 "ITSSPDCarbonFiberSupportSectorAirA1_1")->GetShape();
982 sB0 = (TGeoXtru*) gGeoManager->GetVolume(
983 "ITSSPDCarbonFiberSupportSectorEndB0_1")->GetShape();
984 sB1 = (TGeoXtru*) gGeoManager->GetVolume(
985 "ITSSPDCarbonFiberSupportSectorEndAirB1_1")->GetShape();
986 //pmA = new TPolyMarker();
987 //pmA.SetMarkerStyle(2); // +
988 //pmA.SetMarkerColor(7); // light blue
989 //pmB = new TPolyMarker();
990 //pmB.SetMarkerStyle(5); // X
991 //pmB.SetMarkerColor(6); // purple
992 plA0.SetPolyLine(sA0->GetNvert());
993 plA0.SetLineColor(1); // black
994 plA0.SetLineStyle(1);
995 plA1.SetPolyLine(sA1->GetNvert());
996 plA1.SetLineColor(2); // red
997 plA1.SetLineStyle(1);
998 plB0.SetPolyLine(sB0->GetNvert());
999 plB0.SetLineColor(3); // Green
1000 plB0.SetLineStyle(2);
1001 plB1.SetPolyLine(sB1->GetNvert());
1002 plB1.SetLineColor(4); // Blue
1003 plB1.SetLineStyle(2);
1004 //for(i=0;i<kNRadii;i++) pmA.SetPoint(i,xyB1p[i][0],xyB1p[i][1]);
1005 //for(i=0;i<kNRadii;i++) pmB.SetPoint(i,xyB1p[i][0],xyB1p[i][1]);
1006 for(i=0;i<sA0->GetNvert();i++) plA0.SetPoint(i,sA0->GetX(i),sA0->GetY(i));
1007 for(i=0;i<sA1->GetNvert();i++) plA1.SetPoint(i,sA1->GetX(i),sA1->GetY(i));
1008 for(i=0;i<sB0->GetNvert();i++) plB0.SetPoint(i,sB0->GetX(i),sB0->GetY(i));
1009 for(i=0;i<sB1->GetNvert();i++) plB1.SetPoint(i,sB1->GetX(i),sB1->GetY(i));
1010 canvas = new TCanvas("AliITSv11GeometrySPDFig0","",1000,1000);
1011 canvas->Range(-3.,-3.,3.,3.);
1012 txt.SetTextSize(0.05);
1013 txt.SetTextAlign(33);
1014 txt.SetTextColor(1);
1015 txt.DrawLatex(2.9,2.9,"Section A-A outer Carbon Fiber surface");
1016 txt.SetTextColor(2);
1017 txt.DrawLatex(2.9,2.5,"Section A-A Inner Carbon Fiber surface");
1018 txt.SetTextColor(3);
1019 txt.DrawLatex(2.9,2.1,"Section E-E outer Carbon Fiber surface");
1020 txt.SetTextColor(4);
1021 txt.DrawLatex(2.9,1.7,"Section E-E Inner Carbon Fiber surface");
1022 plA0.Draw();
1023 plA1.Draw();
1024 plB0.Draw();
1025 plB1.Draw();
1026 //pmA.Draw();
1027 //pmB.Draw();
1028 //
1029 x = 1.0;
1030 y = -2.5;
1031 Char_t chr[3];
1032 for(i=0;i<kNRadii;i++){
1033 sprintf(chr,"%2d",i);txt.DrawLatex(x-0.1,y,chr);
1034 sprintf(chr,"%8.4",5.000);txt.DrawLatex(x,y,chr);
1035 sprintf(chr,"%8.4",5.000);txt.DrawLatex(x+0.5,y,chr);
1036 sprintf(chr,"%8.4",5.000);txt.DrawLatex(x+1.0,y,chr);
1037 sprintf(chr,"%8.4",5.000);txt.DrawLatex(x+1.5,y,chr);
1038 sprintf(chr,"%8.4",5.000);txt.DrawLatex(x+2.0,y,chr);
1039 if(kTRUE) txt.DrawLatex(x+2.5,y,"A-A/E-E");
1040 else txt.DrawLatex(x+2.5,y,"E-E");
1041 } // end for i
1042 txt.DrawLatex(x,y,"x_{c} mm");
1043 txt.DrawLatex(x+0.5,y,"y_{c} mm");
1044 txt.DrawLatex(x+1.0,y,"R mm");
1045 txt.DrawLatex(x+1.5,y,"#theta_{start}^{#circle}");
1046 txt.DrawLatex(x+2.0,y,"#theta_{end}^{#circle}");
1047 txt.DrawLatex(x+2.5,y,"Section");
1048 //
1049}
c789ee28 1050//----------------------------------------------------------------------
1051void AliITSv11GeometrySPD::CreateFigureLadder(const Char_t *filepath,
1052 const Char_t *type){
1053 // Creates Figure 0 for the documentation of this class. In this
1054 // specific case, it creates the X,Y cross section of the SPD suport
1055 // section, center and ends. The output is written to a standard
1056 // file name to the path specificed.
1057 // Inputs:
1058 // const Char_t *filepath Path where the figure is to be drawn
1059 // const Char_t *type The type of file, default is gif.
1060 // Output:
1061 // none.
1062 // Return:
1063 // none.
1064 TGeoVolume *vLad;
1065 TCanvas *canvas;
1066 TLatex txt;
1067 TGeoManager *mgr = gGeoManager;
1068
1069 if((vLad = mgr->GetVolume("ITSSPDLadderM0"))==0){
1070 printf("file=%s type=%s\n",filepath,type);
1071 vLad = CreateSPDLadder();
1072 } // end if
1073 //
1074 canvas = new TCanvas("canvas","ITS SPD Ladder",900,450);
1075 //canvas->Divide(2,1);
1076 //canvas->cd(1);
1077 //TVirtualPad *pad1 = canvas->GetPad(1);
1078 //TView *view1 = pad1->GetView();
1079 //if(view1){
1080 // view1->FrontView(pad1);
1081 //}
1082 vLad->Draw();
1083 //pad1->Update();
1084 //
1085/* canvas->cd(2);
1086 TVirtualPad *pad2 = canvas->GetPad(2);
1087 TView *view2 = pad2->GetView();
1088 if(view2){
1089 view2->TopView(pad2);
1090 }
1091 vLad->Draw();
1092*/ //pad2->Update();
1093 canvas->Update();
1094}