Adding initialization
[u/mrichter/AliRoot.git] / ITS / AliITSv11GeometrySDD.cxx
CommitLineData
db486a6e 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16//*************************************************************************
17// SDD geometry, based on ROOT geometrical modeler
18//
19// Ludovic Gaudichet (Ludovic.Gaudichet@to.infn.it)
20//*************************************************************************
21
22
23#include <stdio.h>
24#include <stdlib.h>
25
26// General Root includes
27#include <Riostream.h>
28#include <TMath.h>
c789ee28 29#include <TVectorD.h>
db486a6e 30
31// Root Geometry includes
32#include <TGeoManager.h>
33#include <TGeoVolume.h>
34#include <TGeoPcon.h>
35#include <TGeoCone.h>
36#include <TGeoTube.h>
37#include <TGeoArb8.h>
38#include <TGeoCompositeShape.h>
39#include <TGeoMatrix.h>
40#include <TGeoMaterial.h>
41#include <TGeoMedium.h>
c789ee28 42#include <TGeoNode.h>
db486a6e 43
44#include "AliITSv11Geometry.h"
45#include "AliITSv11GeometrySDD.h"
46
c789ee28 47extern TGeoManager* gGeoManager;
48
49ClassImp(AliITSv11GeomSDDcable)
50
51//----------------------------------------------------------------------
52AliITSv11GeomSDDcable::~AliITSv11GeomSDDcable() {
53 if (fInitialNode) delete fInitialNode; };
54
55
56//----------------------------------------------------------------------
57void AliITSv11GeomSDDcable::AddCheckPoint( TGeoVolume *vol, Int_t iCheckPt,
58 Double_t *coord)
59{
60 if (iCheckPt>=fVolumeArray.GetEntriesFast()) {
61 fVolumeArray.AddLast(vol);
62 TVectorD *point = new TVectorD(3,coord);
63 fPointArray.AddLast(point);
64
65 } else if ((iCheckPt >= 0)&&(iCheckPt < fVolumeArray.GetEntriesFast())) {
66 fVolumeArray.AddAt(vol, iCheckPt);
67 TVectorD *point = new TVectorD(3,coord);
68 fPointArray.AddAt(point, iCheckPt);
69 };
70};
71
72
73//----------------------------------------------------------------------
74Int_t AliITSv11GeomSDDcable::
75GetCheckPoint( Int_t iCheckPt, Int_t iOccur, Int_t motherLevel,
76 Double_t *coord ) {
77// Get the coordinate of the #i check point of the #iOccur occurrence of
78// its containing volume in the node tree. Coord. are given in the coordinate
79// system of the #motherLevel mother level of this volume
80
81 if (iCheckPt >= fVolumeArray.GetEntriesFast()) return kFALSE;
82 fCurrentVol = (TGeoVolume *) fVolumeArray.UncheckedAt(iCheckPt);
83
84 TGeoNode *mainNode;
85 if (fInitialNode==0) {
86 TObjArray *nodes = gGeoManager->GetListOfNodes();
87 if (nodes->GetEntriesFast()==0) return kFALSE;
88 mainNode = (TGeoNode *) nodes->UncheckedAt(0);
89 } else {
90 mainNode = fInitialNode;
91 };
92
93 for (Int_t i=0; i<50; i++) fNodeInd[i]=-1;
94 Int_t currentOccur = 0;
95
96 // loop to get the volume position in the tree of nodes
97 while ( CheckDaughter(0, mainNode) && (currentOccur!=iOccur) ) {
98 currentOccur++;
99 Int_t maxLevel = 0;
100 while (fNodeInd[maxLevel]!=-1) maxLevel++;
101 fNodeInd[maxLevel-1]++;
102 };
103
104 Int_t maxLevel = 0;
105 while (fNodeInd[maxLevel]!=-1) maxLevel++;
106 if (maxLevel==0) return kFALSE;
107
108 if (motherLevel>maxLevel) motherLevel = maxLevel;
109 TGeoNode *pathNode[50];
110 pathNode[0] = mainNode;
111 for (Int_t i=0; i<motherLevel; i++)
112 pathNode[i+1] = pathNode[i]->GetDaughter(fNodeInd[i]);
113
114
115 TVectorD *coordVector = (TVectorD *)fPointArray.UncheckedAt(iCheckPt);
116 Double_t localCoord[3], globalCoord[3];
117 localCoord[0] = (coordVector->GetMatrixArray())[0];
118 localCoord[1] = (coordVector->GetMatrixArray())[1];
119 localCoord[2] = (coordVector->GetMatrixArray())[2];
120
121// cout << '(' << localCoord[0] << ',' << localCoord[1] << ','
122// << localCoord[2] << ") "<< endl;
123
124 for (Int_t i=motherLevel; i>=0; i--) {
125// cout << pathNode[i]->GetName() << " > ";
126 pathNode[i]->GetMatrix()->LocalToMaster(localCoord, globalCoord);
127 localCoord[0] = globalCoord[0];
128 localCoord[1] = globalCoord[1];
129 localCoord[2] = globalCoord[2];
130// cout << '(' << localCoord[0] << ',' << localCoord[1] << ','
131// << localCoord[2] << ") "<< endl;
132 };
133 coord[0] = globalCoord[0];
134 coord[1] = globalCoord[1];
135 coord[2] = globalCoord[2];
136
137 return kTRUE;
138};
139
140
141//----------------------------------------------------------------------
142void AliITSv11GeomSDDcable::SetInitialNode(TGeoVolume *vol) {
143 if (fInitialNode) delete fInitialNode;
144 fInitialNode = new TGeoNodeMatrix(vol,0);
145 fInitialNode->SetName("nodeInConstruction");
146};
147
148
149//----------------------------------------------------------------------
150void AliITSv11GeomSDDcable:: ResetInitialNode() {
151 if (fInitialNode) delete fInitialNode;
152 fInitialNode = 0;
153};
154
155
156//----------------------------------------------------------------------
157bool AliITSv11GeomSDDcable::CheckDaughter(Int_t i, TGeoNode* node) {
158// Search where is the current volume in the tree of nodes
159// stop each time it find the pointer of the current volume
160// the path is recorded in fNodeInd[]
161// !!! recursiv function !!!
162
163 Int_t j = fNodeInd[i];
164 if (node->GetVolume()==fCurrentVol) return kTRUE;
165 TObjArray *array = node->GetNodes();
166 if (array) {
167 Int_t nDaughters = array->GetEntriesFast();
168 if (j==-1) j++;
169 while (j<nDaughters) {
170 TGeoNode *subNode = (TGeoNode *) array->UncheckedAt(j);
171 //cout << "level " << i << " " << subNode->GetName()<< endl;
172 fNodeInd[i] = j;
173 if (CheckDaughter(i+1, subNode)) return kTRUE;
174 j++;
175 };
176 fNodeInd[i] = -1;
177 };
178 return kFALSE;
179};
180
181
182
183ClassImp(AliITSv11GeomSDDcableNap)
184
185//----------------------------------------------------------------------
186//----------------------------------------------------------------------
187AliITSv11GeomSDDcableNap::
188AliITSv11GeomSDDcableNap(Double_t width, Double_t thick):AliITSv11GeomSDDcable()
189{
190 fWidth = width;
191 fThick = thick;
192};
193
194
195#include <TGeoSphere.h>
196//----------------------------------------------------------------------
197Int_t AliITSv11GeomSDDcableNap::
198CreateAndInsertCableSegment(Int_t p1, Int_t p2, TGeoVolume *motherVol) {
199
200 Double_t coord1[3], coord2[3];
201 GetCheckPoint(p1, 0, 0, coord1);
202 GetCheckPoint(p2, 0, 0, coord2);
203 cout << coord1[0] << ','<< coord1[1] << ','<< coord1[2] << endl;
204 cout << coord2[0] << ','<< coord2[1] << ','<< coord2[2] << endl;
205 coord2[0] = 5;
206 coord2[1] = 0;
207
208 Double_t cx = (coord1[0]+coord2[0])/2;
209 Double_t cy = (coord1[1]+coord2[1])/2;
210 Double_t cz = (coord1[2]+coord2[2])/2;
211 Double_t dx = coord2[0]-coord1[0];
212 Double_t dy = coord2[1]-coord1[1];
213 Double_t dz = coord2[2]-coord1[2];
214
215 Double_t length = TMath::Sqrt(dx*dx+dy*dy+dz*dz);
216 TGeoBBox *cableSeg = new TGeoBBox("", fWidth/2,fThick/2,length/2);
217
218 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
219 TGeoVolume *vCableSeg = new TGeoVolume("vCableSeg",cableSeg, airSDD);
220
221 TGeoTranslation *trans = new TGeoTranslation("",cx, cy, cz);
222 TGeoRotation*rot = new TGeoRotation("",-TMath::ATan(dx/dy)*TMath::RadToDeg(),
223 -TMath::ATan(dy/dz)*TMath::RadToDeg(),0);
224 //rot->RotateZ( -TMath::ATan(dx/dy)*TMath::RadToDeg() );
225 //rot->RotateX( -TMath::ATan(dy/dz)*TMath::RadToDeg() );
226 cout << TMath::ATan(dy/dz)*TMath::RadToDeg() << " ######### "
227 << TMath::ATan(dx/dy)*TMath::RadToDeg() << endl;
228
229 TGeoCombiTrans *combi = new TGeoCombiTrans(*trans, *rot);
230 motherVol->AddNode(vCableSeg, 1, combi);
231
232
233
234 //------------
235 TGeoSphere *sphere = new TGeoSphere(0, 0.1);
236 TGeoVolume *vSphere = new TGeoVolume("", sphere, airSDD);
237 TGeoTranslation *trC = new TGeoTranslation("", cx, cy, cz);
238 TGeoTranslation *tr1 = new TGeoTranslation("",coord1[0],coord1[1],coord1[2]);
239 TGeoTranslation *tr2 = new TGeoTranslation("",coord2[0],coord2[1],coord2[2]);
240 motherVol->AddNode(vSphere, 1, trC);
241 motherVol->AddNode(vSphere, 2, tr1);
242 motherVol->AddNode(vSphere, 3, tr2);
243
244 return kTRUE;
245};
246
247
248
249//________________________________________________________________________
250
251
252const Double_t AliITSv11GeometrySDD::fSegmentLength = 37.2*2*fgkmm;
253const Double_t AliITSv11GeometrySDD::fLadderWidth = 50.0*fgkmm;
254const Double_t AliITSv11GeometrySDD::fLadderHeight = 30.0*fgkmm;
255const Double_t AliITSv11GeometrySDD::fLadderBeamRadius = 0.6*fgkmm;
256const Double_t AliITSv11GeometrySDD::fLadderLa = 3.*fgkmm;
257const Double_t AliITSv11GeometrySDD::fLadderHa = 0.6*fgkmm; //total pifometer
258const Double_t AliITSv11GeometrySDD::fLadderLb = 3.7*fgkmm;
259const Double_t AliITSv11GeometrySDD::fLadderHb = 0.6*fgkmm; //total pifometer
260const Double_t AliITSv11GeometrySDD::fLadderl = 0.25*fgkmm;
261
262const Double_t AliITSv11GeometrySDD::fBottomBeamAngle = 56.5;
263const Double_t AliITSv11GeometrySDD::fBeamSidePhi = 65;
264
265const Double_t AliITSv11GeometrySDD::fWaferThickness = 0.3*fgkmm;
266const Double_t AliITSv11GeometrySDD::fWaferWidth = 72.5*fgkmm;
267const Double_t AliITSv11GeometrySDD::fWaferLength = 87.6*fgkmm;
268
269const Double_t AliITSv11GeometrySDD::fHybridLength = 65*fgkmm;
270const Double_t AliITSv11GeometrySDD::fHybridWidth = 41*fgkmm; // pifometer
271const Double_t AliITSv11GeometrySDD::fHybridThBridgeThick = 0.25*fgkmm; // pifometer
272
273const Double_t AliITSv11GeometrySDD::fLadWaferSep = 2*fgkmm;
274const Double_t AliITSv11GeometrySDD::fPinSuppWidth = 2.5*fgkmm; // pifometer
275const Double_t AliITSv11GeometrySDD::fPinSuppHeight = 2.*fgkmm; // pifometer
276const Double_t AliITSv11GeometrySDD::fPinSuppRmax = 2.5/2.*fgkmm;
277const Double_t AliITSv11GeometrySDD::fPinR = 1.5/2.*fgkmm;
278const Double_t AliITSv11GeometrySDD::fPinSuppLength = 5.*fgkmm;
279const Double_t AliITSv11GeometrySDD::fPinSuppThickness = 0.5*fgkmm;
280const Double_t AliITSv11GeometrySDD::fPinSuppConeAngle = 4;
281const Double_t AliITSv11GeometrySDD::fPinDXminOnSensor = (39./2.)*fgkmm; //placement of pins on sensor
282const Double_t AliITSv11GeometrySDD::fPinPinDDXOnSensor = 3*fgkmm;
283const Double_t AliITSv11GeometrySDD::fPinDYOnSensor = (52.5/2.)*fgkmm;
284
285// parameters from ALR-0752/3
286const Double_t AliITSv11GeometrySDD::fCoolPipeSuppHeight = 3.2*fgkmm;
287const Double_t AliITSv11GeometrySDD::fCoolPipeSuppMaxLength = 14*fgkmm;
288const Double_t AliITSv11GeometrySDD::fCoolPipeSuppWidthExt = 0.4*fgkmm;
289const Double_t AliITSv11GeometrySDD::fCoolPipeSuppWidthIn = 0.65*fgkmm;
290const Double_t AliITSv11GeometrySDD::fCoolPipeSuppHoleDiam = 2*fgkmm;
291const Double_t AliITSv11GeometrySDD::fCoolPipeSuppFulWidth = 5.15*fgkmm;
292const Double_t AliITSv11GeometrySDD::fCoolPipeSuppTongW = 0.8*fgkmm;
293const Double_t AliITSv11GeometrySDD::fCoolPipeSuppAngle = 22.5;
294const Double_t AliITSv11GeometrySDD::fCoolPipeSuppSlitL = 4.9*fgkmm;
295const Double_t AliITSv11GeometrySDD::fCoolPipeSuppAxeDist = 3.05*fgkmm;
296const Double_t AliITSv11GeometrySDD::fCoolPipeInnerDiam = 1.84*fgkmm;
297const Double_t AliITSv11GeometrySDD::fCoolPipeOuterDiam = 2.*fgkmm;
298
299const Double_t AliITSv11GeometrySDD::fBTBthick = 0.25 *fgkmm;
300const Double_t AliITSv11GeometrySDD::fBTBlength = 55. *fgkmm;
301const Double_t AliITSv11GeometrySDD::fBTBwidth = 18*fgkmm;
302const Double_t AliITSv11GeometrySDD::fBTBaxisAtoBottom = 4*fgkmm;
303const Double_t AliITSv11GeometrySDD::fBTBaxisAtoBase = 1.2*fgkmm;
304const Double_t AliITSv11GeometrySDD::fRadiusAminBTB = 1. *fgkmm;
305const Double_t AliITSv11GeometrySDD::fRadiusBminBTB = 0.53 *fgkmm;
306const Double_t AliITSv11GeometrySDD::fBTBHoleLength = 15 *fgkmm;
307const Double_t AliITSv11GeometrySDD::fBTBHolewidth = 6 *fgkmm;
308const Double_t AliITSv11GeometrySDD::fBTBHoleRefX = 10 *fgkmm;
309const Double_t AliITSv11GeometrySDD::fBTBHoleRefY = 6.5 *fgkmm;
310
311const Double_t AliITSv11GeometrySDD::fLay3Rmin = 130.*fgkmm; //not min! Rmin virtual tube
312const Double_t AliITSv11GeometrySDD::fLay3Rmax = 190.*fgkmm; //not min! Rmax virtual tube
313const Double_t AliITSv11GeometrySDD::fLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
314const Double_t AliITSv11GeometrySDD::fLay3LadderLength = 524.*fgkmm;
315const Double_t AliITSv11GeometrySDD::fLay3DetShortRadius = 146.0*fgkmm;
316const Double_t AliITSv11GeometrySDD::fLay3DetLongRadius = 152.0*fgkmm;
317const Double_t AliITSv11GeometrySDD::fLay3LaddTopCornerEnd = 15.6*fgkmm;
318const Int_t AliITSv11GeometrySDD::fLay3Ndet = 6;
319const Int_t AliITSv11GeometrySDD::fLay3Nladd = 14;
320const Double_t AliITSv11GeometrySDD::fLay3CoolPipeSuppH = 7.5*fgkmm;
321
322const Double_t AliITSv11GeometrySDD::fLay4Rmin = 220.*fgkmm; //not min! Rmin virtual tube
323const Double_t AliITSv11GeometrySDD::fLay4Rmax = 290.*fgkmm; //not min! Rmax virtual tube
324const Double_t AliITSv11GeometrySDD::fLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
325const Double_t AliITSv11GeometrySDD::fLay4LadderLength = 671.*fgkmm;
326const Double_t AliITSv11GeometrySDD::fLay4DetShortRadius = 235.0*fgkmm;
327const Double_t AliITSv11GeometrySDD::fLay4DetLongRadius = 240.5*fgkmm;
328const Double_t AliITSv11GeometrySDD::fLay4LaddTopCornerEnd = 15.6*fgkmm;
329const Int_t AliITSv11GeometrySDD::fLay4Ndet = 8;
330const Int_t AliITSv11GeometrySDD::fLay4Nladd = 22;
331const Double_t AliITSv11GeometrySDD::fLay4CoolPipeSuppH = 10*fgkmm;
db486a6e 332
333
334ClassImp(AliITSv11GeometrySDD)
335
336
c789ee28 337//________________________________________________________________________
db486a6e 338AliITSv11GeometrySDD::AliITSv11GeometrySDD():AliITSv11Geometry() {
db486a6e 339 SetGeomParameters();
c789ee28 340 fCoolingOn = kTRUE;
341 fAddOnlyLadder3min = -1;
342 fAddOnlyLadder3max = -1;
343 fAddOnlyLadder4min = -1;
344 fAddOnlyLadder4max = -1;
345 fAddOnlySegment = -1;
346 fColorCarbonFiber = 4;
347 fColorRyton = 5;
348 fColorPhynox = 7;
349 fColorSilicon = 3;
db486a6e 350};
c789ee28 351
352
353//________________________________________________________________________
354AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug)
355 : AliITSv11Geometry(debug) {
db486a6e 356 SetGeomParameters();
c789ee28 357 fCoolingOn = kTRUE;
358 fAddOnlyLadder3min = -1;
359 fAddOnlyLadder3max = -1;
360 fAddOnlyLadder4min = -1;
361 fAddOnlyLadder4max = -1;
362 fAddOnlySegment = -1;
363 fColorCarbonFiber = 4;
364 fColorRyton = 5;
365 fColorPhynox = 7;
366 fColorSilicon = 3;
db486a6e 367};
c789ee28 368
369
370//________________________________________________________________________
db486a6e 371void AliITSv11GeometrySDD::SetGeomParameters() {
372
c789ee28 373 fLay3LaddShortRadius = fLay3DetShortRadius-fLadderBeamRadius+(8-1)*fgkmm; // radius from the center to the CF ladder
374 fLay3LaddLongRadius = fLay3DetLongRadius-fLadderBeamRadius+(8-1)*fgkmm; // radius from the center to the CF ladder
375 fLay4LaddShortRadius = fLay4DetShortRadius-fLadderBeamRadius+(8-1)*fgkmm; // radius from the center to the CF ladder
376 fLay4LaddLongRadius = fLay4DetLongRadius-fLadderBeamRadius+(8-1)*fgkmm; // radius from the center to the CF ladder
377
378
379 fLay3sensorZPos[0]= ( 35.8+72.4+75.8 )*fgkmm;
380 fLay3sensorZPos[1]= ( 35.8+72.4 )*fgkmm;
381 fLay3sensorZPos[2]= ( 35.8 )*fgkmm;
382 fLay3sensorZPos[3]= ( -37.9 )*fgkmm;
383 fLay3sensorZPos[4]= ( -37.9-74.9 )*fgkmm;
384 fLay3sensorZPos[5]= ( -37.9-74.9-71.1 )*fgkmm;
385
386 fLay4sensorZPos[0] = ( 38.5+73.2+75.4+71.6 )*fgkmm;
387 fLay4sensorZPos[1] = ( 38.5+73.2+75.4 )*fgkmm;
388 fLay4sensorZPos[2] = ( 38.5+73.2 )*fgkmm;
389 fLay4sensorZPos[3] = ( 38.5 )*fgkmm;
390 fLay4sensorZPos[4] = ( -35.6 )*fgkmm;
391 fLay4sensorZPos[5] = ( -35.6-74.8 )*fgkmm;
392 fLay4sensorZPos[6] = ( -35.6-74.8-72.4 )*fgkmm;
393 fLay4sensorZPos[7] = ( -35.6-74.8-72.4-76. )*fgkmm;
db486a6e 394
395};
c789ee28 396
397
398//________________________________________________________________________
399void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
400
401 TGeoVolume *segment = CreateLadderSegment(4,1);
402 segment->CheckOverlaps(precision);
403
404 TGeoVolume *ladd3 = CreateLay3Ladder();
405 ladd3->CheckOverlaps(precision);
406
407 TGeoVolume *ladd4 = CreateLay4Ladder();
408 ladd4->CheckOverlaps(precision);
409
410 TGeoVolume *endLad = CreateEndLadder(3,0);
411 endLad->CheckOverlaps(precision);
412
413 TGeoVolume *det3 = CreateLay3Detectors();
414 det3->CheckOverlaps(precision);
415
416 TGeoVolume *det4 = CreateLay4Detectors();
417 det4->CheckOverlaps(precision);
418
419 TGeoVolume *hyb = CreateHybrid(0);
420 hyb->CheckOverlaps(precision);
421
422 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
423 TGeoBBox *layBox = new TGeoBBox("", 300, 300, 300);
424 TGeoVolume *lay = new TGeoVolume("lay", layBox, airSDD);
425 Layer3(lay);
426 Layer4(lay);
427 lay->CheckOverlaps(precision);
428
429};
430
431
db486a6e 432//________________________________________________________________________
433TGeoCombiTrans *AliITSv11GeometrySDD::
434CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi) {
435 //
436 // return the TGeoCombiTrans which make a translation in y and z
437 // and a rotation in phi in the global coord system
438 //
439
440 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
441 TGeoRotation r1("",0.,0.,dphi);
442
443 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
444 combiTrans1->SetTranslation(t1);
445 combiTrans1->SetRotation(r1);
446 return combiTrans1;
447};
c789ee28 448
449
db486a6e 450//________________________________________________________________________
c789ee28 451void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
db486a6e 452 Double_t dx,
453 Double_t dy,
454 Double_t dz) {
455 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
456 const Double_t *vect = ct->GetTranslation();
457 Double_t newVect[3];
458 newVect[0] = vect[0]+dx;
459 newVect[1] = vect[1]+dy;
460 newVect[2] = vect[2]+dz;
461 ct->SetTranslation(newVect);
462};
c789ee28 463
464
465//________________________________________________________________________
466void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
467// for code developpment and debugging purposes
468
469// TGeoVolume *vBaseThermalBridge = CreateBaseThermalBridge();
470// Moth->AddNode(vBaseThermalBridge, 1, 0);
471
472// TGeoVolume* seg = CreateLadderSegment( 4, 0); //lay 4
473// Moth->AddNode(seg, 1, 0);
474
475 AliITSv11GeomSDDcableNap napCable(2.0,0.2);
476 Double_t coord1[3] = {0,0,0};
477 Double_t coord2[3] = {5,5,5};
478
479 napCable.AddCheckPoint( moth, 0, coord1);
480 napCable.AddCheckPoint( moth, 1, coord2);
481 napCable.CreateAndInsertCableSegment( 0, 1, moth);
482
483};
484
485
db486a6e 486//________________________________________________________________________
487void AliITSv11GeometrySDD::Layer3(TGeoVolume *Moth) {
488 // Insert the layer 3 in the mother volume. This is a virtual volume
489 // containing ladders of layer 3 and the supporting rings
490
491 TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
492 fLay3Rmin,fLay3Rmax,fLay3Length*0.5);
493 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
494 TGeoVolume *virtualLayer3 = new TGeoVolume("ITSsddLayer3",
495 virtualLayer3Shape, airSDD);
496 TGeoVolume *lay3Ladder = CreateLay3Ladder();
497 TGeoVolume *lay3Detectors = CreateLay3Detectors();
498
499 Double_t dPhi = 360./fLay3Nladd;
500 Double_t detBoxThickness = fLadWaferSep + 2*fWaferThickness;
c789ee28 501 // Placing virtual ladder and detectors volumes following
502 // ladder ordering convention
db486a6e 503 char rotName[20];
504 Int_t iLaddMin = 0;
505 Int_t iLaddMax = fLay3Nladd;
c789ee28 506 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fLay3Nladd)) {
507 iLaddMin = fAddOnlyLadder3min;
508 iLaddMax = fAddOnlyLadder3max+1;
db486a6e 509 }
510 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
511 sprintf(rotName, "ITSsddLay3Ladd%i",iLadd);
512 Double_t minRadiusLadBox = fLay3LaddShortRadius;
513 if (iLadd%2 != 0) minRadiusLadBox = fLay3LaddLongRadius;
514 minRadiusLadBox += ((TGeoBBox*)lay3Ladder->GetShape())->GetDY();
515
c789ee28 516 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
517 0,-90+iLadd*dPhi);
db486a6e 518 virtualLayer3->AddNode(lay3Ladder,iLadd,ctLadd);
519 sprintf(rotName, "ITSsddLay3DetBox%i",iLadd);
520 Double_t minRadiusDetBox = fLay3DetShortRadius;
521 if (iLadd%2 != 0) minRadiusDetBox = fLay3DetLongRadius;
522 minRadiusDetBox += detBoxThickness/2;
c789ee28 523 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
524 0,-90+iLadd*dPhi);
db486a6e 525 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
526 }
527 virtualLayer3->SetVisibility(kFALSE);
528 Moth->AddNode(virtualLayer3,1,0);
529};
c789ee28 530
531
db486a6e 532//________________________________________________________________________
533TGeoVolume *AliITSv11GeometrySDD::CreateLay3Ladder() {
534 // return a box volume containing the CF ladder
c789ee28 535
536 Double_t segmentLength = fSegmentLength;
537 TGeoVolume *laddSegmentTemp = CreateLadderSegment(3,0);
db486a6e 538 TGeoBBox *ladBox = new TGeoBBox("ITSsddLadBox",
c789ee28 539 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDX(),
540 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDY(),
db486a6e 541 //dX,dY = dX,dY of the segment
c789ee28 542 fLay3LadderLength/2);
db486a6e 543 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
544 TGeoVolume *virtualLadder = new TGeoVolume("ITSsddLadder",ladBox, airSDD);
c789ee28 545 cable.SetInitialNode(virtualLadder);
546
db486a6e 547 // placing virtual ladder segment following detector ordering convention
548 //=======================================================================
c789ee28 549 char transName[20];
550 Int_t iSegmentMin = 0;
db486a6e 551 Int_t iSegmentMax = fLay3Ndet;
c789ee28 552 if (fAddOnlySegment>=0) {
db486a6e 553 iSegmentMin = fAddOnlySegment;
c789ee28 554 iSegmentMax = fAddOnlySegment+1;
db486a6e 555 }
c789ee28 556 for (Int_t iSegment = iSegmentMin; iSegment < iSegmentMax; iSegment++ ) {
557
558 TGeoVolume *laddSegment = CreateLadderSegment(3, iSegment);
db486a6e 559 sprintf(transName, "ITSsddLay3LaddSeg%i", iSegment);
c789ee28 560 Double_t segmentPos = segmentLength*(fLay3Ndet/2-1-iSegment)
561 + segmentLength/2;
db486a6e 562 TGeoTranslation *segTr = new TGeoTranslation(transName,0,0,segmentPos);
563 virtualLadder->AddNode(laddSegment, iSegment, segTr);
564 }
c789ee28 565
db486a6e 566 // putting virtual volume corresponding to the end of ladder
567 //=======================================================================
c789ee28 568 TGeoVolume *endLadder = CreateEndLadder( 3,0 );
db486a6e 569 Double_t endLength = (fLay3LadderLength-fLay3Ndet*fSegmentLength)/2.;
db486a6e 570 TGeoTranslation *endTrZPos = new TGeoTranslation("ITSsddEndTrZPos",0,0,
571 fSegmentLength*(fLay3Ndet/2)+endLength/2.);
572 //Euler rotation : about Z, then new X, then new Z
573 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
574 TGeoCombiTrans *endTrZNeg = new TGeoCombiTrans(0,0,
575 -fSegmentLength*(fLay3Ndet/2)-endLength/2., endZNegRot);
c789ee28 576 if ((fAddOnlySegment==-1)||(fAddOnlySegment==0))
db486a6e 577 virtualLadder->AddNode(endLadder, 1, endTrZPos);
c789ee28 578 if ((fAddOnlySegment==-1)||(fAddOnlySegment==fLay3Ndet-1))
db486a6e 579 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
c789ee28 580
581 cable.ResetInitialNode();
582
db486a6e 583 virtualLadder->SetVisibility(kFALSE);
584 return virtualLadder;
585};
c789ee28 586
587
db486a6e 588//________________________________________________________________________
589TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz,Double_t angle,
590 Double_t xSign,Double_t L, Double_t H, Double_t l) {
591 // Create one half of the V shape corner of CF ladder
592
593 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
c789ee28 594 cfLaddSide->SetVertex( 0, 0, 0);
595 cfLaddSide->SetVertex( 1, 0, -H);
596 cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
597 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
598 cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
599 cfLaddSide->SetVertex( 4, 0, 0);
600 cfLaddSide->SetVertex( 5, 0, -H);
601 cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
602 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
603 cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
db486a6e 604 return cfLaddSide;
605};
c789ee28 606
607
db486a6e 608//________________________________________________________________________
609void AliITSv11GeometrySDD::AddLadderCFstruct(Double_t dy, TGeoVolume* vol) {
610 // fill a volume (segment) with the CF structure of a ladder
611
c789ee28 612 TGeoMedium *carbonFiberLadderStruct =
613 gGeoManager->GetMedium("ITSsddCarbonFiber");
db486a6e 614 Double_t segmentLength = fSegmentLength;
615 Double_t triangleHeight = fLadderHeight - fLadderBeamRadius;
616 Double_t halfTheta = TMath::ATan( 0.5*fLadderWidth/triangleHeight );
617 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
618 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
db486a6e 619
620 //--- The 3 V shape corners of the Carbon Fiber Ladder
621 //--- the top V
c789ee28 622 TGeoArb8 *cfLaddTop1 = CreateLadderSide( segmentLength/2., halfTheta, -1,
623 fLadderLa, fLadderHa, fLadderl);
db486a6e 624 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
c789ee28 625 cfLaddTop1,carbonFiberLadderStruct);
626 TGeoArb8 *cfLaddTop2 = CreateLadderSide( segmentLength/2., halfTheta, 1,
627 fLadderLa, fLadderHa, fLadderl);
db486a6e 628 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
c789ee28 629 cfLaddTop2,carbonFiberLadderStruct);
db486a6e 630 TGeoTranslation *trTop1 = new TGeoTranslation(0, fLadderHeight/2+dy, 0);
c789ee28 631 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
632 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
db486a6e 633 vol->AddNode(cfLaddTopVol1, 1, trTop1);
634 vol->AddNode(cfLaddTopVol2, 1, trTop1);
c789ee28 635
db486a6e 636 //--- the 2 side V
637 TGeoArb8 *cfLaddSide1 = CreateLadderSide( segmentLength/2., beta, -1,
c789ee28 638 fLadderLb, fLadderHb, fLadderl);
639 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerV1",
640 cfLaddSide1,carbonFiberLadderStruct);
db486a6e 641 TGeoArb8 *cfLaddSide2 = CreateLadderSide( segmentLength/2., beta, 1,
c789ee28 642 fLadderLb, fLadderHb, fLadderl);
643 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerV2",
644 cfLaddSide2,carbonFiberLadderStruct);
645 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
646 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
db486a6e 647
648 Double_t dYTranslation = fLadderHeight/2. -
649 0.5*fLadderWidth*TMath::Tan(beta) - fLadderBeamRadius;
650 // because center of the triangle doesn't correspond to virtual vol. center
651 Double_t distCenterSideDown = 0.5*fLadderWidth/TMath::Cos(beta);
652 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
653 alpha*TMath::RadToDeg());
c789ee28 654 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+dy, 0);
db486a6e 655 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
656 -alpha*TMath::RadToDeg());
c789ee28 657 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+dy, 0);
db486a6e 658 vol->AddNode(cfLaddSideVol1, 1, ctSideR);
659 vol->AddNode(cfLaddSideVol2, 1, ctSideR);
660 vol->AddNode(cfLaddSideVol1, 2, ctSideL);
661 vol->AddNode(cfLaddSideVol2, 2, ctSideL);
c789ee28 662
db486a6e 663 //--- The beams
664 // Beams on the sides
665 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
666 TMath::Sin(2*beta)/(TanD(fBeamSidePhi)*TanD(fBeamSidePhi))) ));
c789ee28 667 if(GetDebug(1))
668 cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
db486a6e 669 Double_t beamLength = TMath::Sqrt( fLadderHeight*fLadderHeight/
c789ee28 670 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
671 + fLadderWidth*fLadderWidth/4.)-fLadderLa/2-fLadderLb/2;
672 TGeoTubeSeg *sideBeam= new TGeoTubeSeg(0, fLadderBeamRadius, beamLength/2.,
673 0, 180);
db486a6e 674 TGeoVolume *cfSideBeamVol = new TGeoVolume("ITSsddCFSideBeamVol", sideBeam,
675 carbonFiberLadderStruct);
c789ee28 676 cfSideBeamVol->SetLineColor(fColorCarbonFiber);
677
db486a6e 678 //Euler rotation : about Z, then new X, then new Z
679 TGeoRotation *beamRot1 = new TGeoRotation("",90-2.*beta*TMath::RadToDeg(),
c789ee28 680 -beamPhiPrime*TMath::RadToDeg(),-90);
681 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans( 0.5*triangleHeight*
682 TMath::Tan(halfTheta),
683 fLadderBeamRadius/2. + dy,
684 -3*segmentLength/8, beamRot1);
685 TGeoCombiTrans *beamTransf2 = new TGeoCombiTrans( 0.5*triangleHeight*
686 TMath::Tan(halfTheta),
687 fLadderBeamRadius/2. + dy,
688 segmentLength/8, beamRot1);
689 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
690 beamPhiPrime*TMath::RadToDeg(), -90);
691
db486a6e 692 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans(0.5*triangleHeight*
c789ee28 693 TMath::Tan(halfTheta),
694 fLadderBeamRadius/2. + dy,
695 -segmentLength/8, beamRot2);
db486a6e 696 TGeoCombiTrans *beamTransf4 = new TGeoCombiTrans(0.5*triangleHeight*
c789ee28 697 TMath::Tan(halfTheta),
698 fLadderBeamRadius/2. + dy,
699 3*segmentLength/8, beamRot2);
700 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
701 beamPhiPrime*TMath::RadToDeg(), -90);
702
db486a6e 703 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
c789ee28 704 TMath::Tan(halfTheta),
705 fLadderBeamRadius/2. + dy,
706 -3*segmentLength/8,beamRot3);
db486a6e 707 TGeoCombiTrans *beamTransf6 = new TGeoCombiTrans(-0.5*triangleHeight*
c789ee28 708 TMath::Tan(halfTheta),
709 fLadderBeamRadius/2. + dy,
710 segmentLength/8, beamRot3);
711 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
712 -beamPhiPrime*TMath::RadToDeg(), -90);
713
db486a6e 714 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
715 TMath::Tan(halfTheta),fLadderBeamRadius/2.+dy,-segmentLength/8,beamRot4);
716 TGeoCombiTrans *beamTransf8 = new TGeoCombiTrans(-0.5*triangleHeight*
717 TMath::Tan(halfTheta),fLadderBeamRadius/2.+dy,3*segmentLength/8,beamRot4);
718
719 vol->AddNode(cfSideBeamVol, 1, beamTransf1);
720 vol->AddNode(cfSideBeamVol, 2, beamTransf2);
721 vol->AddNode(cfSideBeamVol, 3, beamTransf3);
722 vol->AddNode(cfSideBeamVol, 4, beamTransf4);
723 vol->AddNode(cfSideBeamVol, 5, beamTransf5);
724 vol->AddNode(cfSideBeamVol, 6, beamTransf6);
725 vol->AddNode(cfSideBeamVol, 7, beamTransf7);
726 vol->AddNode(cfSideBeamVol, 8, beamTransf8);
c789ee28 727
db486a6e 728 //--- Beams of the bottom
729 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fLadderBeamRadius,
c789ee28 730 fLadderWidth/2.-fLadderLb/3, 0, 180);
db486a6e 731 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
732 bottomBeam1, carbonFiberLadderStruct);
c789ee28 733 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
db486a6e 734
735 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
736 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
737 -(fLadderHeight/2-fLadderBeamRadius)+dy,0, bottomBeamRot1);
db486a6e 738 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fLadderBeamRadius,
c789ee28 739 fLadderWidth/2.-fLadderLb/3, 0, 90);
db486a6e 740 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
741 bottomBeam2, carbonFiberLadderStruct);
c789ee28 742 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
db486a6e 743 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
744 -(fLadderHeight/2-fLadderBeamRadius)+dy,
745 -segmentLength/2, bottomBeamRot1);
746 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
747 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
c789ee28 748 -(fLadderHeight/2 - fLadderBeamRadius)
749 + dy, segmentLength/2, bottomBeamRot2);
750
db486a6e 751 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fLadderBeamRadius,
c789ee28 752 0.5*fLadderWidth/SinD(fBottomBeamAngle)
753 - fLadderLb/3, 0, 180);
db486a6e 754 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
c789ee28 755 bottomBeam3, carbonFiberLadderStruct);
756 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
db486a6e 757 //bottomBeam3Vol->SetLineColor(2);
c789ee28 758
db486a6e 759 // be careful on the next 2 beams : when "reading" from -z to +z and
c789ee28 760 // from the bottom of the ladder, it should draw a Lambda, and not a V
db486a6e 761 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fBottomBeamAngle,
762 -90);
763 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans(0,
764 -(fLadderHeight/2-fLadderBeamRadius)+dy,-segmentLength/4,bottomBeamRot4);
765 TGeoRotation *bottomBeamRot5 = new TGeoRotation("",-90,-fBottomBeamAngle,
766 -90);
767 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans(0,
768 -(fLadderHeight/2-fLadderBeamRadius)+dy,segmentLength/4, bottomBeamRot5);
c789ee28 769
770 vol->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
771 vol->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
772 vol->AddNode(bottomBeam2Vol, 2, bottomBeamTransf3);
db486a6e 773 vol->AddNode(bottomBeam3Vol, 1, bottomBeamTransf4);
774 vol->AddNode(bottomBeam3Vol, 2, bottomBeamTransf5);
775};
c789ee28 776
777
db486a6e 778//________________________________________________________________________
c789ee28 779TGeoVolume* AliITSv11GeometrySDD::CreateHybrid(Int_t iSeg) {
780// return a box containing the front-end hybrid
781// Be careful : electronics side is at y<0, thermal bridge at y>0
db486a6e 782
c789ee28 783 Double_t volumeThick = 0.2; // <===== 0.2 tmp
784 TGeoBBox *hybridBox = new TGeoBBox("",fHybridWidth/2, volumeThick/2,
785 (fHybridLength)/2); // include space on each side for cables ???
786 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
787 TGeoVolume *VirtualHybrid = new TGeoVolume( "ITSsddHybridVol", hybridBox,
788 airSDD);
789
790 TGeoBBox *sThermalBridge = new TGeoBBox( "", fHybridWidth/2,
791 fHybridThBridgeThick/2,
792 fHybridLength/2);
793 TGeoMedium *carbonFiberLadderStruct =
794 gGeoManager->GetMedium("ITSsddCarbonFiber");
795
796 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
797 sThermalBridge,
798 carbonFiberLadderStruct);
799 vThermalBridge->SetLineColor(fColorCarbonFiber);
800
801 TGeoTranslation *thBridgeTr = new TGeoTranslation("", 0,
802 volumeThick/2-fHybridThBridgeThick/2, 0);
803 VirtualHybrid->AddNode(vThermalBridge, 1, thBridgeTr);
804
805 Double_t coord[3];
806 coord[0] = 0;coord[1] = 0;coord[2] = 0;
807 cable.AddCheckPoint(VirtualHybrid, iSeg, coord);
808 VirtualHybrid->SetVisibility(kFALSE);
809 cable.GetCheckPoint( cable.GetNCheckPoints()-2, 0, 100, coord);
810 return VirtualHybrid;
db486a6e 811};
c789ee28 812
813
db486a6e 814//________________________________________________________________________
c789ee28 815TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
db486a6e 816 // Return a box volume containing a segment of a ladder.
817
c789ee28 818 //***
db486a6e 819 Double_t tDY = -0.5; //space left on top of the ladder
820 Double_t segmentLength = fSegmentLength;
821
c789ee28 822 Double_t coolPipeSuppH = 0;
823 Double_t sensorCenterZPos = 0; // z in segment local coord syst.
824 if (iLay==3) {
825 coolPipeSuppH = fLay3CoolPipeSuppH;
826 sensorCenterZPos = fLay3sensorZPos[iSeg]-
827 (fSegmentLength*fLay3Ndet/2. -
828 fSegmentLength/2-(iSeg)*fSegmentLength);
829 } else {
830 coolPipeSuppH = fLay4CoolPipeSuppH;
831 sensorCenterZPos = fLay4sensorZPos[iSeg]-
832 (fSegmentLength*fLay4Ndet/2. -
833 fSegmentLength/2-(iSeg)*fSegmentLength);
834 };
835 if(GetDebug(1)){
836 cout << "Segment ("<< iLay <<',' << iSeg
837 << ") : sensor z shift in local segment coord.="
838 << sensorCenterZPos << endl;
839 };
840 //***
841
db486a6e 842 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
c789ee28 843 fLadderWidth/2+fPinSuppWidth+0.5, // +0.5 is for include volume of hybrids !
db486a6e 844 fLadderHeight/2+TMath::Abs(tDY),
845 segmentLength/2);
c789ee28 846 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
847 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
848 segBox, airSDD);
849
850 //**********************************
851 // Carbon fiber structure :
852 AddLadderCFstruct(tDY, virtualSeg);
853
854 //**********************************
855 // Pine support of the sensors :
856 TGeoRotation *rotPS1 = new TGeoRotation("",0,-90,90);
857 TGeoRotation *rotPS2 = new TGeoRotation("",0,-90,-90);
858 TGeoCombiTrans *transPS1 = new TGeoCombiTrans( fPinDYOnSensor,
859 - fLadderHeight/2.-TMath::Abs(tDY)
860 + fPinSuppHeight/2.,
861 sensorCenterZPos + fPinDXminOnSensor,rotPS1);
862 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fPinDYOnSensor,
863 - fLadderHeight/2.-TMath::Abs(tDY)
864 + fPinSuppHeight/2.,
865 sensorCenterZPos + fPinDXminOnSensor +
866 fPinPinDDXOnSensor, rotPS1);
867 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fPinDYOnSensor,
868 - fLadderHeight/2.-TMath::Abs(tDY)
869 + fPinSuppHeight/2.,
870 sensorCenterZPos-fPinDXminOnSensor,rotPS1);
871 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fPinDYOnSensor,
872 - fLadderHeight/2.-TMath::Abs(tDY)
873 + fPinSuppHeight/2.,
874 sensorCenterZPos-fPinDXminOnSensor -
875 fPinPinDDXOnSensor, rotPS1);
876 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fPinDYOnSensor,
877 - fLadderHeight/2. - TMath::Abs(tDY)
878 + fPinSuppHeight/2.,
879 sensorCenterZPos+fPinDXminOnSensor,rotPS2);
880 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fPinDYOnSensor,
881 - fLadderHeight/2. - TMath::Abs(tDY)
882 + fPinSuppHeight/2.,
883 sensorCenterZPos+fPinDXminOnSensor +
884 fPinPinDDXOnSensor, rotPS2);
885 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fPinDYOnSensor,
886 - fLadderHeight/2.-TMath::Abs(tDY)
887 + fPinSuppHeight/2.,
888 sensorCenterZPos-fPinDXminOnSensor,rotPS2);
889 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fPinDYOnSensor,
890 - fLadderHeight/2.-TMath::Abs(tDY)
891 + fPinSuppHeight/2.,
892 sensorCenterZPos - fPinDXminOnSensor
893 - fPinPinDDXOnSensor, rotPS2);
894 TGeoVolume *pinSupport = CreatePinSupport();
895 virtualSeg->AddNode(pinSupport, 1, transPS1);
896 virtualSeg->AddNode(pinSupport, 2, transPS2);
897 virtualSeg->AddNode(pinSupport, 3, transPS3);
898 virtualSeg->AddNode(pinSupport, 4, transPS4);
899 virtualSeg->AddNode(pinSupport, 5, transPS5);
900 virtualSeg->AddNode(pinSupport, 6, transPS6);
901 virtualSeg->AddNode(pinSupport, 7, transPS7);
902 virtualSeg->AddNode(pinSupport, 8, transPS8);
903
904 //**********************************
905 // Cooling pipe supports :
906 Double_t triangleHeight = fLadderHeight - fLadderBeamRadius;
907 Double_t halfTheta = TMath::ATan( 0.5*fLadderWidth/triangleHeight );
908 Double_t triangleCPaxeDist = fCoolPipeSuppAxeDist-fCoolPipeSuppWidthExt-
909 fCoolPipeSuppWidthIn+fLadderBeamRadius;
910
911 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
912 (triangleHeight+triangleCPaxeDist/
913 TMath::Sin(halfTheta)-coolPipeSuppH);
914
915 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),
916 -90, 90);
917 TGeoRotation *rotCPS1 = new TGeoRotation("",halfTheta*TMath::RadToDeg(),
918 -90, -90);
919 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
920 -fLadderHeight/2.-TMath::Abs(tDY)
921 +coolPipeSuppH+fLadderBeamRadius,
922 -segmentLength/2., rotCPS1);
923 TGeoCombiTrans *transCPS2 = new TGeoCombiTrans(-coolPipeSuppL,
924 -fLadderHeight/2.-TMath::Abs(tDY)
925 +coolPipeSuppH+fLadderBeamRadius,
926 segmentLength/2., rotCPS2);
927 TGeoCombiTrans *transCPS3 = new TGeoCombiTrans(coolPipeSuppL,
928 -fLadderHeight/2.-TMath::Abs(tDY)
929 +coolPipeSuppH+fLadderBeamRadius,
930 segmentLength/2., rotCPS1);
931 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
932 -fLadderHeight/2.-TMath::Abs(tDY)
933 +coolPipeSuppH+fLadderBeamRadius,
934 -segmentLength/2., rotCPS2);
935
936 TGeoVolume *coolPipeSuppLeft = CreateCoolPipeSupportL();
937 TGeoVolume *coolPipeSuppRight = CreateCoolPipeSupportR();
938 virtualSeg->AddNode(coolPipeSuppLeft, 1, transCPS1);
939 virtualSeg->AddNode(coolPipeSuppLeft, 2, transCPS2);
940 virtualSeg->AddNode(coolPipeSuppRight, 1, transCPS3);
941 virtualSeg->AddNode(coolPipeSuppRight, 2, transCPS4);
942
943 //**********************************
944 // Cooling pipes :
945 TGeoTube *coolingPipeShape = new TGeoTube( fCoolPipeInnerDiam/2,
946 fCoolPipeOuterDiam/2,
947 segmentLength/2);
948 TGeoTube *coolerShape = new TGeoTube( 0, fCoolPipeInnerDiam/2,
949 segmentLength/2);
950
951 //medium = phynox ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
952 //medium = water ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
953 TGeoMedium *phynoxSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
954 TGeoMedium *coolerMediumSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
955 TGeoVolume *coolingPipe = new TGeoVolume("ITSsddCoolingPipe",
956 coolingPipeShape, phynoxSDD );
957 coolingPipe->SetLineColor(fColorPhynox);
958 TGeoVolume *cooler = new TGeoVolume("ITSsddCoolingLiquid",coolerShape,
959 coolerMediumSDD );
960
961 TGeoTranslation *pipeTr1 = new TGeoTranslation(coolPipeSuppL,
962 -fLadderHeight/2.-TMath::Abs(tDY)+
963 fLadderBeamRadius+coolPipeSuppH, 0);
964 TGeoTranslation *pipeTr2 = new TGeoTranslation(-coolPipeSuppL,
965 -fLadderHeight/2.-TMath::Abs(tDY)+
966 fLadderBeamRadius+coolPipeSuppH, 0);
967
968 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
969 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
970 if (fCoolingOn) {
971 virtualSeg->AddNode(cooler, 1, pipeTr1);
972 virtualSeg->AddNode(cooler, 2, pipeTr2);
973 };
974
975 //**********************************
976 // Bases of hybrid thermal bridges
977 Double_t hybridAngle = 46; // tmp !!!
978 Double_t shiftHyb = 0.9-0.2; // shift in comparison with center of thermal Br. base // tmp !!! not clear on 0752/14-A
979 // sur 0752/14-A c'est environ 0.9
980 // en fait comme la hauteur des cooling pipes depends de la couche, ces deux variables varient probablement
981 // suivant la "layer" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
982
983 TGeoVolume *baseThermalBridge = CreateBaseThermalBridge();
984 TGeoRotation rotHybrid1("",0, 0, -90 - hybridAngle);
985 TGeoRotation rotHybrid2("",0 ,180, 90 - hybridAngle);
986 TGeoCombiTrans *baseTr1 = new TGeoCombiTrans(*pipeTr2, rotHybrid1);
987 TGeoCombiTrans *baseTr2 = new TGeoCombiTrans(*pipeTr1, rotHybrid2);
988 virtualSeg->AddNode(baseThermalBridge, 1, baseTr1);
989 virtualSeg->AddNode(baseThermalBridge, 2, baseTr2);
990
991 //**********************************
db486a6e 992 // the 2 hybrids :
c789ee28 993 TGeoVolume *Hybrid = CreateHybrid(iSeg);
994
db486a6e 995 Double_t hybDy = ((TGeoBBox*)Hybrid->GetShape())->GetDY();
c789ee28 996 Double_t axeToHybridCenterDist = fBTBaxisAtoBase+hybDy;
997
998 Double_t hybrVolDX = ( axeToHybridCenterDist*CosD(hybridAngle)
999 - shiftHyb*SinD(hybridAngle) );
1000 Double_t hybrVolDY = ( axeToHybridCenterDist*SinD(hybridAngle)
1001 + shiftHyb*CosD(hybridAngle) );
1002
1003 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*baseTr1);
1004 AddTranslationToCombiTrans( hybTr1, -hybrVolDX, hybrVolDY, 0);
1005 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*baseTr2);
1006 AddTranslationToCombiTrans( hybTr2, hybrVolDX, hybrVolDY, 0);
1007
1008 virtualSeg->AddNode(Hybrid, 1, hybTr1);
1009 virtualSeg->AddNode(Hybrid, 2, hybTr2);
1010
1011
db486a6e 1012 //**********************************
c789ee28 1013 virtualSeg->SetVisibility(kFALSE);
1014 return virtualSeg;
db486a6e 1015};
db486a6e 1016
c789ee28 1017
1018//________________________________________________________________________
1019TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
1020//
1021// Create a pine support
1022// axis of rotation is the cone axis, center in its middle
1023//
db486a6e 1024 TGeoCone *cone = new TGeoCone("ITSsddPinSuppCone",fPinSuppHeight/2.,
1025 0,fPinSuppRmax,0,fPinSuppRmax-
1026 fPinSuppHeight*TanD(fPinSuppConeAngle) );
1027 TGeoBBox *tong = new TGeoBBox("ITSsddPinSuppTong",fPinSuppRmax,
1028 fPinSuppLength/2.,fPinSuppThickness/2.);
1029 TGeoTube *hole = new TGeoTube("ITSsddPinSuppHole",0,fPinR,
1030 fPinSuppHeight/2.);
c789ee28 1031 if(GetDebug(3)){// Remove compiler warning.
db486a6e 1032 cone->InspectShape();
1033 tong->InspectShape();
1034 hole->InspectShape();
c789ee28 1035 };
db486a6e 1036
1037 TGeoTranslation *tongTrans = new TGeoTranslation("ITSsddPinSuppTongTr",0,
1038 fPinSuppLength/2.,-fPinSuppHeight/2.+fPinSuppThickness/2.);
1039 tongTrans->RegisterYourself();
1040 TGeoCompositeShape *pinSupportShape = new TGeoCompositeShape(
1041 "ITSssdPinSupportShape","(ITSsddPinSuppCone+"
1042 "ITSsddPinSuppTong:ITSsddPinSuppTongTr)-ITSsddPinSuppHole");
1043
c789ee28 1044 //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1045 TGeoMedium *rytonSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
db486a6e 1046 TGeoVolume *pinSupport = new TGeoVolume("ITSssdPinSupport",pinSupportShape,
1047 rytonSDD);
c789ee28 1048 pinSupport->SetLineColor(fColorRyton);
db486a6e 1049 return pinSupport;
c789ee28 1050 // include the pin itself !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
db486a6e 1051};
c789ee28 1052
db486a6e 1053//________________________________________________________________________
c789ee28 1054TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
1055//
1056// Create half of the cooling pipe support (ALR-0752/3)
1057//
1058
1059 Double_t diffX = fCoolPipeSuppHeight*TanD(fCoolPipeSuppAngle);
1060
1061 TGeoArb8 *side1 = new TGeoArb8(fCoolPipeSuppHeight/2.);
1062 side1->SetVertex( 0, 0, -fCoolPipeSuppWidthExt/2.);
1063 side1->SetVertex( 1, fCoolPipeSuppMaxLength/2.-diffX,
1064 -fCoolPipeSuppWidthExt/2.);
1065 side1->SetVertex( 2, fCoolPipeSuppMaxLength/2.-diffX,
1066 fCoolPipeSuppWidthExt/2.);
1067 side1->SetVertex( 3, 0, fCoolPipeSuppWidthExt/2.);
1068 side1->SetVertex( 4, 0, -fCoolPipeSuppWidthExt/2.);
1069 side1->SetVertex( 5, fCoolPipeSuppMaxLength/2.,
1070 -fCoolPipeSuppWidthExt/2.);
1071 side1->SetVertex( 6, fCoolPipeSuppMaxLength/2.,
1072 fCoolPipeSuppWidthExt/2.);
1073 side1->SetVertex( 7, 0, fCoolPipeSuppWidthExt/2.);
1074 side1->SetName("ITSsddCPSside1");
1075
1076 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
1077 - fCoolPipeSuppAxeDist
1078 + fCoolPipeSuppWidthExt/2., 0);
1079 side1Tr->RegisterYourself();
1080 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2",0,
1081 - fCoolPipeSuppAxeDist
1082 + fCoolPipeSuppWidthExt*3/2.
1083 + fCoolPipeSuppWidthIn,0);
1084 side2Tr->RegisterYourself();
1085
1086 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddle",
1087 (fCoolPipeSuppMaxLength/2.-fCoolPipeSuppSlitL)/2.,
1088 fCoolPipeSuppWidthIn/2., fCoolPipeSuppHeight/2.);
1089 TGeoTranslation *middleTr =
1090 new TGeoTranslation("ITSsddCPStr3",
1091 (fCoolPipeSuppMaxLength/2.-fCoolPipeSuppSlitL)/2.,
1092 -fCoolPipeSuppAxeDist+fCoolPipeSuppWidthExt
1093 +fCoolPipeSuppWidthIn/2., 0);
1094 middleTr->RegisterYourself();
1095
1096 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
1097 fCoolPipeSuppTongW/4.,
1098 (fCoolPipeSuppFulWidth
1099 - 2*fCoolPipeSuppWidthExt
1100 - fCoolPipeSuppWidthIn)/2,
1101 fCoolPipeSuppHeight/2.);
1102
1103 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
1104 fCoolPipeSuppTongW/4.,
1105 - fCoolPipeSuppAxeDist
1106 + fCoolPipeSuppFulWidth
1107 - axeBox->GetDY(), 0);
1108 axeBoxTr->RegisterYourself();
1109
1110 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fCoolPipeSuppHoleDiam/2.,
1111 fCoolPipeSuppTongW/4.);
1112 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
1113
1114 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
1115 fCoolPipeSuppTongW/4.,0,0,axeRot);
1116 axeTrans->RegisterYourself();
1117
1118 if(GetDebug(3)){
1119 middle->InspectShape();
1120 axe->InspectShape();
1121 };
1122
1123 //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1124 TGeoMedium *rytonSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
1125
1126 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
1127 "ITSsddCoolPipeSuppShapeL",
1128 "ITSsddCPSmiddle:ITSsddCPStr3"
1129 "+ITSsddCPSside1:ITSsddCPStr1"
1130 "+ITSsddCPSside1:ITSsddCPStr2"
1131 "+ITSsddCPSaxeBox:ITSsddCPSAxBoxTr"
1132 "-ITSsddCPSaxe:ITSsddCPSaxeTr");
1133 TGeoVolume *coolPipeSupp = new TGeoVolume("ITSsddCoolPipeSupportL",
1134 coolPipeSuppShape, rytonSDD);
1135
1136 coolPipeSupp->SetLineColor(fColorRyton);
1137 return coolPipeSupp;
1138};
1139
1140//________________________________________________________________________
1141TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
1142//
1143//Create half of the cooling pipe support (ALR-0752/3)
1144//
1145
1146 Double_t diffX = fCoolPipeSuppHeight*TanD(fCoolPipeSuppAngle);
1147
1148 TGeoArb8 *side1 = new TGeoArb8(fCoolPipeSuppHeight/2.);
1149 side1->SetVertex( 0, 0, -fCoolPipeSuppWidthExt/2.);
1150 side1->SetVertex( 1, -(fCoolPipeSuppMaxLength/2.-diffX),
1151 -fCoolPipeSuppWidthExt/2.);
1152 side1->SetVertex( 2, -(fCoolPipeSuppMaxLength/2.-diffX),
1153 fCoolPipeSuppWidthExt/2.);
1154 side1->SetVertex( 3, 0, fCoolPipeSuppWidthExt/2.);
1155 side1->SetVertex( 4, 0, -fCoolPipeSuppWidthExt/2.);
1156 side1->SetVertex( 5, -fCoolPipeSuppMaxLength/2.,
1157 -fCoolPipeSuppWidthExt/2.);
1158 side1->SetVertex( 6, -fCoolPipeSuppMaxLength/2.,
1159 fCoolPipeSuppWidthExt/2.);
1160 side1->SetVertex( 7, 0, fCoolPipeSuppWidthExt/2.);
1161 side1->SetName("ITSsddCPSside1R");
1162
1163 TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
1164 - fCoolPipeSuppAxeDist
1165 + fCoolPipeSuppWidthExt/2., 0);
1166 side1Tr->RegisterYourself();
1167 TGeoTranslation *side2Tr = new TGeoTranslation("ITSsddCPStr2R",0,
1168 - fCoolPipeSuppAxeDist
1169 + fCoolPipeSuppWidthExt*3/2.
1170 + fCoolPipeSuppWidthIn, 0);
1171 side2Tr->RegisterYourself();
1172
1173 TGeoBBox *middle = new TGeoBBox("ITSsddCPSmiddleR",
1174 (fCoolPipeSuppMaxLength/2.
1175 - fCoolPipeSuppSlitL)/2.,
1176 fCoolPipeSuppWidthIn/2.,
1177 fCoolPipeSuppHeight/2.);
1178 TGeoTranslation *middleTr =
1179 new TGeoTranslation("ITSsddCPStr3R",
1180 -( fCoolPipeSuppMaxLength/2.
1181 -fCoolPipeSuppSlitL)/2.,
1182 -fCoolPipeSuppAxeDist + fCoolPipeSuppWidthExt
1183 + fCoolPipeSuppWidthIn/2.,0);
1184 middleTr->RegisterYourself();
1185
1186 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
1187 fCoolPipeSuppTongW/4.,
1188 (fCoolPipeSuppFulWidth
1189 - 2*fCoolPipeSuppWidthExt
1190 - fCoolPipeSuppWidthIn)/2,
1191 fCoolPipeSuppHeight/2.);
1192
1193 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
1194 - fCoolPipeSuppTongW/4.,
1195 - fCoolPipeSuppAxeDist
1196 + fCoolPipeSuppFulWidth
1197 - axeBox->GetDY(),0);
1198 axeBoxTr->RegisterYourself();
1199
1200 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fCoolPipeSuppHoleDiam/2.,
1201 fCoolPipeSuppTongW/4.);
1202 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
1203
1204 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
1205 -fCoolPipeSuppTongW/4.,0,0,axeRot);
1206 axeTrans->RegisterYourself();
1207
1208 if(GetDebug(3)){
1209 middle->InspectShape();
1210 axe->InspectShape();
1211 };
1212
1213 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
1214 "ITSsddCoolPipeSuppShapeR",
1215 "ITSsddCPSmiddleR:ITSsddCPStr3R"
1216 "+ITSsddCPSside1R:ITSsddCPStr1R"
1217 "+ITSsddCPSside1R:ITSsddCPStr2R"
1218 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
1219 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
1220
1221 //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1222 TGeoMedium *rytonSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
1223 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
1224 coolPipeSuppShape, rytonSDD);
1225 coolPipeSupp->SetLineColor(fColorRyton);
1226
1227 return coolPipeSupp;
1228};
1229
1230//________________________________________________________________________
1231TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
1232// ALR 0752/8
1233
1234 Double_t dy = fBTBaxisAtoBase - fRadiusBminBTB - fBTBthick;
1235
1236 Double_t base1width = fBTBwidth - fBTBaxisAtoBottom - fRadiusBminBTB
1237 - (fRadiusAminBTB+fBTBthick);
1238 TGeoBBox *base1 = new TGeoBBox( "ITSsddBTBbase1", base1width/2.,
1239 fBTBthick/2., fBTBlength/2.);
1240 TGeoTranslation *base1Tr = new TGeoTranslation("ITSsddBTBtr1",
1241 fBTBaxisAtoBottom-fBTBwidth+base1width/2.,
1242 -(fBTBaxisAtoBase-fBTBthick/2.), 0);
1243 base1Tr->RegisterYourself();
1244
1245 Double_t base2width = fBTBaxisAtoBottom - fRadiusAminBTB - fBTBthick
1246 - fRadiusBminBTB;
1247 TGeoBBox *base2 = new TGeoBBox( "ITSsddBTBbase2", base2width/2.,
1248 fBTBthick/2., fBTBlength/2.);
1249 TGeoTranslation *base2Tr = new TGeoTranslation("ITSsddBTBtr2",
1250 fBTBaxisAtoBottom - base2width/2.,
1251 -(fBTBaxisAtoBase-fBTBthick/2.), 0);
1252 base2Tr->RegisterYourself();
1253
1254 TGeoBBox *side = new TGeoBBox( "ITSsddBTBside",
1255 fBTBthick/2., dy/2., fBTBlength/2.);
1256 TGeoTranslation *sideTr1 = new TGeoTranslation("ITSsddBTBsideTr1",
1257 -fRadiusAminBTB-fBTBthick/2., -dy/2., 0);
1258 TGeoTranslation *sideTr2 = new TGeoTranslation("ITSsddBTBsideTr2",
1259 fRadiusAminBTB+fBTBthick/2., -dy/2., 0);
1260 sideTr1->RegisterYourself();
1261 sideTr2->RegisterYourself();
1262
1263 TGeoBBox *hole = new TGeoBBox( "ITSsddBTBhole", fBTBHolewidth/2.,
1264 fBTBthick/2., fBTBHoleLength/2.);
1265 TGeoTranslation *holeTr1 = new TGeoTranslation("ITSsddBTBholeTr1",
1266 - fBTBHoleRefX + fBTBHolewidth/2.,
1267 - (fBTBaxisAtoBase-fBTBthick/2.),
1268 fBTBHoleRefY+(fBTBHoleLength-fBTBlength)/2.);
1269 TGeoTranslation *holeTr2 = new TGeoTranslation("ITSsddBTBholeTr2",
1270 - fBTBHoleRefX + fBTBHolewidth/2.,
1271 - (fBTBaxisAtoBase-fBTBthick/2.),
1272 - fBTBHoleRefY-(fBTBHoleLength-fBTBlength)/2.);
1273 holeTr1->RegisterYourself();
1274 holeTr2->RegisterYourself();
1275
1276 Double_t radiusAmaxBTB = fRadiusAminBTB + fBTBthick;
1277 TGeoTubeSeg *mainAxis = new TGeoTubeSeg( "ITSsddBTBmainAxis",
1278 fRadiusAminBTB, radiusAmaxBTB,
1279 fBTBlength/2., 0., 180.);
1280 TGeoTubeSeg *round1 = new TGeoTubeSeg( "ITSsddBTBround1",
1281 fRadiusBminBTB, fRadiusBminBTB+fBTBthick,
1282 fBTBlength/2., 270., 360.);
1283 TGeoTranslation *roundTr1 = new TGeoTranslation("ITSsddBTBround1Tr",
1284 -(fRadiusAminBTB+fBTBthick+fRadiusBminBTB),
1285 -dy, 0);
1286 roundTr1->RegisterYourself();
1287
1288 TGeoTubeSeg *round2 = new TGeoTubeSeg( "ITSsddBTBround2",
1289 fRadiusBminBTB, fRadiusBminBTB+fBTBthick,
1290 fBTBlength/2., 180., 270.);
1291 TGeoTranslation *roundTr2 = new TGeoTranslation("ITSsddBTBround2Tr",
1292 (fRadiusAminBTB+fBTBthick+fRadiusBminBTB),
1293 -dy, 0);
1294 roundTr2->RegisterYourself();
1295
1296 TGeoCompositeShape *sBaseThermalBridge = new TGeoCompositeShape(
1297 "ITSsddBaseThermalBridgeShape",
1298 "ITSsddBTBbase1:ITSsddBTBtr1"
1299 "+ ITSsddBTBbase2:ITSsddBTBtr2"
1300 "+ ITSsddBTBround1:ITSsddBTBround1Tr"
1301 "+ ITSsddBTBround2:ITSsddBTBround2Tr"
1302 "+ ITSsddBTBside:ITSsddBTBsideTr1"
1303 "+ ITSsddBTBside:ITSsddBTBsideTr2"
1304 "- ITSsddBTBhole:ITSsddBTBholeTr1"
1305 "- ITSsddBTBhole:ITSsddBTBholeTr2"
1306 "+ ITSsddBTBmainAxis");
1307
1308 if(GetDebug(3)){// Remove compiler warning.
1309 base1->InspectShape();
1310 base2->InspectShape();
1311 side->InspectShape();
1312 hole->InspectShape();
1313 mainAxis->InspectShape();
1314 round1->InspectShape();
1315 round2->InspectShape();
1316 };
1317
1318 TGeoMedium *carbonFiberLadderStruct = gGeoManager->GetMedium("ITSsddCarbonFiber");
1319 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
1320 sBaseThermalBridge,
1321 carbonFiberLadderStruct);
1322
1323 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
1324 return vBaseThermalBridge;
1325};
1326
1327
1328
1329
1330//________________________________________________________________________
1331TGeoVolume* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay, Int_t) {
db486a6e 1332 // Return a box volume containing a end of a CF ladder.
c789ee28 1333
db486a6e 1334 Double_t tDY = -0.5; //space left on top of the ladder
c789ee28 1335
db486a6e 1336 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1337 TGeoMedium *carbonFiberLadderStruct = gGeoManager->GetMedium(
c789ee28 1338 "ITSsddCarbonFiber");
1339 Double_t length = 0;
1340 Double_t coolPipeSuppH = 0;
1341
1342 if (iLay==3) {
1343 length = (fLay3LadderLength-fLay3Ndet*fSegmentLength)/2.;
1344 coolPipeSuppH = fLay3CoolPipeSuppH;
1345 } else {
1346 length = (fLay4LadderLength-fLay4Ndet*fSegmentLength)/2.;
1347 coolPipeSuppH = fLay4CoolPipeSuppH;
1348 };
1349
db486a6e 1350 Double_t segmentLength = fSegmentLength;
1351 Double_t topCornerLength = fSegmentLength/2.-fLay4LaddTopCornerEnd;
1352
1353 TGeoBBox *endBox = new TGeoBBox("ITSsddEndLaddBox",
1354 //(fLadderWidth+fPinSuppWidth)/2,
1355 (fLadderWidth)/2,
1356 fLadderHeight/2+TMath::Abs(tDY),
1357 length/2);
1358 TGeoVolume *virtualEnd = new TGeoVolume("ITSsddEnd",endBox, airSDD);
c789ee28 1359
db486a6e 1360 //**********************************
1361 // coding real matter :
1362 //**********************************
1363 Double_t triangleHeight = fLadderHeight - fLadderBeamRadius;
1364 Double_t halfTheta = TMath::ATan( 0.5*fLadderWidth/triangleHeight );
1365 Double_t beta = (TMath::Pi()-2.*halfTheta)/4.;
1366 Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
c789ee28 1367
db486a6e 1368 //--- The 3 V shape corners of the Carbon Fiber Ladder
1369 //--- the top V
1370 TGeoArb8 *cfLaddTop1 = CreateLadderSide( topCornerLength/2., halfTheta, -1,
1371 fLadderLa, fLadderHa, fLadderl);
1372 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
1373 cfLaddTop1,carbonFiberLadderStruct);
c789ee28 1374 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
db486a6e 1375 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
1376 fLadderLa, fLadderHa, fLadderl);
1377 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
1378 cfLaddTop2,carbonFiberLadderStruct);
c789ee28 1379 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
db486a6e 1380 TGeoTranslation *trTop1 = new TGeoTranslation(0, fLadderHeight/2+tDY,
1381 -(length-topCornerLength)/2.);
1382 virtualEnd->AddNode(cfLaddTopVol1, 1, trTop1);
1383 virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
c789ee28 1384
db486a6e 1385 //--- the 2 side V
1386 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
1387 fLadderLb, fLadderHb, fLadderl);
1388 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
1389 cfLaddSide1,carbonFiberLadderStruct);
c789ee28 1390 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
db486a6e 1391 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
1392 fLadderLb, fLadderHb, fLadderl);
1393 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
1394 cfLaddSide2,carbonFiberLadderStruct);
c789ee28 1395 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
db486a6e 1396 Double_t dYTranslation = ( fLadderHeight/2. - 0.5*fLadderWidth*
c789ee28 1397 TMath::Tan(beta) - fLadderBeamRadius );
1398
db486a6e 1399 // because center of the triangle doesn't correspond to virtual vol. center
1400 Double_t distCenterSideDown = 0.5*fLadderWidth/TMath::Cos(beta);
1401 TGeoCombiTrans *ctSideR = CreateCombiTrans("", distCenterSideDown, 0,
1402 alpha*TMath::RadToDeg());
c789ee28 1403 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
db486a6e 1404 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
1405 -alpha*TMath::RadToDeg());
c789ee28 1406 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
db486a6e 1407 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
1408 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
1409 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
1410 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
c789ee28 1411
db486a6e 1412 //--- The beams
1413 // Beams on the sides
1414 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*
1415 TMath::Sin(2*beta)/(TanD(fBeamSidePhi)*TanD(fBeamSidePhi))) ));
1416 if(GetDebug(3)) cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
1417 Double_t beamLength = TMath::Sqrt( fLadderHeight*fLadderHeight/
c789ee28 1418 (TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
1419 +fLadderWidth*fLadderWidth/4.)-fLadderLa/2-fLadderLb/2;
1420 TGeoTubeSeg *sideBeam = new TGeoTubeSeg( 0, fLadderBeamRadius,
1421 beamLength/2., 0, 180);
db486a6e 1422 TGeoVolume *cfSideBeamVol = new TGeoVolume("ITSsddCFSideBeamVol",
1423 sideBeam, carbonFiberLadderStruct);
c789ee28 1424 cfSideBeamVol->SetLineColor(fColorCarbonFiber);
1425
db486a6e 1426 //Euler rotation : about Z, then new X, then new Z
1427 TGeoRotation *beamRot1 = new TGeoRotation("",90-2.*beta*TMath::RadToDeg(),
c789ee28 1428 -beamPhiPrime*TMath::RadToDeg(), -90);
db486a6e 1429 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
c789ee28 1430 TMath::Tan(halfTheta),
1431 fLadderBeamRadius/2. + tDY,
1432 -length/2 + segmentLength/8, beamRot1);
1433 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
1434 beamPhiPrime*TMath::RadToDeg(), -90);
1435 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans( 0.5*triangleHeight*
1436 TMath::Tan(halfTheta),
1437 fLadderBeamRadius/2.+tDY,
1438 -length/2 + 3*segmentLength/8, beamRot2);
db486a6e 1439 TGeoRotation *beamRot3 = new TGeoRotation("",90+2.*beta*TMath::RadToDeg(),
c789ee28 1440 beamPhiPrime*TMath::RadToDeg(), -90);
db486a6e 1441 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
c789ee28 1442 TMath::Tan(halfTheta),
1443 fLadderBeamRadius/2.+tDY,
1444 -length/2 + segmentLength/8, beamRot3);
1445 TGeoRotation *beamRot4 = new TGeoRotation("",90 + 2.*beta*TMath::RadToDeg(),
1446 -beamPhiPrime*TMath::RadToDeg(), -90);
db486a6e 1447 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
c789ee28 1448 TMath::Tan(halfTheta),
1449 fLadderBeamRadius/2. + tDY,
1450 -length/2+3*segmentLength/8, beamRot4);
db486a6e 1451 virtualEnd->AddNode(cfSideBeamVol, 1, beamTransf1);
1452 virtualEnd->AddNode(cfSideBeamVol, 2, beamTransf3);
1453 virtualEnd->AddNode(cfSideBeamVol, 3, beamTransf5);
1454 virtualEnd->AddNode(cfSideBeamVol, 4, beamTransf7);
c789ee28 1455
db486a6e 1456 //--- Beams of the bottom
1457 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fLadderBeamRadius,
c789ee28 1458 fLadderWidth/2.-fLadderLb/3, 0, 180);
db486a6e 1459 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
1460 bottomBeam1, carbonFiberLadderStruct);
c789ee28 1461 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
db486a6e 1462 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
1463 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
1464 -(fLadderHeight/2-fLadderBeamRadius)+tDY,
c789ee28 1465 -length/2+fSegmentLength/2, bottomBeamRot1);
db486a6e 1466 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
1467 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fLadderBeamRadius,
c789ee28 1468 fLadderWidth/2.-fLadderLb/3, 0, 90);
db486a6e 1469 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
c789ee28 1470 bottomBeam2, carbonFiberLadderStruct);
1471 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
db486a6e 1472 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
1473 -(fLadderHeight/2-fLadderBeamRadius)+tDY,-length/2, bottomBeamRot1);
1474 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
c789ee28 1475
1476 //**********************************
1477 //the cooling pipe supports
1478 Double_t triangleCPaxeDist = fCoolPipeSuppAxeDist-fCoolPipeSuppWidthExt-
1479 fCoolPipeSuppWidthIn+fLadderBeamRadius;
1480
1481 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
1482 (triangleHeight+triangleCPaxeDist/
1483 TMath::Sin(halfTheta) - coolPipeSuppH);
1484 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),-90,90);
1485 TGeoRotation *rotCPS1 = new TGeoRotation("",halfTheta*TMath::RadToDeg(),-90,-90);
1486 TGeoCombiTrans *transCPS1 = new TGeoCombiTrans(coolPipeSuppL,
1487 -fLadderHeight/2.-TMath::Abs(tDY)+
1488 coolPipeSuppH+fLadderBeamRadius,
1489 -length/2., rotCPS1);
1490 TGeoCombiTrans *transCPS4 = new TGeoCombiTrans(-coolPipeSuppL,
1491 -fLadderHeight/2.-TMath::Abs(tDY)+
1492 coolPipeSuppH+fLadderBeamRadius,
1493 -length/2., rotCPS2);
1494
1495 TGeoVolume *coolPipeSuppLeft = CreateCoolPipeSupportL();
1496 virtualEnd->AddNode(coolPipeSuppLeft, 1, transCPS1);
1497 TGeoVolume *coolPipeSuppRight = CreateCoolPipeSupportR();
1498 virtualEnd->AddNode(coolPipeSuppRight, 1, transCPS4);
db486a6e 1499 //**********************************
1500 virtualEnd->SetVisibility(kFALSE);
1501 return virtualEnd;
1502};
c789ee28 1503
1504
db486a6e 1505//________________________________________________________________________
1506TGeoVolume* AliITSv11GeometrySDD::CreateSDDsensor() {
1507 // return a box containing the SDD sensor
1508
1509 TGeoBBox *sensorBox = new TGeoBBox("ITSsddSensorBox",
1510 fWaferWidth/2, fWaferThickness/2,fWaferLength/2);
1511 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
c789ee28 1512 TGeoVolume *virtualSensor = new TGeoVolume("ITSsddSensor",sensorBox,airSDD);
1513
1514 // the virtual volume is already following the cood convention
1515 // for the local wafer coord. system : no need for additional rotation matrix
1516 TGeoBBox *waferShape = new TGeoBBox("ITSsddWaferShape",
1517 fWaferWidth/2, fWaferThickness/2,fWaferLength/2);
1518
1519 //medium = silicon ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1520 TGeoMedium *siliconSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
1521 TGeoVolume *sensor = new TGeoVolume("ITSsddWafer", waferShape, siliconSDD);
1522 sensor->SetLineColor(fColorSilicon);
1523 virtualSensor->AddNode(sensor, 1, 0);
db486a6e 1524
c789ee28 1525 virtualSensor->SetVisibility(kFALSE);
db486a6e 1526 return virtualSensor;
1527};
c789ee28 1528
1529
db486a6e 1530//________________________________________________________________________
1531TGeoVolume *AliITSv11GeometrySDD::CreateLay3Detectors() {
1532 // return a box volume containing the detectors
1533
1534 TGeoBBox *detBox = new TGeoBBox("ITSssdDetBox3",
1535 fWaferWidth/2,
1536 (fLadWaferSep + 2*fWaferThickness)/2,
1537 fLay3LadderLength*((fLay3Ndet-0.5)/fLay3Ndet)/2);
1538 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1539 TGeoVolume *virtualDet = new TGeoVolume("ITSsddDet3",detBox, airSDD);
1540 TGeoVolume *vSDD = CreateSDDsensor();
1541 char transName[30];
c789ee28 1542
1543 Int_t iSegmentMin = 0;
1544 Int_t iSegmentMax = fLay3Ndet;
1545 if (fAddOnlySegment>=0) {
1546 iSegmentMin = fAddOnlySegment;
1547 iSegmentMax = fAddOnlySegment+1;
1548 };
1549
1550 for (Int_t i=iSegmentMin; i<iSegmentMax; i++) {
db486a6e 1551 Double_t localZ = fLay3sensorZPos[i];
1552 Double_t localY = fLadWaferSep/2+fWaferThickness/2;
1553 if (i%2!=0)
1554 localY = -localY;
c789ee28 1555 sprintf(transName, "ITSsddLay3SensorPos%i", i);
db486a6e 1556 TGeoTranslation *sensorPos = new TGeoTranslation(transName,0,localY,
1557 localZ);
c789ee28 1558 virtualDet->AddNode(vSDD, i, sensorPos);
db486a6e 1559 }
1560 virtualDet->SetVisibility(kFALSE);
1561 return virtualDet;
1562};
c789ee28 1563
1564
db486a6e 1565//________________________________________________________________________
1566void AliITSv11GeometrySDD::Layer4(TGeoVolume *Moth) {
1567 // Insert the layer 4 in the mother volume. This is a virtual volume
1568 // containing ladders of layer 4 and the supporting rings
1569
1570 TGeoTube *virtualLayer4Shape =new TGeoTube("ITSsddLayer4Shape",
1571 fLay4Rmin,fLay4Rmax,fLay4Length*0.5);
1572 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1573 TGeoVolume *virtualLayer4 = new TGeoVolume("ITSsddLayer4",
1574 virtualLayer4Shape, airSDD);
1575 TGeoVolume *lay4Ladder = CreateLay4Ladder();
1576 TGeoVolume *lay4Detectors = CreateLay4Detectors();
1577 Double_t dPhi = 360./fLay4Nladd;
1578 Double_t detBoxThickness = fLadWaferSep + 2*fWaferThickness;
1579 // placing virtual ladder and detectors volumes following ladder
1580 // ordering convention
1581 char rotName[20];
1582 Int_t iLaddMin = 0;
1583 Int_t iLaddMax = fLay4Nladd;
c789ee28 1584 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fLay4Nladd)) {
1585 iLaddMin = fAddOnlyLadder4min;
1586 iLaddMax = fAddOnlyLadder4max+1;
db486a6e 1587 }
1588 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1589 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1590 Double_t minRadiusLadBox = fLay4LaddShortRadius;
1591 if (iLadd%2 != 0)
1592 minRadiusLadBox = fLay4LaddLongRadius;
1593 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1594 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1595 0, -90+iLadd*dPhi);
1596 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1597 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1598 Double_t minRadiusDetBox = fLay4DetShortRadius;
1599 if (iLadd%2 != 0)
1600 minRadiusDetBox = fLay4DetLongRadius;
1601 minRadiusDetBox += detBoxThickness/2;
1602 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1603 0, -90+iLadd*dPhi);
1604 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1605 }
1606 virtualLayer4->SetVisibility(kFALSE);
1607 Moth->AddNode(virtualLayer4,1,0);
1608};
c789ee28 1609
1610
db486a6e 1611//________________________________________________________________________
1612TGeoVolume *AliITSv11GeometrySDD::CreateLay4Ladder() {
1613 // return a box volume containing the CF ladder and all pieces on it
1614
c789ee28 1615 TGeoVolume *laddSegmentTemp = CreateLadderSegment(4,0);
db486a6e 1616 TGeoBBox *ladBox = new TGeoBBox("ITSsddLadBox",
c789ee28 1617 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDX(),
1618 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDY(),
1619 //dX,dY = dX,dY of the segment
1620 fLay4LadderLength/2);
db486a6e 1621 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1622 TGeoVolume *virtualLadder = new TGeoVolume("ITSsddLadder",ladBox, airSDD);
1623 Double_t segmentLength = fSegmentLength;
1624 char transName[20];
1625 // placing virtual ladder segment following detector ordering convention
1626 //=======================================================================
c789ee28 1627 Int_t iSegmentMin = 0;
db486a6e 1628 Int_t iSegmentMax = fLay4Ndet;
c789ee28 1629 if (fAddOnlySegment>=0) {
db486a6e 1630 iSegmentMin = fAddOnlySegment;
c789ee28 1631 iSegmentMax = fAddOnlySegment+1;
db486a6e 1632 }
c789ee28 1633 for (Int_t iSegment= iSegmentMin; iSegment < iSegmentMax; iSegment++ ) {
1634
1635 TGeoVolume *laddSegment = CreateLadderSegment(4, iSegment);
db486a6e 1636 sprintf(transName, "ITSsddLay4LaddSeg%i", iSegment);
c789ee28 1637 Double_t segmentPos = segmentLength*(fLay4Ndet/2-1-iSegment) +
1638 segmentLength/2;
db486a6e 1639 TGeoTranslation *segTr = new TGeoTranslation(transName,0,0,segmentPos);
1640 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1641 }
1642 // putting virtual volume corresponding to the end of ladder
1643 //=======================================================================
c789ee28 1644 TGeoVolume *endLadder = CreateEndLadder( 4,-1 );
db486a6e 1645 Double_t endLength = (fLay4LadderLength-fLay4Ndet*fSegmentLength)/2.;
db486a6e 1646 TGeoTranslation *endTrZPos =
1647 new TGeoTranslation("ITSsddEndTrZPos",0,0,
1648 fSegmentLength*(fLay4Ndet/2)+endLength/2.);
1649 //Euler rotation : about Z, then new X, then new Z
1650 TGeoRotation *endZNegRot = new TGeoRotation("",90, 180, -90);
1651 TGeoCombiTrans *endTrZNeg =
1652 new TGeoCombiTrans(0,0,-fSegmentLength*(fLay4Ndet/2)-endLength/2.,
1653 endZNegRot);
c789ee28 1654 if ((fAddOnlySegment==-1)||(fAddOnlySegment==0))
db486a6e 1655 virtualLadder->AddNode(endLadder, 1, endTrZPos);
c789ee28 1656 if ((fAddOnlySegment==-1)||(fAddOnlySegment==fLay4Ndet-1))
db486a6e 1657 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1658 virtualLadder->SetVisibility(kFALSE);
1659 return virtualLadder;
1660};
c789ee28 1661
1662
db486a6e 1663//________________________________________________________________________
1664TGeoVolume *AliITSv11GeometrySDD::CreateLay4Detectors() {
1665 // return a box volume containing the detectors
1666
1667 TGeoBBox *detBox = new TGeoBBox("ITSssdDetBox4",
c789ee28 1668 fWaferWidth/2,
1669 (fLadWaferSep + 2*fWaferThickness)/2,
1670 fLay4LadderLength*((fLay4Ndet-0.5)/fLay4Ndet)/2);
db486a6e 1671 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1672 TGeoVolume *virtualDet = new TGeoVolume("ITSsddDet4",detBox, airSDD);
1673 TGeoVolume *vSDD = CreateSDDsensor();
1674 char transName[30];
c789ee28 1675 Int_t iSegmentMin = 0;
1676 Int_t iSegmentMax = fLay4Ndet;
1677 if (fAddOnlySegment>=0) {
1678 iSegmentMin = fAddOnlySegment;
1679 iSegmentMax = fAddOnlySegment+1;
1680 }
1681
1682 for (Int_t i=iSegmentMin; i<iSegmentMax; i++) {
1683
db486a6e 1684 Double_t localZ = fLay4sensorZPos[i];
1685 Double_t localY = fLadWaferSep/2+fWaferThickness/2;
c789ee28 1686 if (i%2==0)
db486a6e 1687 localY = -localY;
c789ee28 1688 sprintf(transName, "ITSsddLay4SensorPos%i", i);
1689 TGeoTranslation *sensorPos = new TGeoTranslation(transName, 0,
1690 localY, localZ);
1691 virtualDet->AddNode(vSDD, i, sensorPos);
db486a6e 1692 }
1693 virtualDet->SetVisibility(kFALSE);
1694 return virtualDet;
1695};