1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //*************************************************************************
17 // SDD geometry, based on ROOT geometrical modeler
19 // Ludovic Gaudichet (Ludovic.Gaudichet@to.infn.it)
20 //*************************************************************************
26 // General Root includes
27 #include <Riostream.h>
31 // Root Geometry includes
32 #include <TGeoManager.h>
33 #include <TGeoVolume.h>
38 #include <TGeoCompositeShape.h>
39 #include <TGeoMatrix.h>
40 #include <TGeoMaterial.h>
41 #include <TGeoMedium.h>
44 #include "AliITSv11Geometry.h"
45 #include "AliITSv11GeometrySDD.h"
47 extern TGeoManager* gGeoManager;
49 ClassImp(AliITSv11GeomSDDcable)
51 //----------------------------------------------------------------------
52 AliITSv11GeomSDDcable::~AliITSv11GeomSDDcable() {
53 if (fInitialNode) delete fInitialNode; };
56 //----------------------------------------------------------------------
57 void AliITSv11GeomSDDcable::AddCheckPoint( TGeoVolume *vol, Int_t iCheckPt,
60 if (iCheckPt>=fVolumeArray.GetEntriesFast()) {
61 fVolumeArray.AddLast(vol);
62 TVectorD *point = new TVectorD(3,coord);
63 fPointArray.AddLast(point);
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);
73 //----------------------------------------------------------------------
74 Int_t AliITSv11GeomSDDcable::
75 GetCheckPoint( Int_t iCheckPt, Int_t iOccur, Int_t motherLevel,
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
81 if (iCheckPt >= fVolumeArray.GetEntriesFast()) return kFALSE;
82 fCurrentVol = (TGeoVolume *) fVolumeArray.UncheckedAt(iCheckPt);
85 if (fInitialNode==0) {
86 TObjArray *nodes = gGeoManager->GetListOfNodes();
87 if (nodes->GetEntriesFast()==0) return kFALSE;
88 mainNode = (TGeoNode *) nodes->UncheckedAt(0);
90 mainNode = fInitialNode;
93 for (Int_t i=0; i<50; i++) fNodeInd[i]=-1;
94 Int_t currentOccur = 0;
96 // loop to get the volume position in the tree of nodes
97 while ( CheckDaughter(0, mainNode) && (currentOccur!=iOccur) ) {
100 while (fNodeInd[maxLevel]!=-1) maxLevel++;
101 fNodeInd[maxLevel-1]++;
105 while (fNodeInd[maxLevel]!=-1) maxLevel++;
106 if (maxLevel==0) return kFALSE;
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]);
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];
121 // cout << '(' << localCoord[0] << ',' << localCoord[1] << ','
122 // << localCoord[2] << ") "<< endl;
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;
133 coord[0] = globalCoord[0];
134 coord[1] = globalCoord[1];
135 coord[2] = globalCoord[2];
141 //----------------------------------------------------------------------
142 void AliITSv11GeomSDDcable::SetInitialNode(TGeoVolume *vol) {
143 if (fInitialNode) delete fInitialNode;
144 fInitialNode = new TGeoNodeMatrix(vol,0);
145 fInitialNode->SetName("nodeInConstruction");
149 //----------------------------------------------------------------------
150 void AliITSv11GeomSDDcable:: ResetInitialNode() {
151 if (fInitialNode) delete fInitialNode;
156 //----------------------------------------------------------------------
157 bool 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 !!!
163 Int_t j = fNodeInd[i];
164 if (node->GetVolume()==fCurrentVol) return kTRUE;
165 TObjArray *array = node->GetNodes();
167 Int_t nDaughters = array->GetEntriesFast();
169 while (j<nDaughters) {
170 TGeoNode *subNode = (TGeoNode *) array->UncheckedAt(j);
171 //cout << "level " << i << " " << subNode->GetName()<< endl;
173 if (CheckDaughter(i+1, subNode)) return kTRUE;
183 ClassImp(AliITSv11GeomSDDcableNap)
185 //----------------------------------------------------------------------
186 //----------------------------------------------------------------------
187 AliITSv11GeomSDDcableNap::
188 AliITSv11GeomSDDcableNap(Double_t width, Double_t thick):AliITSv11GeomSDDcable()
195 #include <TGeoSphere.h>
196 //----------------------------------------------------------------------
197 Int_t AliITSv11GeomSDDcableNap::
198 CreateAndInsertCableSegment(Int_t p1, Int_t p2, TGeoVolume *motherVol) {
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;
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];
215 Double_t length = TMath::Sqrt(dx*dx+dy*dy+dz*dz);
216 TGeoBBox *cableSeg = new TGeoBBox("", fWidth/2,fThick/2,length/2);
218 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
219 TGeoVolume *vCableSeg = new TGeoVolume("vCableSeg",cableSeg, airSDD);
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;
229 TGeoCombiTrans *combi = new TGeoCombiTrans(*trans, *rot);
230 motherVol->AddNode(vCableSeg, 1, combi);
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);
249 //________________________________________________________________________
252 const Double_t AliITSv11GeometrySDD::fSegmentLength = 37.2*2*fgkmm;
253 const Double_t AliITSv11GeometrySDD::fLadderWidth = 50.0*fgkmm;
254 const Double_t AliITSv11GeometrySDD::fLadderHeight = 30.0*fgkmm;
255 const Double_t AliITSv11GeometrySDD::fLadderBeamRadius = 0.6*fgkmm;
256 const Double_t AliITSv11GeometrySDD::fLadderLa = 3.*fgkmm;
257 const Double_t AliITSv11GeometrySDD::fLadderHa = 0.6*fgkmm; //total pifometer
258 const Double_t AliITSv11GeometrySDD::fLadderLb = 3.7*fgkmm;
259 const Double_t AliITSv11GeometrySDD::fLadderHb = 0.6*fgkmm; //total pifometer
260 const Double_t AliITSv11GeometrySDD::fLadderl = 0.25*fgkmm;
262 const Double_t AliITSv11GeometrySDD::fBottomBeamAngle = 56.5;
263 const Double_t AliITSv11GeometrySDD::fBeamSidePhi = 65;
265 const Double_t AliITSv11GeometrySDD::fWaferThickness = 0.3*fgkmm;
266 const Double_t AliITSv11GeometrySDD::fWaferWidth = 72.5*fgkmm;
267 const Double_t AliITSv11GeometrySDD::fWaferLength = 87.6*fgkmm;
269 const Double_t AliITSv11GeometrySDD::fHybridLength = 65*fgkmm;
270 const Double_t AliITSv11GeometrySDD::fHybridWidth = 41*fgkmm; // pifometer
271 const Double_t AliITSv11GeometrySDD::fHybridThBridgeThick = 0.25*fgkmm; // pifometer
273 const Double_t AliITSv11GeometrySDD::fLadWaferSep = 2*fgkmm;
274 const Double_t AliITSv11GeometrySDD::fPinSuppWidth = 2.5*fgkmm; // pifometer
275 const Double_t AliITSv11GeometrySDD::fPinSuppHeight = 2.*fgkmm; // pifometer
276 const Double_t AliITSv11GeometrySDD::fPinSuppRmax = 2.5/2.*fgkmm;
277 const Double_t AliITSv11GeometrySDD::fPinR = 1.5/2.*fgkmm;
278 const Double_t AliITSv11GeometrySDD::fPinSuppLength = 5.*fgkmm;
279 const Double_t AliITSv11GeometrySDD::fPinSuppThickness = 0.5*fgkmm;
280 const Double_t AliITSv11GeometrySDD::fPinSuppConeAngle = 4;
281 const Double_t AliITSv11GeometrySDD::fPinDXminOnSensor = (39./2.)*fgkmm; //placement of pins on sensor
282 const Double_t AliITSv11GeometrySDD::fPinPinDDXOnSensor = 3*fgkmm;
283 const Double_t AliITSv11GeometrySDD::fPinDYOnSensor = (52.5/2.)*fgkmm;
285 // parameters from ALR-0752/3
286 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppHeight = 3.2*fgkmm;
287 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppMaxLength = 14*fgkmm;
288 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppWidthExt = 0.4*fgkmm;
289 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppWidthIn = 0.65*fgkmm;
290 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppHoleDiam = 2*fgkmm;
291 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppFulWidth = 5.15*fgkmm;
292 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppTongW = 0.8*fgkmm;
293 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppAngle = 22.5;
294 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppSlitL = 4.9*fgkmm;
295 const Double_t AliITSv11GeometrySDD::fCoolPipeSuppAxeDist = 3.05*fgkmm;
296 const Double_t AliITSv11GeometrySDD::fCoolPipeInnerDiam = 1.84*fgkmm;
297 const Double_t AliITSv11GeometrySDD::fCoolPipeOuterDiam = 2.*fgkmm;
299 const Double_t AliITSv11GeometrySDD::fBTBthick = 0.25 *fgkmm;
300 const Double_t AliITSv11GeometrySDD::fBTBlength = 55. *fgkmm;
301 const Double_t AliITSv11GeometrySDD::fBTBwidth = 18*fgkmm;
302 const Double_t AliITSv11GeometrySDD::fBTBaxisAtoBottom = 4*fgkmm;
303 const Double_t AliITSv11GeometrySDD::fBTBaxisAtoBase = 1.2*fgkmm;
304 const Double_t AliITSv11GeometrySDD::fRadiusAminBTB = 1. *fgkmm;
305 const Double_t AliITSv11GeometrySDD::fRadiusBminBTB = 0.53 *fgkmm;
306 const Double_t AliITSv11GeometrySDD::fBTBHoleLength = 15 *fgkmm;
307 const Double_t AliITSv11GeometrySDD::fBTBHolewidth = 6 *fgkmm;
308 const Double_t AliITSv11GeometrySDD::fBTBHoleRefX = 10 *fgkmm;
309 const Double_t AliITSv11GeometrySDD::fBTBHoleRefY = 6.5 *fgkmm;
311 const Double_t AliITSv11GeometrySDD::fLay3Rmin = 130.*fgkmm; //not min! Rmin virtual tube
312 const Double_t AliITSv11GeometrySDD::fLay3Rmax = 190.*fgkmm; //not min! Rmax virtual tube
313 const Double_t AliITSv11GeometrySDD::fLay3Length = (524.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
314 const Double_t AliITSv11GeometrySDD::fLay3LadderLength = 524.*fgkmm;
315 const Double_t AliITSv11GeometrySDD::fLay3DetShortRadius = 146.0*fgkmm;
316 const Double_t AliITSv11GeometrySDD::fLay3DetLongRadius = 152.0*fgkmm;
317 const Double_t AliITSv11GeometrySDD::fLay3LaddTopCornerEnd = 15.6*fgkmm;
318 const Int_t AliITSv11GeometrySDD::fLay3Ndet = 6;
319 const Int_t AliITSv11GeometrySDD::fLay3Nladd = 14;
320 const Double_t AliITSv11GeometrySDD::fLay3CoolPipeSuppH = 7.5*fgkmm;
322 const Double_t AliITSv11GeometrySDD::fLay4Rmin = 220.*fgkmm; //not min! Rmin virtual tube
323 const Double_t AliITSv11GeometrySDD::fLay4Rmax = 290.*fgkmm; //not min! Rmax virtual tube
324 const Double_t AliITSv11GeometrySDD::fLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
325 const Double_t AliITSv11GeometrySDD::fLay4LadderLength = 671.*fgkmm;
326 const Double_t AliITSv11GeometrySDD::fLay4DetShortRadius = 235.0*fgkmm;
327 const Double_t AliITSv11GeometrySDD::fLay4DetLongRadius = 240.5*fgkmm;
328 const Double_t AliITSv11GeometrySDD::fLay4LaddTopCornerEnd = 15.6*fgkmm;
329 const Int_t AliITSv11GeometrySDD::fLay4Ndet = 8;
330 const Int_t AliITSv11GeometrySDD::fLay4Nladd = 22;
331 const Double_t AliITSv11GeometrySDD::fLay4CoolPipeSuppH = 10*fgkmm;
334 ClassImp(AliITSv11GeometrySDD)
337 //________________________________________________________________________
338 AliITSv11GeometrySDD::AliITSv11GeometrySDD():AliITSv11Geometry() {
341 fAddOnlyLadder3min = -1;
342 fAddOnlyLadder3max = -1;
343 fAddOnlyLadder4min = -1;
344 fAddOnlyLadder4max = -1;
345 fAddOnlySegment = -1;
346 fColorCarbonFiber = 4;
353 //________________________________________________________________________
354 AliITSv11GeometrySDD::AliITSv11GeometrySDD(Int_t debug)
355 : AliITSv11Geometry(debug) {
358 fAddOnlyLadder3min = -1;
359 fAddOnlyLadder3max = -1;
360 fAddOnlyLadder4min = -1;
361 fAddOnlyLadder4max = -1;
362 fAddOnlySegment = -1;
363 fColorCarbonFiber = 4;
370 //________________________________________________________________________
371 void AliITSv11GeometrySDD::SetGeomParameters() {
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
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;
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;
398 //________________________________________________________________________
399 void AliITSv11GeometrySDD::CheckOverlaps(Double_t precision){
401 TGeoVolume *segment = CreateLadderSegment(4,1);
402 segment->CheckOverlaps(precision);
404 TGeoVolume *ladd3 = CreateLay3Ladder();
405 ladd3->CheckOverlaps(precision);
407 TGeoVolume *ladd4 = CreateLay4Ladder();
408 ladd4->CheckOverlaps(precision);
410 TGeoVolume *endLad = CreateEndLadder(3,0);
411 endLad->CheckOverlaps(precision);
413 TGeoVolume *det3 = CreateLay3Detectors();
414 det3->CheckOverlaps(precision);
416 TGeoVolume *det4 = CreateLay4Detectors();
417 det4->CheckOverlaps(precision);
419 TGeoVolume *hyb = CreateHybrid(0);
420 hyb->CheckOverlaps(precision);
422 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
423 TGeoBBox *layBox = new TGeoBBox("", 300, 300, 300);
424 TGeoVolume *lay = new TGeoVolume("lay", layBox, airSDD);
427 lay->CheckOverlaps(precision);
432 //________________________________________________________________________
433 TGeoCombiTrans *AliITSv11GeometrySDD::
434 CreateCombiTrans(const char *name, Double_t dy, Double_t dz, Double_t dphi) {
436 // return the TGeoCombiTrans which make a translation in y and z
437 // and a rotation in phi in the global coord system
440 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
441 TGeoRotation r1("",0.,0.,dphi);
443 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
444 combiTrans1->SetTranslation(t1);
445 combiTrans1->SetRotation(r1);
450 //________________________________________________________________________
451 void AliITSv11GeometrySDD::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
455 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
456 const Double_t *vect = ct->GetTranslation();
458 newVect[0] = vect[0]+dx;
459 newVect[1] = vect[1]+dy;
460 newVect[2] = vect[2]+dz;
461 ct->SetTranslation(newVect);
465 //________________________________________________________________________
466 void AliITSv11GeometrySDD::ShowOnePiece(TGeoVolume *moth) {
467 // for code developpment and debugging purposes
469 // TGeoVolume *vBaseThermalBridge = CreateBaseThermalBridge();
470 // Moth->AddNode(vBaseThermalBridge, 1, 0);
472 // TGeoVolume* seg = CreateLadderSegment( 4, 0); //lay 4
473 // Moth->AddNode(seg, 1, 0);
475 AliITSv11GeomSDDcableNap napCable(2.0,0.2);
476 Double_t coord1[3] = {0,0,0};
477 Double_t coord2[3] = {5,5,5};
479 napCable.AddCheckPoint( moth, 0, coord1);
480 napCable.AddCheckPoint( moth, 1, coord2);
481 napCable.CreateAndInsertCableSegment( 0, 1, moth);
486 //________________________________________________________________________
487 void 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
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();
499 Double_t dPhi = 360./fLay3Nladd;
500 Double_t detBoxThickness = fLadWaferSep + 2*fWaferThickness;
501 // Placing virtual ladder and detectors volumes following
502 // ladder ordering convention
505 Int_t iLaddMax = fLay3Nladd;
506 if ((fAddOnlyLadder3min>=0)&&(fAddOnlyLadder3max<fLay3Nladd)) {
507 iLaddMin = fAddOnlyLadder3min;
508 iLaddMax = fAddOnlyLadder3max+1;
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();
516 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName,minRadiusLadBox,
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;
523 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
525 virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
527 virtualLayer3->SetVisibility(kFALSE);
528 Moth->AddNode(virtualLayer3,1,0);
532 //________________________________________________________________________
533 TGeoVolume *AliITSv11GeometrySDD::CreateLay3Ladder() {
534 // return a box volume containing the CF ladder
536 Double_t segmentLength = fSegmentLength;
537 TGeoVolume *laddSegmentTemp = CreateLadderSegment(3,0);
538 TGeoBBox *ladBox = new TGeoBBox("ITSsddLadBox",
539 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDX(),
540 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDY(),
541 //dX,dY = dX,dY of the segment
542 fLay3LadderLength/2);
543 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
544 TGeoVolume *virtualLadder = new TGeoVolume("ITSsddLadder",ladBox, airSDD);
545 cable.SetInitialNode(virtualLadder);
547 // placing virtual ladder segment following detector ordering convention
548 //=======================================================================
550 Int_t iSegmentMin = 0;
551 Int_t iSegmentMax = fLay3Ndet;
552 if (fAddOnlySegment>=0) {
553 iSegmentMin = fAddOnlySegment;
554 iSegmentMax = fAddOnlySegment+1;
556 for (Int_t iSegment = iSegmentMin; iSegment < iSegmentMax; iSegment++ ) {
558 TGeoVolume *laddSegment = CreateLadderSegment(3, iSegment);
559 sprintf(transName, "ITSsddLay3LaddSeg%i", iSegment);
560 Double_t segmentPos = segmentLength*(fLay3Ndet/2-1-iSegment)
562 TGeoTranslation *segTr = new TGeoTranslation(transName,0,0,segmentPos);
563 virtualLadder->AddNode(laddSegment, iSegment, segTr);
566 // putting virtual volume corresponding to the end of ladder
567 //=======================================================================
568 TGeoVolume *endLadder = CreateEndLadder( 3,0 );
569 Double_t endLength = (fLay3LadderLength-fLay3Ndet*fSegmentLength)/2.;
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);
576 if ((fAddOnlySegment==-1)||(fAddOnlySegment==0))
577 virtualLadder->AddNode(endLadder, 1, endTrZPos);
578 if ((fAddOnlySegment==-1)||(fAddOnlySegment==fLay3Ndet-1))
579 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
581 cable.ResetInitialNode();
583 virtualLadder->SetVisibility(kFALSE);
584 return virtualLadder;
588 //________________________________________________________________________
589 TGeoArb8 *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
593 TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
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));
608 //________________________________________________________________________
609 void AliITSv11GeometrySDD::AddLadderCFstruct(Double_t dy, TGeoVolume* vol) {
610 // fill a volume (segment) with the CF structure of a ladder
612 TGeoMedium *carbonFiberLadderStruct =
613 gGeoManager->GetMedium("ITSsddCarbonFiber");
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.;
620 //--- The 3 V shape corners of the Carbon Fiber Ladder
622 TGeoArb8 *cfLaddTop1 = CreateLadderSide( segmentLength/2., halfTheta, -1,
623 fLadderLa, fLadderHa, fLadderl);
624 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
625 cfLaddTop1,carbonFiberLadderStruct);
626 TGeoArb8 *cfLaddTop2 = CreateLadderSide( segmentLength/2., halfTheta, 1,
627 fLadderLa, fLadderHa, fLadderl);
628 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
629 cfLaddTop2,carbonFiberLadderStruct);
630 TGeoTranslation *trTop1 = new TGeoTranslation(0, fLadderHeight/2+dy, 0);
631 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
632 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
633 vol->AddNode(cfLaddTopVol1, 1, trTop1);
634 vol->AddNode(cfLaddTopVol2, 1, trTop1);
637 TGeoArb8 *cfLaddSide1 = CreateLadderSide( segmentLength/2., beta, -1,
638 fLadderLb, fLadderHb, fLadderl);
639 TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerV1",
640 cfLaddSide1,carbonFiberLadderStruct);
641 TGeoArb8 *cfLaddSide2 = CreateLadderSide( segmentLength/2., beta, 1,
642 fLadderLb, fLadderHb, fLadderl);
643 TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerV2",
644 cfLaddSide2,carbonFiberLadderStruct);
645 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
646 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
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());
654 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+dy, 0);
655 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown,0,
656 -alpha*TMath::RadToDeg());
657 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+dy, 0);
658 vol->AddNode(cfLaddSideVol1, 1, ctSideR);
659 vol->AddNode(cfLaddSideVol2, 1, ctSideR);
660 vol->AddNode(cfLaddSideVol1, 2, ctSideL);
661 vol->AddNode(cfLaddSideVol2, 2, ctSideL);
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))) ));
668 cout<<"Phi prime = "<<beamPhiPrime*TMath::RadToDeg()<<endl;
669 Double_t beamLength = TMath::Sqrt( fLadderHeight*fLadderHeight/
670 ( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))
671 + fLadderWidth*fLadderWidth/4.)-fLadderLa/2-fLadderLb/2;
672 TGeoTubeSeg *sideBeam= new TGeoTubeSeg(0, fLadderBeamRadius, beamLength/2.,
674 TGeoVolume *cfSideBeamVol = new TGeoVolume("ITSsddCFSideBeamVol", sideBeam,
675 carbonFiberLadderStruct);
676 cfSideBeamVol->SetLineColor(fColorCarbonFiber);
678 //Euler rotation : about Z, then new X, then new Z
679 TGeoRotation *beamRot1 = new TGeoRotation("",90-2.*beta*TMath::RadToDeg(),
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);
692 TGeoCombiTrans *beamTransf3 = new TGeoCombiTrans(0.5*triangleHeight*
693 TMath::Tan(halfTheta),
694 fLadderBeamRadius/2. + dy,
695 -segmentLength/8, beamRot2);
696 TGeoCombiTrans *beamTransf4 = new TGeoCombiTrans(0.5*triangleHeight*
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);
703 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
704 TMath::Tan(halfTheta),
705 fLadderBeamRadius/2. + dy,
706 -3*segmentLength/8,beamRot3);
707 TGeoCombiTrans *beamTransf6 = new TGeoCombiTrans(-0.5*triangleHeight*
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);
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);
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);
728 //--- Beams of the bottom
729 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fLadderBeamRadius,
730 fLadderWidth/2.-fLadderLb/3, 0, 180);
731 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
732 bottomBeam1, carbonFiberLadderStruct);
733 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
735 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
736 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
737 -(fLadderHeight/2-fLadderBeamRadius)+dy,0, bottomBeamRot1);
738 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fLadderBeamRadius,
739 fLadderWidth/2.-fLadderLb/3, 0, 90);
740 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
741 bottomBeam2, carbonFiberLadderStruct);
742 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
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,
748 -(fLadderHeight/2 - fLadderBeamRadius)
749 + dy, segmentLength/2, bottomBeamRot2);
751 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, fLadderBeamRadius,
752 0.5*fLadderWidth/SinD(fBottomBeamAngle)
753 - fLadderLb/3, 0, 180);
754 TGeoVolume *bottomBeam3Vol = new TGeoVolume("ITSsddBottomBeam3Vol",
755 bottomBeam3, carbonFiberLadderStruct);
756 bottomBeam3Vol->SetLineColor(fColorCarbonFiber);
757 //bottomBeam3Vol->SetLineColor(2);
759 // be careful on the next 2 beams : when "reading" from -z to +z and
760 // from the bottom of the ladder, it should draw a Lambda, and not a V
761 TGeoRotation *bottomBeamRot4 = new TGeoRotation("", -90, fBottomBeamAngle,
763 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans(0,
764 -(fLadderHeight/2-fLadderBeamRadius)+dy,-segmentLength/4,bottomBeamRot4);
765 TGeoRotation *bottomBeamRot5 = new TGeoRotation("",-90,-fBottomBeamAngle,
767 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans(0,
768 -(fLadderHeight/2-fLadderBeamRadius)+dy,segmentLength/4, bottomBeamRot5);
770 vol->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
771 vol->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
772 vol->AddNode(bottomBeam2Vol, 2, bottomBeamTransf3);
773 vol->AddNode(bottomBeam3Vol, 1, bottomBeamTransf4);
774 vol->AddNode(bottomBeam3Vol, 2, bottomBeamTransf5);
778 //________________________________________________________________________
779 TGeoVolume* 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
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,
790 TGeoBBox *sThermalBridge = new TGeoBBox( "", fHybridWidth/2,
791 fHybridThBridgeThick/2,
793 TGeoMedium *carbonFiberLadderStruct =
794 gGeoManager->GetMedium("ITSsddCarbonFiber");
796 TGeoVolume *vThermalBridge = new TGeoVolume("ITSsddHybridThBridge",
798 carbonFiberLadderStruct);
799 vThermalBridge->SetLineColor(fColorCarbonFiber);
801 TGeoTranslation *thBridgeTr = new TGeoTranslation("", 0,
802 volumeThick/2-fHybridThBridgeThick/2, 0);
803 VirtualHybrid->AddNode(vThermalBridge, 1, thBridgeTr);
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;
814 //________________________________________________________________________
815 TGeoVolume* AliITSv11GeometrySDD::CreateLadderSegment(Int_t iLay, Int_t iSeg) {
816 // Return a box volume containing a segment of a ladder.
819 Double_t tDY = -0.5; //space left on top of the ladder
820 Double_t segmentLength = fSegmentLength;
822 Double_t coolPipeSuppH = 0;
823 Double_t sensorCenterZPos = 0; // z in segment local coord syst.
825 coolPipeSuppH = fLay3CoolPipeSuppH;
826 sensorCenterZPos = fLay3sensorZPos[iSeg]-
827 (fSegmentLength*fLay3Ndet/2. -
828 fSegmentLength/2-(iSeg)*fSegmentLength);
830 coolPipeSuppH = fLay4CoolPipeSuppH;
831 sensorCenterZPos = fLay4sensorZPos[iSeg]-
832 (fSegmentLength*fLay4Ndet/2. -
833 fSegmentLength/2-(iSeg)*fSegmentLength);
836 cout << "Segment ("<< iLay <<',' << iSeg
837 << ") : sensor z shift in local segment coord.="
838 << sensorCenterZPos << endl;
842 TGeoBBox *segBox = new TGeoBBox("ITSsddSegBox",
843 fLadderWidth/2+fPinSuppWidth+0.5, // +0.5 is for include volume of hybrids !
844 fLadderHeight/2+TMath::Abs(tDY),
846 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
847 TGeoVolume *virtualSeg = new TGeoVolume("ITSsddSegment",
850 //**********************************
851 // Carbon fiber structure :
852 AddLadderCFstruct(tDY, virtualSeg);
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)
861 sensorCenterZPos + fPinDXminOnSensor,rotPS1);
862 TGeoCombiTrans *transPS2 = new TGeoCombiTrans( fPinDYOnSensor,
863 - fLadderHeight/2.-TMath::Abs(tDY)
865 sensorCenterZPos + fPinDXminOnSensor +
866 fPinPinDDXOnSensor, rotPS1);
867 TGeoCombiTrans *transPS3 = new TGeoCombiTrans( fPinDYOnSensor,
868 - fLadderHeight/2.-TMath::Abs(tDY)
870 sensorCenterZPos-fPinDXminOnSensor,rotPS1);
871 TGeoCombiTrans *transPS4 = new TGeoCombiTrans( fPinDYOnSensor,
872 - fLadderHeight/2.-TMath::Abs(tDY)
874 sensorCenterZPos-fPinDXminOnSensor -
875 fPinPinDDXOnSensor, rotPS1);
876 TGeoCombiTrans *transPS5 = new TGeoCombiTrans( -fPinDYOnSensor,
877 - fLadderHeight/2. - TMath::Abs(tDY)
879 sensorCenterZPos+fPinDXminOnSensor,rotPS2);
880 TGeoCombiTrans *transPS6 = new TGeoCombiTrans( -fPinDYOnSensor,
881 - fLadderHeight/2. - TMath::Abs(tDY)
883 sensorCenterZPos+fPinDXminOnSensor +
884 fPinPinDDXOnSensor, rotPS2);
885 TGeoCombiTrans *transPS7 = new TGeoCombiTrans( -fPinDYOnSensor,
886 - fLadderHeight/2.-TMath::Abs(tDY)
888 sensorCenterZPos-fPinDXminOnSensor,rotPS2);
889 TGeoCombiTrans *transPS8 = new TGeoCombiTrans( -fPinDYOnSensor,
890 - fLadderHeight/2.-TMath::Abs(tDY)
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);
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;
911 Double_t coolPipeSuppL = TMath::Tan(halfTheta)*
912 (triangleHeight+triangleCPaxeDist/
913 TMath::Sin(halfTheta)-coolPipeSuppH);
915 TGeoRotation *rotCPS2 = new TGeoRotation("",-halfTheta*TMath::RadToDeg(),
917 TGeoRotation *rotCPS1 = new TGeoRotation("",halfTheta*TMath::RadToDeg(),
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);
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);
943 //**********************************
945 TGeoTube *coolingPipeShape = new TGeoTube( fCoolPipeInnerDiam/2,
946 fCoolPipeOuterDiam/2,
948 TGeoTube *coolerShape = new TGeoTube( 0, fCoolPipeInnerDiam/2,
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,
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);
968 virtualSeg->AddNode(coolingPipe, 1, pipeTr1);
969 virtualSeg->AddNode(coolingPipe, 2, pipeTr2);
971 virtualSeg->AddNode(cooler, 1, pipeTr1);
972 virtualSeg->AddNode(cooler, 2, pipeTr2);
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" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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);
991 //**********************************
993 TGeoVolume *Hybrid = CreateHybrid(iSeg);
995 Double_t hybDy = ((TGeoBBox*)Hybrid->GetShape())->GetDY();
996 Double_t axeToHybridCenterDist = fBTBaxisAtoBase+hybDy;
998 Double_t hybrVolDX = ( axeToHybridCenterDist*CosD(hybridAngle)
999 - shiftHyb*SinD(hybridAngle) );
1000 Double_t hybrVolDY = ( axeToHybridCenterDist*SinD(hybridAngle)
1001 + shiftHyb*CosD(hybridAngle) );
1003 TGeoCombiTrans *hybTr1 = new TGeoCombiTrans(*baseTr1);
1004 AddTranslationToCombiTrans( hybTr1, -hybrVolDX, hybrVolDY, 0);
1005 TGeoCombiTrans *hybTr2 = new TGeoCombiTrans(*baseTr2);
1006 AddTranslationToCombiTrans( hybTr2, hybrVolDX, hybrVolDY, 0);
1008 virtualSeg->AddNode(Hybrid, 1, hybTr1);
1009 virtualSeg->AddNode(Hybrid, 2, hybTr2);
1012 //**********************************
1013 virtualSeg->SetVisibility(kFALSE);
1018 //________________________________________________________________________
1019 TGeoVolume* AliITSv11GeometrySDD::CreatePinSupport() {
1021 // Create a pine support
1022 // axis of rotation is the cone axis, center in its middle
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,
1031 if(GetDebug(3)){// Remove compiler warning.
1032 cone->InspectShape();
1033 tong->InspectShape();
1034 hole->InspectShape();
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");
1044 //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1045 TGeoMedium *rytonSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
1046 TGeoVolume *pinSupport = new TGeoVolume("ITSssdPinSupport",pinSupportShape,
1048 pinSupport->SetLineColor(fColorRyton);
1050 // include the pin itself !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1053 //________________________________________________________________________
1054 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportL() {
1056 // Create half of the cooling pipe support (ALR-0752/3)
1059 Double_t diffX = fCoolPipeSuppHeight*TanD(fCoolPipeSuppAngle);
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");
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();
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();
1096 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBox",
1097 fCoolPipeSuppTongW/4.,
1098 (fCoolPipeSuppFulWidth
1099 - 2*fCoolPipeSuppWidthExt
1100 - fCoolPipeSuppWidthIn)/2,
1101 fCoolPipeSuppHeight/2.);
1103 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTr",
1104 fCoolPipeSuppTongW/4.,
1105 - fCoolPipeSuppAxeDist
1106 + fCoolPipeSuppFulWidth
1107 - axeBox->GetDY(), 0);
1108 axeBoxTr->RegisterYourself();
1110 TGeoTube *axe = new TGeoTube("ITSsddCPSaxe",0,fCoolPipeSuppHoleDiam/2.,
1111 fCoolPipeSuppTongW/4.);
1112 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRot",90,90,0);
1114 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTr",
1115 fCoolPipeSuppTongW/4.,0,0,axeRot);
1116 axeTrans->RegisterYourself();
1119 middle->InspectShape();
1120 axe->InspectShape();
1123 //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1124 TGeoMedium *rytonSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
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);
1136 coolPipeSupp->SetLineColor(fColorRyton);
1137 return coolPipeSupp;
1140 //________________________________________________________________________
1141 TGeoVolume* AliITSv11GeometrySDD::CreateCoolPipeSupportR() {
1143 //Create half of the cooling pipe support (ALR-0752/3)
1146 Double_t diffX = fCoolPipeSuppHeight*TanD(fCoolPipeSuppAngle);
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");
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();
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();
1186 TGeoBBox *axeBox = new TGeoBBox("ITSsddCPSaxeBoxR",
1187 fCoolPipeSuppTongW/4.,
1188 (fCoolPipeSuppFulWidth
1189 - 2*fCoolPipeSuppWidthExt
1190 - fCoolPipeSuppWidthIn)/2,
1191 fCoolPipeSuppHeight/2.);
1193 TGeoTranslation *axeBoxTr = new TGeoTranslation("ITSsddCPSAxBoxTrR",
1194 - fCoolPipeSuppTongW/4.,
1195 - fCoolPipeSuppAxeDist
1196 + fCoolPipeSuppFulWidth
1197 - axeBox->GetDY(),0);
1198 axeBoxTr->RegisterYourself();
1200 TGeoTube *axe = new TGeoTube("ITSsddCPSaxeR",0,fCoolPipeSuppHoleDiam/2.,
1201 fCoolPipeSuppTongW/4.);
1202 TGeoRotation *axeRot = new TGeoRotation("ITSsddCPSaxeRotR",90,90,0);
1204 TGeoCombiTrans *axeTrans = new TGeoCombiTrans("ITSsddCPSaxeTrR",
1205 -fCoolPipeSuppTongW/4.,0,0,axeRot);
1206 axeTrans->RegisterYourself();
1209 middle->InspectShape();
1210 axe->InspectShape();
1213 TGeoCompositeShape *coolPipeSuppShape = new TGeoCompositeShape(
1214 "ITSsddCoolPipeSuppShapeR",
1215 "ITSsddCPSmiddleR:ITSsddCPStr3R"
1216 "+ITSsddCPSside1R:ITSsddCPStr1R"
1217 "+ITSsddCPSside1R:ITSsddCPStr2R"
1218 "+ITSsddCPSaxeBoxR:ITSsddCPSAxBoxTrR"
1219 "-ITSsddCPSaxeR:ITSsddCPSaxeTrR");
1221 //medium = ryton ? To code !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1222 TGeoMedium *rytonSDD = gGeoManager->GetMedium("ITSsddStaselite4411w");
1223 TGeoVolume *coolPipeSupp = new TGeoVolume( "ITSsddCoolPipeSupportR",
1224 coolPipeSuppShape, rytonSDD);
1225 coolPipeSupp->SetLineColor(fColorRyton);
1227 return coolPipeSupp;
1230 //________________________________________________________________________
1231 TGeoVolume* AliITSv11GeometrySDD::CreateBaseThermalBridge() {
1234 Double_t dy = fBTBaxisAtoBase - fRadiusBminBTB - fBTBthick;
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();
1245 Double_t base2width = fBTBaxisAtoBottom - fRadiusAminBTB - fBTBthick
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();
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();
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();
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),
1286 roundTr1->RegisterYourself();
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),
1294 roundTr2->RegisterYourself();
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");
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();
1318 TGeoMedium *carbonFiberLadderStruct = gGeoManager->GetMedium("ITSsddCarbonFiber");
1319 TGeoVolume *vBaseThermalBridge = new TGeoVolume( "ITSsddBaseThermalBridge",
1321 carbonFiberLadderStruct);
1323 vBaseThermalBridge->SetLineColor(fColorCarbonFiber);
1324 return vBaseThermalBridge;
1330 //________________________________________________________________________
1331 TGeoVolume* AliITSv11GeometrySDD::CreateEndLadder(Int_t iLay, Int_t) {
1332 // Return a box volume containing a end of a CF ladder.
1334 Double_t tDY = -0.5; //space left on top of the ladder
1336 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1337 TGeoMedium *carbonFiberLadderStruct = gGeoManager->GetMedium(
1338 "ITSsddCarbonFiber");
1339 Double_t length = 0;
1340 Double_t coolPipeSuppH = 0;
1343 length = (fLay3LadderLength-fLay3Ndet*fSegmentLength)/2.;
1344 coolPipeSuppH = fLay3CoolPipeSuppH;
1346 length = (fLay4LadderLength-fLay4Ndet*fSegmentLength)/2.;
1347 coolPipeSuppH = fLay4CoolPipeSuppH;
1350 Double_t segmentLength = fSegmentLength;
1351 Double_t topCornerLength = fSegmentLength/2.-fLay4LaddTopCornerEnd;
1353 TGeoBBox *endBox = new TGeoBBox("ITSsddEndLaddBox",
1354 //(fLadderWidth+fPinSuppWidth)/2,
1356 fLadderHeight/2+TMath::Abs(tDY),
1358 TGeoVolume *virtualEnd = new TGeoVolume("ITSsddEnd",endBox, airSDD);
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.;
1368 //--- The 3 V shape corners of the Carbon Fiber Ladder
1370 TGeoArb8 *cfLaddTop1 = CreateLadderSide( topCornerLength/2., halfTheta, -1,
1371 fLadderLa, fLadderHa, fLadderl);
1372 TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
1373 cfLaddTop1,carbonFiberLadderStruct);
1374 cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
1375 TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
1376 fLadderLa, fLadderHa, fLadderl);
1377 TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
1378 cfLaddTop2,carbonFiberLadderStruct);
1379 cfLaddTopVol2->SetLineColor(fColorCarbonFiber);
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);
1386 TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
1387 fLadderLb, fLadderHb, fLadderl);
1388 TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
1389 cfLaddSide1,carbonFiberLadderStruct);
1390 cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
1391 TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
1392 fLadderLb, fLadderHb, fLadderl);
1393 TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
1394 cfLaddSide2,carbonFiberLadderStruct);
1395 cfLaddSideVol2->SetLineColor(fColorCarbonFiber);
1396 Double_t dYTranslation = ( fLadderHeight/2. - 0.5*fLadderWidth*
1397 TMath::Tan(beta) - fLadderBeamRadius );
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());
1403 AddTranslationToCombiTrans(ctSideR, 0, -dYTranslation+tDY, 0);
1404 TGeoCombiTrans *ctSideL = CreateCombiTrans("", distCenterSideDown, 0,
1405 -alpha*TMath::RadToDeg());
1406 AddTranslationToCombiTrans(ctSideL, 0, -dYTranslation+tDY, 0);
1407 virtualEnd->AddNode(cfLaddSideVol1, 1, ctSideR);
1408 virtualEnd->AddNode(cfLaddSideVol2, 1, ctSideR);
1409 virtualEnd->AddNode(cfLaddSideVol1, 2, ctSideL);
1410 virtualEnd->AddNode(cfLaddSideVol2, 2, ctSideL);
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/
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);
1422 TGeoVolume *cfSideBeamVol = new TGeoVolume("ITSsddCFSideBeamVol",
1423 sideBeam, carbonFiberLadderStruct);
1424 cfSideBeamVol->SetLineColor(fColorCarbonFiber);
1426 //Euler rotation : about Z, then new X, then new Z
1427 TGeoRotation *beamRot1 = new TGeoRotation("",90-2.*beta*TMath::RadToDeg(),
1428 -beamPhiPrime*TMath::RadToDeg(), -90);
1429 TGeoCombiTrans *beamTransf1 = new TGeoCombiTrans(0.5*triangleHeight*
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);
1439 TGeoRotation *beamRot3 = new TGeoRotation("",90+2.*beta*TMath::RadToDeg(),
1440 beamPhiPrime*TMath::RadToDeg(), -90);
1441 TGeoCombiTrans *beamTransf5 = new TGeoCombiTrans(-0.5*triangleHeight*
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);
1447 TGeoCombiTrans *beamTransf7 = new TGeoCombiTrans(-0.5*triangleHeight*
1448 TMath::Tan(halfTheta),
1449 fLadderBeamRadius/2. + tDY,
1450 -length/2+3*segmentLength/8, beamRot4);
1451 virtualEnd->AddNode(cfSideBeamVol, 1, beamTransf1);
1452 virtualEnd->AddNode(cfSideBeamVol, 2, beamTransf3);
1453 virtualEnd->AddNode(cfSideBeamVol, 3, beamTransf5);
1454 virtualEnd->AddNode(cfSideBeamVol, 4, beamTransf7);
1456 //--- Beams of the bottom
1457 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, fLadderBeamRadius,
1458 fLadderWidth/2.-fLadderLb/3, 0, 180);
1459 TGeoVolume *bottomBeam1Vol = new TGeoVolume("ITSsddBottomBeam1Vol",
1460 bottomBeam1, carbonFiberLadderStruct);
1461 bottomBeam1Vol->SetLineColor(fColorCarbonFiber);
1462 TGeoRotation *bottomBeamRot1 = new TGeoRotation("",90, 90, 90);
1463 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans(0,
1464 -(fLadderHeight/2-fLadderBeamRadius)+tDY,
1465 -length/2+fSegmentLength/2, bottomBeamRot1);
1466 virtualEnd->AddNode(bottomBeam1Vol, 1, bottomBeamTransf1);
1467 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, fLadderBeamRadius,
1468 fLadderWidth/2.-fLadderLb/3, 0, 90);
1469 TGeoVolume *bottomBeam2Vol = new TGeoVolume("ITSsddBottomBeam2Vol",
1470 bottomBeam2, carbonFiberLadderStruct);
1471 bottomBeam2Vol->SetLineColor(fColorCarbonFiber);
1472 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
1473 -(fLadderHeight/2-fLadderBeamRadius)+tDY,-length/2, bottomBeamRot1);
1474 virtualEnd->AddNode(bottomBeam2Vol, 1, bottomBeamTransf2);
1476 //**********************************
1477 //the cooling pipe supports
1478 Double_t triangleCPaxeDist = fCoolPipeSuppAxeDist-fCoolPipeSuppWidthExt-
1479 fCoolPipeSuppWidthIn+fLadderBeamRadius;
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);
1495 TGeoVolume *coolPipeSuppLeft = CreateCoolPipeSupportL();
1496 virtualEnd->AddNode(coolPipeSuppLeft, 1, transCPS1);
1497 TGeoVolume *coolPipeSuppRight = CreateCoolPipeSupportR();
1498 virtualEnd->AddNode(coolPipeSuppRight, 1, transCPS4);
1499 //**********************************
1500 virtualEnd->SetVisibility(kFALSE);
1505 //________________________________________________________________________
1506 TGeoVolume* AliITSv11GeometrySDD::CreateSDDsensor() {
1507 // return a box containing the SDD sensor
1509 TGeoBBox *sensorBox = new TGeoBBox("ITSsddSensorBox",
1510 fWaferWidth/2, fWaferThickness/2,fWaferLength/2);
1511 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1512 TGeoVolume *virtualSensor = new TGeoVolume("ITSsddSensor",sensorBox,airSDD);
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);
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);
1525 virtualSensor->SetVisibility(kFALSE);
1526 return virtualSensor;
1530 //________________________________________________________________________
1531 TGeoVolume *AliITSv11GeometrySDD::CreateLay3Detectors() {
1532 // return a box volume containing the detectors
1534 TGeoBBox *detBox = new TGeoBBox("ITSssdDetBox3",
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();
1543 Int_t iSegmentMin = 0;
1544 Int_t iSegmentMax = fLay3Ndet;
1545 if (fAddOnlySegment>=0) {
1546 iSegmentMin = fAddOnlySegment;
1547 iSegmentMax = fAddOnlySegment+1;
1550 for (Int_t i=iSegmentMin; i<iSegmentMax; i++) {
1551 Double_t localZ = fLay3sensorZPos[i];
1552 Double_t localY = fLadWaferSep/2+fWaferThickness/2;
1555 sprintf(transName, "ITSsddLay3SensorPos%i", i);
1556 TGeoTranslation *sensorPos = new TGeoTranslation(transName,0,localY,
1558 virtualDet->AddNode(vSDD, i, sensorPos);
1560 virtualDet->SetVisibility(kFALSE);
1565 //________________________________________________________________________
1566 void 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
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
1583 Int_t iLaddMax = fLay4Nladd;
1584 if ((fAddOnlyLadder4min >= 0)&&(fAddOnlyLadder4max < fLay4Nladd)) {
1585 iLaddMin = fAddOnlyLadder4min;
1586 iLaddMax = fAddOnlyLadder4max+1;
1588 for (Int_t iLadd = iLaddMin; iLadd < iLaddMax; iLadd++) {
1589 sprintf(rotName, "ITSsddLay4Ladd%i",iLadd);
1590 Double_t minRadiusLadBox = fLay4LaddShortRadius;
1592 minRadiusLadBox = fLay4LaddLongRadius;
1593 minRadiusLadBox += ((TGeoBBox*)lay4Ladder->GetShape())->GetDY();
1594 TGeoCombiTrans *ctLadd = CreateCombiTrans(rotName, minRadiusLadBox,
1596 virtualLayer4->AddNode(lay4Ladder, iLadd, ctLadd);
1597 sprintf(rotName, "ITSsddLay4DetBox%i",iLadd);
1598 Double_t minRadiusDetBox = fLay4DetShortRadius;
1600 minRadiusDetBox = fLay4DetLongRadius;
1601 minRadiusDetBox += detBoxThickness/2;
1602 TGeoCombiTrans *ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
1604 virtualLayer4->AddNode(lay4Detectors, iLadd, ctDet);
1606 virtualLayer4->SetVisibility(kFALSE);
1607 Moth->AddNode(virtualLayer4,1,0);
1611 //________________________________________________________________________
1612 TGeoVolume *AliITSv11GeometrySDD::CreateLay4Ladder() {
1613 // return a box volume containing the CF ladder and all pieces on it
1615 TGeoVolume *laddSegmentTemp = CreateLadderSegment(4,0);
1616 TGeoBBox *ladBox = new TGeoBBox("ITSsddLadBox",
1617 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDX(),
1618 ((TGeoBBox*)laddSegmentTemp->GetShape())->GetDY(),
1619 //dX,dY = dX,dY of the segment
1620 fLay4LadderLength/2);
1621 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1622 TGeoVolume *virtualLadder = new TGeoVolume("ITSsddLadder",ladBox, airSDD);
1623 Double_t segmentLength = fSegmentLength;
1625 // placing virtual ladder segment following detector ordering convention
1626 //=======================================================================
1627 Int_t iSegmentMin = 0;
1628 Int_t iSegmentMax = fLay4Ndet;
1629 if (fAddOnlySegment>=0) {
1630 iSegmentMin = fAddOnlySegment;
1631 iSegmentMax = fAddOnlySegment+1;
1633 for (Int_t iSegment= iSegmentMin; iSegment < iSegmentMax; iSegment++ ) {
1635 TGeoVolume *laddSegment = CreateLadderSegment(4, iSegment);
1636 sprintf(transName, "ITSsddLay4LaddSeg%i", iSegment);
1637 Double_t segmentPos = segmentLength*(fLay4Ndet/2-1-iSegment) +
1639 TGeoTranslation *segTr = new TGeoTranslation(transName,0,0,segmentPos);
1640 virtualLadder->AddNode(laddSegment, iSegment, segTr);
1642 // putting virtual volume corresponding to the end of ladder
1643 //=======================================================================
1644 TGeoVolume *endLadder = CreateEndLadder( 4,-1 );
1645 Double_t endLength = (fLay4LadderLength-fLay4Ndet*fSegmentLength)/2.;
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.,
1654 if ((fAddOnlySegment==-1)||(fAddOnlySegment==0))
1655 virtualLadder->AddNode(endLadder, 1, endTrZPos);
1656 if ((fAddOnlySegment==-1)||(fAddOnlySegment==fLay4Ndet-1))
1657 virtualLadder->AddNode(endLadder, 2, endTrZNeg);
1658 virtualLadder->SetVisibility(kFALSE);
1659 return virtualLadder;
1663 //________________________________________________________________________
1664 TGeoVolume *AliITSv11GeometrySDD::CreateLay4Detectors() {
1665 // return a box volume containing the detectors
1667 TGeoBBox *detBox = new TGeoBBox("ITSssdDetBox4",
1669 (fLadWaferSep + 2*fWaferThickness)/2,
1670 fLay4LadderLength*((fLay4Ndet-0.5)/fLay4Ndet)/2);
1671 TGeoMedium *airSDD = gGeoManager->GetMedium("ITSsddAir");
1672 TGeoVolume *virtualDet = new TGeoVolume("ITSsddDet4",detBox, airSDD);
1673 TGeoVolume *vSDD = CreateSDDsensor();
1675 Int_t iSegmentMin = 0;
1676 Int_t iSegmentMax = fLay4Ndet;
1677 if (fAddOnlySegment>=0) {
1678 iSegmentMin = fAddOnlySegment;
1679 iSegmentMax = fAddOnlySegment+1;
1682 for (Int_t i=iSegmentMin; i<iSegmentMax; i++) {
1684 Double_t localZ = fLay4sensorZPos[i];
1685 Double_t localY = fLadWaferSep/2+fWaferThickness/2;
1688 sprintf(transName, "ITSsddLay4SensorPos%i", i);
1689 TGeoTranslation *sensorPos = new TGeoTranslation(transName, 0,
1691 virtualDet->AddNode(vSDD, i, sensorPos);
1693 virtualDet->SetVisibility(kFALSE);