]> git.uio.no Git - u/mrichter/AliRoot.git/blame - ITS/UPGRADE/AliITSUv1Layer.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUv1Layer.cxx
CommitLineData
b705c75b 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// This class Defines the Geometry for the ITS Upgrade using TGeo
18// This is a work class used to study different configurations
19// during the development of the new ITS structure.
20//
21// Mario Sitta <sitta@to.infn.it>
22// Chinorat Kobdaj (kobdaj@g.sut.ac.th)
23//*************************************************************************
24
25
26/* $Id: AliITSUv1Layer.cxx */
27// General Root includes
28#include <TMath.h>
29// Root Geometry includes
30//#include <AliLog.h>
31#include <TGeoManager.h>
32#include <TGeoVolume.h>
33#include <TGeoPcon.h>
34#include <TGeoCone.h>
35#include <TGeoTube.h> // contaings TGeoTubeSeg
36#include <TGeoArb8.h>
37#include <TGeoXtru.h>
38#include <TGeoCompositeShape.h>
39#include <TGeoMatrix.h>
40#include "AliITSUv1Layer.h"
41#include "AliITSUGeomTGeo.h"
42#include <TGeoBBox.h>
43#include <TGeoShape.h>
44#include <TGeoTrd1.h>
45using namespace TMath;
46
c55b10c2 47// General Parameters
48const Int_t AliITSUv1Layer::fgkNumberOfInnerLayers = 3;
49
50const Double_t AliITSUv1Layer::fgkDefaultSensorThick = 300*fgkmicron;
51const Double_t AliITSUv1Layer::fgkDefaultStaveThick = 1*fgkcm;
52
53// Inner Barrel Parameters
54const Int_t AliITSUv1Layer::fgkIBChipsPerRow = 9;
55const Int_t AliITSUv1Layer::fgkIBNChipRows = 1;
56
57// Outer Barrel Parameters
58const Int_t AliITSUv1Layer::fgkOBChipsPerRow = 7;
59const Int_t AliITSUv1Layer::fgkOBNChipRows = 2;
60
61const Double_t AliITSUv1Layer::fgkOBHalfStaveWidth = 3.01 *fgkcm;
62const Double_t AliITSUv1Layer::fgkOBModuleWidth = fgkOBHalfStaveWidth;
63const Double_t AliITSUv1Layer::fgkOBModuleGap = 0.01 *fgkcm;
64const Double_t AliITSUv1Layer::fgkOBChipXGap = 0.01 *fgkcm;
65const Double_t AliITSUv1Layer::fgkOBChipZGap = 0.01 *fgkcm;
66const Double_t AliITSUv1Layer::fgkOBFlexCableAlThick = 0.005*fgkcm;
67const Double_t AliITSUv1Layer::fgkOBFlexCableKapThick = 0.01 *fgkcm;
68const Double_t AliITSUv1Layer::fgkOBBusCableAlThick = 0.02 *fgkcm;
69const Double_t AliITSUv1Layer::fgkOBBusCableKapThick = 0.02 *fgkcm;
70const Double_t AliITSUv1Layer::fgkOBColdPlateThick = 0.012*fgkcm;
71const Double_t AliITSUv1Layer::fgkOBCarbonPlateThick = 0.012*fgkcm;
72const Double_t AliITSUv1Layer::fgkOBGlueThick = 0.03 *fgkcm;
73const Double_t AliITSUv1Layer::fgkOBModuleZLength = 21.06 *fgkcm;
74const Double_t AliITSUv1Layer::fgkOBHalfStaveYTrans = 1.76 *fgkmm;
65740b7a 75const Double_t AliITSUv1Layer::fgkOBHalfStaveXOverlap = 4.3 *fgkmm;
c55b10c2 76const Double_t AliITSUv1Layer::fgkOBGraphiteFoilThick = 30.0 *fgkmicron;
d7ef241e 77const Double_t AliITSUv1Layer::fgkOBCoolTubeInnerD = 2.052*fgkmm;
78const Double_t AliITSUv1Layer::fgkOBCoolTubeThick = 32.0 *fgkmicron;
c55b10c2 79const Double_t AliITSUv1Layer::fgkOBCoolTubeXDist = 11.1 *fgkmm;
80
81const Double_t AliITSUv1Layer::fgkOBSpaceFrameWidth = 42.0 *fgkmm;
82const Double_t AliITSUv1Layer::fgkOBSpaceFrameTotHigh = 43.1 *fgkmm;
83const Double_t AliITSUv1Layer::fgkOBSFrameBeamRadius = 0.6 *fgkmm;
84const Double_t AliITSUv1Layer::fgkOBSpaceFrameLa = 3.0 *fgkmm;
85const Double_t AliITSUv1Layer::fgkOBSpaceFrameHa = 0.721979*fgkmm;
86const Double_t AliITSUv1Layer::fgkOBSpaceFrameLb = 3.7 *fgkmm;
87const Double_t AliITSUv1Layer::fgkOBSpaceFrameHb = 0.890428*fgkmm;
88const Double_t AliITSUv1Layer::fgkOBSpaceFrameL = 0.25 *fgkmm;
89const Double_t AliITSUv1Layer::fgkOBSFBotBeamAngle = 56.5;
90const Double_t AliITSUv1Layer::fgkOBSFrameBeamSidePhi = 65.0;
b705c75b 91
92
93ClassImp(AliITSUv1Layer)
94
95#define SQ(A) (A)*(A)
96
97//________________________________________________________________________
98AliITSUv1Layer::AliITSUv1Layer():
99 AliITSv11Geometry(),
100 fLayerNumber(0),
101 fPhi0(0),
102 fLayRadius(0),
103 fZLength(0),
104 fSensorThick(0),
852af72e 105 fStaveThick(0),
106 fStaveWidth(0),
107 fStaveTilt(0),
108 fNStaves(0),
c55b10c2 109 fNModules(0),
852af72e 110 fNChips(0),
111 fChipTypeID(0),
b705c75b 112 fIsTurbo(0),
113 fBuildLevel(0),
114 fStaveModel(AliITSUv1::kIBModelDummy)
115{
116 //
117 // Standard constructor
c55b10c2 118 for (int i=kNHLevels;i--;) fHierarchy[i] = 0;
b705c75b 119 //
120}
121
122//________________________________________________________________________
123AliITSUv1Layer::AliITSUv1Layer(Int_t debug):
124 AliITSv11Geometry(debug),
125 fLayerNumber(0),
126 fPhi0(0),
127 fLayRadius(0),
128 fZLength(0),
129 fSensorThick(0),
852af72e 130 fStaveThick(0),
131 fStaveWidth(0),
132 fStaveTilt(0),
133 fNStaves(0),
c55b10c2 134 fNModules(0),
852af72e 135 fNChips(0),
136 fChipTypeID(0),
b705c75b 137 fIsTurbo(0),
138 fBuildLevel(0),
139 fStaveModel(AliITSUv1::kIBModelDummy)
140{
141 //
142 // Constructor setting debugging level
c55b10c2 143 for (int i=kNHLevels;i--;) fHierarchy[i] = 0;
b705c75b 144 //
145}
146
147//________________________________________________________________________
148AliITSUv1Layer::AliITSUv1Layer(Int_t lay, Int_t debug):
149 AliITSv11Geometry(debug),
150 fLayerNumber(lay),
151 fPhi0(0),
152 fLayRadius(0),
153 fZLength(0),
154 fSensorThick(0),
852af72e 155 fStaveThick(0),
156 fStaveWidth(0),
157 fStaveTilt(0),
158 fNStaves(0),
c55b10c2 159 fNModules(0),
852af72e 160 fNChips(0),
161 fChipTypeID(0),
b705c75b 162 fIsTurbo(0),
163 fBuildLevel(0),
164 fStaveModel(AliITSUv1::kIBModelDummy)
165{
166 //
167 // Constructor setting layer number and debugging level
c55b10c2 168 for (int i=kNHLevels;i--;) fHierarchy[i] = 0;
b705c75b 169 //
170}
171
172//________________________________________________________________________
173AliITSUv1Layer::AliITSUv1Layer(Int_t lay, Bool_t turbo, Int_t debug):
174 AliITSv11Geometry(debug),
175 fLayerNumber(lay),
176 fPhi0(0),
177 fLayRadius(0),
178 fZLength(0),
179 fSensorThick(0),
852af72e 180 fStaveThick(0),
181 fStaveWidth(0),
182 fStaveTilt(0),
183 fNStaves(0),
c55b10c2 184 fNModules(0),
852af72e 185 fNChips(0),
186 fChipTypeID(0),
b705c75b 187 fIsTurbo(turbo),
188 fBuildLevel(0),
189 fStaveModel(AliITSUv1::kIBModelDummy)
190{
191 //
192 // Constructor setting layer number and debugging level
852af72e 193 // for a "turbo" layer (i.e. where staves overlap in phi)
c55b10c2 194 for (int i=kNHLevels;i--;) fHierarchy[i] = 0;
b705c75b 195 //
196}
197
198//________________________________________________________________________
199AliITSUv1Layer::AliITSUv1Layer(const AliITSUv1Layer &s):
200 AliITSv11Geometry(s.GetDebug()),
201 fLayerNumber(s.fLayerNumber),
202 fPhi0(s.fPhi0),
203 fLayRadius(s.fLayRadius),
204 fZLength(s.fZLength),
205 fSensorThick(s.fSensorThick),
852af72e 206 fStaveThick(s.fStaveThick),
207 fStaveWidth(s.fStaveWidth),
208 fStaveTilt(s.fStaveTilt),
209 fNStaves(s.fNStaves),
c55b10c2 210 fNModules(s.fNModules),
852af72e 211 fNChips(s.fNChips),
212 fChipTypeID(s.fChipTypeID),
b705c75b 213 fIsTurbo(s.fIsTurbo),
214 fBuildLevel(s.fBuildLevel),
215 fStaveModel(s.fStaveModel)
216{
217 //
218 // Copy constructor
c55b10c2 219 for (int i=kNHLevels;i--;) fHierarchy[i] = s.fHierarchy[i];
b705c75b 220 //
221}
222
223//________________________________________________________________________
224AliITSUv1Layer& AliITSUv1Layer::operator=(const AliITSUv1Layer &s)
225{
226 //
227 // Assignment operator
228 //
229 if(&s == this) return *this;
230
231 fLayerNumber = s.fLayerNumber;
232 fPhi0 = s.fPhi0;
233 fLayRadius = s.fLayRadius;
234 fZLength = s.fZLength;
235 fSensorThick = s.fSensorThick;
c55b10c2 236 fStaveThick = s.fStaveThick;
237 fStaveWidth = s.fStaveWidth;
238 fStaveTilt = s.fStaveTilt;
239 fNStaves = s.fNStaves;
240 fNModules = s.fNModules;
241 fNChips = s.fNChips;
b705c75b 242 fIsTurbo = s.fIsTurbo;
c55b10c2 243 fChipTypeID = s.fChipTypeID;
b705c75b 244 fBuildLevel = s.fBuildLevel;
245 fStaveModel = s.fStaveModel;
c55b10c2 246 for (int i=kNHLevels;i--;) fHierarchy[i] = s.fHierarchy[i];
247 //
b705c75b 248 return *this;
249}
250
251//________________________________________________________________________
252AliITSUv1Layer::~AliITSUv1Layer() {
253 //
254 // Destructor
255 //
256}
257
258//________________________________________________________________________
259void AliITSUv1Layer::CreateLayer(TGeoVolume *moth){
260//
261// Creates the actual Layer and places inside its mother volume
262//
263// Input:
264// moth : the TGeoVolume owing the volume structure
265//
266// Output:
267//
268// Return:
269//
270// Created: 17 Jun 2011 Mario Sitta
271// Updated: 08 Jul 2011 Mario Sitta
272// Updated: 20 May 2013 Mario Sitta Layer is Assembly instead of Tube
273//
274 // Local variables
275 char volname[30];
276 Double_t xpos, ypos, zpos;
277 Double_t alpha;
278
279
280 // Check if the user set the proper parameters
c55b10c2 281 if (fLayRadius<= 0) AliFatal(Form("Wrong layer radius (%f)",fLayRadius));
282 if (fZLength <= 0) AliFatal(Form("Wrong layer length (%f)",fZLength));
852af72e 283 if (fNStaves <= 0) AliFatal(Form("Wrong number of staves (%d)",fNStaves));
c55b10c2 284 if (fNChips <= 0) AliFatal(Form("Wrong number of chips (%d)",fNChips));
285
286 if (fLayerNumber >= fgkNumberOfInnerLayers && fNModules <= 0)
287 AliFatal(Form("Wrong number of modules (%d)",fNModules));
b705c75b 288
852af72e 289 if (fStaveThick <= 0) {
290 AliInfo(Form("Stave thickness wrong or not set (%f), using default (%f)",
291 fStaveThick,fgkDefaultStaveThick));
292 fStaveThick = fgkDefaultStaveThick;
b705c75b 293 }
294
295 if (fSensorThick <= 0) {
296 AliInfo(Form("Sensor thickness wrong or not set (%f), using default (%f)",
297 fSensorThick,fgkDefaultSensorThick));
298 fSensorThick = fgkDefaultSensorThick;
299 }
300
852af72e 301 if (fSensorThick > fStaveThick) {
302 AliWarning(Form("Sensor thickness (%f) is greater than stave thickness (%f), fixing",
303 fSensorThick,fStaveThick));
304 fSensorThick = fStaveThick;
b705c75b 305 }
306
307
308 // If a Turbo layer is requested, do it and exit
309 if (fIsTurbo) {
310 CreateLayerTurbo(moth);
311 return;
312 }
313
314
852af72e 315 // First create the stave container
316 alpha = (360./(2*fNStaves))*DegToRad();
b705c75b 317
852af72e 318 // fStaveWidth = fLayRadius*Tan(alpha);
b705c75b 319
320 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSLayerPattern(),fLayerNumber);
321 TGeoVolume *layVol = new TGeoVolumeAssembly(volname);
852af72e 322 layVol->SetUniqueID(fChipTypeID);
b705c75b 323
324// layVol->SetVisibility(kFALSE);
325 layVol->SetVisibility(kTRUE);
326 layVol->SetLineColor(1);
327
852af72e 328 TGeoVolume *stavVol = CreateStave();
b705c75b 329
330
331 // Now build up the layer
852af72e 332 alpha = 360./fNStaves;
65740b7a 333 Double_t r = fLayRadius + ((TGeoBBox*)stavVol->GetShape())->GetDY();
852af72e 334 for (Int_t j=0; j<fNStaves; j++) {
b705c75b 335 Double_t phi = j*alpha + fPhi0;
336 xpos = r*CosD(phi);// r*SinD(-phi);
337 ypos = r*SinD(phi);// r*CosD(-phi);
338 zpos = 0.;
339 phi += 90;
852af72e 340 layVol->AddNode(stavVol, j, new TGeoCombiTrans( xpos, ypos, zpos,
b705c75b 341 new TGeoRotation("",phi,0,0)));
342 }
343
344
345 // Finally put everything in the mother volume
346 moth->AddNode(layVol, 1, 0);
347
348
349 // Upgrade geometry is served
350 return;
351}
352
353//________________________________________________________________________
354void AliITSUv1Layer::CreateLayerTurbo(TGeoVolume *moth){
355//
356// Creates the actual Layer and places inside its mother volume
852af72e 357// A so-called "turbo" layer is a layer where staves overlap in phi
b705c75b 358// User can set width and tilt angle, no check is performed here
359// to avoid volume overlaps
360//
361// Input:
362// moth : the TGeoVolume owing the volume structure
363//
364// Output:
365//
366// Return:
367//
368// Created: 08 Jul 2011 Mario Sitta
369// Updated: 08 Mar 2012 Mario Sitta Correct way to compute container R
370// Updated: 20 May 2013 Mario Sitta Layer is Assemgbly instead of Tube
371//
372
373
374 // Local variables
375 char volname[30];
376 Double_t xpos, ypos, zpos;
377 Double_t alpha;
378
379
380 // Check if the user set the proper (remaining) parameters
852af72e 381 if (fStaveWidth <= 0)
382 AliFatal(Form("Wrong stave width (%f)",fStaveWidth));
383 if (Abs(fStaveTilt) > 45)
384 AliWarning(Form("Stave tilt angle (%f) greater than 45deg",fStaveTilt));
b705c75b 385
386
387 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSLayerPattern(), fLayerNumber);
388 TGeoVolume *layVol = new TGeoVolumeAssembly(volname);
852af72e 389 layVol->SetUniqueID(fChipTypeID);
b705c75b 390 layVol->SetVisibility(kTRUE);
391 layVol->SetLineColor(1);
852af72e 392 TGeoVolume *stavVol = CreateStave();
b705c75b 393
394
395 // Now build up the layer
852af72e 396 alpha = 360./fNStaves;
397 Double_t r = fLayRadius /* +chip thick ?! */;
398 for (Int_t j=0; j<fNStaves; j++) {
b705c75b 399 Double_t phi = j*alpha + fPhi0;
400 xpos = r*CosD(phi);// r*SinD(-phi);
401 ypos = r*SinD(phi);// r*CosD(-phi);
402 zpos = 0.;
403 phi += 90;
852af72e 404 layVol->AddNode(stavVol, j, new TGeoCombiTrans( xpos, ypos, zpos,
405 new TGeoRotation("", phi-fStaveTilt,0,0)));
b705c75b 406 }
407
408
409 // Finally put everything in the mother volume
410 moth->AddNode(layVol, 1, 0);
411
412 return;
413}
414
415//________________________________________________________________________
852af72e 416TGeoVolume* AliITSUv1Layer::CreateStave(const TGeoManager * /*mgr*/){
b705c75b 417//
852af72e 418// Creates the actual Stave
b705c75b 419//
420// Input:
421// mgr : the GeoManager (used only to get the proper material)
422//
423// Output:
424//
425// Return:
426//
427// Created: 22 Jun 2011 Mario Sitta
428// Updated: 18 Dec 2013 Mario Sitta Handle IB and OB
429//
430
431 char volname[30];
b705c75b 432
2b9468b2 433 Double_t xlen, ylen, zlen;
434 Double_t xpos, ypos;
b705c75b 435 Double_t alpha;
436
437
438 // First create all needed shapes
852af72e 439 alpha = (360./(2*fNStaves))*DegToRad();
b705c75b 440
852af72e 441 // The stave
2b9468b2 442 xlen = fLayRadius*Tan(alpha);
443 if (fIsTurbo) xlen = 0.5*fStaveWidth;
852af72e 444 ylen = 0.5*fStaveThick;
b705c75b 445 zlen = 0.5*fZLength;
446
447 Double_t yplus = 0.46;
852af72e 448 TGeoXtru *stave = new TGeoXtru(2); //z sections
2b9468b2 449 Double_t xv[5] = {xlen,xlen,0,-xlen,-xlen};
b705c75b 450 Double_t yv[5] = {ylen+0.09,-0.15,-yplus-fSensorThick,-0.15,ylen+0.09};
852af72e 451 stave->DefinePolygon(5,xv,yv);
452 stave->DefineSection(0,-zlen,0,0,1.);
453 stave->DefineSection(1,+zlen,0,0,1.);
b705c75b 454
455 // We have all shapes: now create the real volumes
456
852af72e 457 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSStavePattern(), fLayerNumber);
c55b10c2 458// TGeoVolume *staveVol = new TGeoVolume(volname, stave, medAir);
459 TGeoVolume *staveVol = new TGeoVolumeAssembly(volname);
b705c75b 460
c55b10c2 461 // staveVol->SetVisibility(kFALSE);
462 staveVol->SetVisibility(kTRUE);
463 staveVol->SetLineColor(2);
c55b10c2 464 TGeoVolume *mechStaveVol = 0;
b705c75b 465
852af72e 466 // Now build up the stave
c55b10c2 467 if (fLayerNumber < fgkNumberOfInnerLayers) {
2b9468b2 468 TGeoVolume *modVol = CreateStaveInnerB(xlen,ylen,zlen);
469 staveVol->AddNode(modVol, 0);
c55b10c2 470 fHierarchy[kHalfStave] = 1;
b705c75b 471
2b9468b2 472 // Mechanical stave structure
473 mechStaveVol = CreateStaveStructInnerB(xlen,zlen);
06a9bd15 474 if (mechStaveVol) {
475 ypos = ((TGeoBBox*)(modVol->GetShape()))->GetDY() +
476 ((TGeoBBox*)(mechStaveVol->GetShape()))->GetDY();
477 staveVol->AddNode(mechStaveVol, 1, new TGeoCombiTrans(0, -ypos, 0, new TGeoRotation("",0, 0, 180)));
478 }
b705c75b 479 }
480
481 else{
2b9468b2 482 TGeoVolume *hstaveVol = CreateStaveOuterB();
b705c75b 483 if (fStaveModel == AliITSUv1::kOBModel0) { // Create simplified stave struct as in v0
2b9468b2 484 staveVol->AddNode(hstaveVol, 0);
485 fHierarchy[kHalfStave] = 1;
b705c75b 486 } else { // (if fStaveModel) Create new stave struct as in TDR
2b9468b2 487 xpos = ((TGeoBBox*)(hstaveVol->GetShape()))->GetDX()
c55b10c2 488 - fgkOBHalfStaveXOverlap/2;
65740b7a 489 // ypos is CF height as computed in CreateSpaceFrameOuterB1
490 ypos = (fgkOBSpaceFrameTotHigh - fgkOBHalfStaveYTrans)/2;
2b9468b2 491 staveVol->AddNode(hstaveVol, 0, new TGeoTranslation(-xpos, ypos, 0));
492 staveVol->AddNode(hstaveVol, 1, new TGeoTranslation( xpos, ypos+fgkOBHalfStaveYTrans, 0));
c55b10c2 493 fHierarchy[kHalfStave] = 2; // RS
2b9468b2 494 mechStaveVol = CreateSpaceFrameOuterB();
c55b10c2 495 if (mechStaveVol)
496 staveVol->AddNode(mechStaveVol, 1,
497 new TGeoCombiTrans(0, 0, 0,
498 new TGeoRotation("", 180, 0, 0)));
b705c75b 499 } // if (fStaveModel)
500 }
501
502
852af72e 503 // Done, return the stave
c55b10c2 504 return staveVol;
505}
506
507//________________________________________________________________________
508TGeoVolume* AliITSUv1Layer::CreateStaveInnerB(const Double_t xsta,
509 const Double_t ysta,
510 const Double_t zsta,
511 const TGeoManager *mgr){
512//
513// Create the chip stave for the Inner Barrel
514// (Here we fake the halfstave volume to have the same
515// formal geometry hierarchy as for the Outer Barrel)
516//
517// Input:
2b9468b2 518// xsta, ysta, zsta : X, Y, Z stave half lengths
c55b10c2 519// mgr : the GeoManager (used only to get the proper material)
520//
521// Output:
522//
523// Return:
524//
525// Created: 06 Mar 2014 Mario Sitta
526//
527
528 // Local variables
529 Double_t xmod, ymod, zmod;
530 char volname[30];
531
532 // First we create the module (i.e. the HIC with 9 chips)
533 TGeoVolume *moduleVol = CreateModuleInnerB(xsta, ysta, zsta);
534
535 // Then we create the fake halfstave and the actual stave
536 xmod = ((TGeoBBox*)(moduleVol->GetShape()))->GetDX();
537 ymod = ((TGeoBBox*)(moduleVol->GetShape()))->GetDY();
538 zmod = ((TGeoBBox*)(moduleVol->GetShape()))->GetDZ();
539
540 TGeoBBox *hstave = new TGeoBBox(xmod, ymod, zmod);
541
542 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
543
544 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSHalfStavePattern(), fLayerNumber);
545 TGeoVolume *hstaveVol = new TGeoVolume(volname, hstave, medAir);
546
547
548 // Finally build it up
549 hstaveVol->AddNode(moduleVol, 0);
550 fHierarchy[kModule] = 1;
551
552 // Done, return the stave structure
553 return hstaveVol;
554}
555
556//________________________________________________________________________
557TGeoVolume* AliITSUv1Layer::CreateModuleInnerB(Double_t xmod,
558 Double_t ymod,
559 Double_t zmod,
560 const TGeoManager *mgr){
561//
562// Creates the IB Module: (only the chips for the time being)
563//
564// Input:
2b9468b2 565// xmod, ymod, zmod : X, Y, Z module half lengths
c55b10c2 566// mgr : the GeoManager (used only to get the proper material)
567//
568// Output:
569//
570// Return:
571// the module as a TGeoVolume
572//
573// Created: 06 Mar 2014 M. Sitta
574//
575
2b9468b2 576 Double_t zchip;
d2a3dfa2 577 Double_t zpos;
c55b10c2 578 char volname[30];
579
580 // First create the single chip
2b9468b2 581 zchip = zmod/fgkIBChipsPerRow;
582 TGeoVolume *chipVol = CreateChipInnerB(xmod, ymod, zchip);
c55b10c2 583
584 // Then create the module and populate it with the chips
585 TGeoBBox *module = new TGeoBBox(xmod, ymod, zmod);
586
587 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
588
589 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSModulePattern(), fLayerNumber);
590 TGeoVolume *modVol = new TGeoVolume(volname, module, medAir);
591
d2a3dfa2 592 // mm (not used) zlen = ((TGeoBBox*)chipVol->GetShape())->GetDZ();
c55b10c2 593 for (Int_t j=0; j<fgkIBChipsPerRow; j++) {
2b9468b2 594 zpos = -zmod + j*2*zchip + zchip;
595 modVol->AddNode(chipVol, j, new TGeoTranslation(0, 0, zpos));
c55b10c2 596 fHierarchy[kChip]++;
597 }
598
599 // Done, return the module
600 return modVol;
b705c75b 601}
602
603//________________________________________________________________________
852af72e 604TGeoVolume* AliITSUv1Layer::CreateStaveStructInnerB(const Double_t xsta,
605 const Double_t zsta,
b705c75b 606 const TGeoManager *mgr){
607//
608// Create the mechanical stave structure
609//
610// Input:
852af72e 611// xsta : X length
612// zsta : Z length
b705c75b 613// mgr : the GeoManager (used only to get the proper material)
614//
615// Output:
616//
617// Return:
618//
619// Created: 22 Mar 2013 Chinorat Kobdaj
620// Updated: 26 Apr 2013 Mario Sitta
621//
622
852af72e 623 TGeoVolume *mechStavVol = 0;
b705c75b 624
625 switch (fStaveModel) {
626 case AliITSUv1::kIBModelDummy:
852af72e 627 mechStavVol = CreateStaveModelInnerBDummy(xsta,zsta,mgr);
b705c75b 628 break;
629 case AliITSUv1::kIBModel0:
852af72e 630 mechStavVol = CreateStaveModelInnerB0(xsta,zsta,mgr);
b705c75b 631 break;
632 case AliITSUv1::kIBModel1:
852af72e 633 mechStavVol = CreateStaveModelInnerB1(xsta,zsta,mgr);
b705c75b 634 break;
635 case AliITSUv1::kIBModel21:
852af72e 636 mechStavVol = CreateStaveModelInnerB21(xsta,zsta,mgr);
b705c75b 637 break;
638 case AliITSUv1::kIBModel22:
852af72e 639 mechStavVol = CreateStaveModelInnerB22(xsta,zsta,mgr);
b705c75b 640 break;
641 case AliITSUv1::kIBModel3:
852af72e 642 mechStavVol = CreateStaveModelInnerB3(xsta,zsta,mgr);
b705c75b 643 break;
644 default:
645 AliFatal(Form("Unknown stave model %d",fStaveModel));
646 break;
647 }
648
852af72e 649 return mechStavVol;
b705c75b 650}
651
652
653//________________________________________________________________________
654TGeoVolume* AliITSUv1Layer::CreateStaveModelInnerBDummy(const Double_t ,
655 const Double_t ,
656 const TGeoManager *) const {
657//
658// Create dummy stave
659//
660// Input:
852af72e 661// xsta : X length
662// zsta : Z length
b705c75b 663// mgr : the GeoManager (used only to get the proper material)
664//
665// Output:
666//
667// Return:
668//
669// Created: 22 Mar 2013 Chinorat Kobdaj
670// Updated: 26 Apr 2013 Mario Sitta
671//
672
673 // Done, return the stave structur
674 return 0;
675}
676
677//________________________________________________________________________
852af72e 678TGeoVolume* AliITSUv1Layer::CreateStaveModelInnerB0(const Double_t xsta,
679 const Double_t zsta,
b705c75b 680 const TGeoManager *mgr){
681//
682// Create the mechanical stave structure for Model 0 of TDR
683//
684// Input:
852af72e 685// xsta : X length
686// zsta : Z length
b705c75b 687// mgr : the GeoManager (used only to get the proper material)
688//
689// Output:
690//
691// Return:
692//
693// Created: 22 Mar 2013 Chinorat Kobdaj
694// Updated: 26 Apr 2013 Mario Sitta
695//
696
697 // Materials defined in AliITSUv1
698 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
699 TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");
700
701 TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$");
702 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
703 TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");
704 TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");
705
706 // Local parameters
707 Double_t kConeOutRadius = 0.15/2;
708 Double_t kConeInRadius = 0.1430/2;
852af72e 709 Double_t kStaveLength = zsta*2;
710 Double_t kStaveWidth = xsta*2-kConeOutRadius*2;
b705c75b 711 Double_t kWidth = kStaveWidth/4;//1/2 of kWidth
712 Double_t kStaveHeight = 0.3;
713 Double_t kHeight = kStaveHeight/2;
714 Double_t kAlpha = 90-67;//90-33.69;
715 Double_t kTheta = kAlpha*TMath::DegToRad();
716 Double_t kS1 = kWidth/TMath::Sin(kTheta);
717 Double_t kL1 = kWidth/TMath::Tan(kTheta);
718 Double_t kS2 = TMath::Sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(the2);
719 Double_t kThe2 = TMath::ATan(kHeight/kS1);
720 Double_t kBeta = kThe2*TMath::RadToDeg();
721 // Int_t loop = kStaveLength/(kL1);
722 // Double_t s3 = kWidth/(2*TMath::Sin(kTheta));
723 // Double_t s4 = 3*kWidth/(2*TMath::Sin(kTheta));
724
725 AliDebug(1, Form("BuildLevel %d\n",fBuildLevel));
726
727 char volname[30];
852af72e 728 snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSStavePattern(), fLayerNumber);
b705c75b 729
730 Double_t z=0, y=-0.011+0.0150, x=0;
731
852af72e 732 TGeoVolume *mechStavVol = 0;
b705c75b 733
734 if (fBuildLevel < 5) {
735
736 // world (trapezoid)
737 TGeoXtru *mechStruct = new TGeoXtru(2); //z sections
738 Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};
739 Double_t yv[5] = {-kConeOutRadius*2-0.07,0,kStaveHeight,0,-kConeOutRadius*2-0.07};
740 mechStruct->DefinePolygon(5,xv,yv);
741 mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);
742 mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);
743
852af72e 744 mechStavVol = new TGeoVolume(volname, mechStruct, medAir);
745 mechStavVol->SetLineColor(12);
746 mechStavVol->SetFillColor(12);
747 mechStavVol->SetVisibility(kTRUE);
b705c75b 748
749 // detailed structure ++++++++++++++
750 //Pipe Kapton grey-35
751 TGeoTube *coolTube = new TGeoTube(kConeInRadius,kConeOutRadius,kStaveLength/2);
752 TGeoVolume *volCoolTube= new TGeoVolume("pipe", coolTube, medKapton);
753 volCoolTube->SetFillColor(35);
754 volCoolTube->SetLineColor(35);
852af72e 755 mechStavVol->AddNode(volCoolTube,0,new TGeoTranslation(x+(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));
756 mechStavVol->AddNode(volCoolTube,1,new TGeoTranslation(x-(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));
b705c75b 757 }
758
759 if (fBuildLevel < 4) {
760 TGeoTube *coolTubeW = new TGeoTube(0.,kConeInRadius,kStaveLength/2);
761 TGeoVolume *volCoolTubeW= new TGeoVolume("pipeWater", coolTubeW, medWater);
762 volCoolTubeW->SetFillColor(4);
763 volCoolTubeW->SetLineColor(4);
852af72e 764 mechStavVol->AddNode(volCoolTubeW,0,new TGeoTranslation(x+(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));
765 mechStavVol->AddNode(volCoolTubeW,1,new TGeoTranslation(x-(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));
b705c75b 766 }
767
768 //frequency of filament
769 //n = 4 means very dense(4 filaments per interval)
770 //n = 2 means dense(2 filaments per interval)
771 Int_t n =4;
772 Int_t loop = (Int_t)(kStaveLength/(4*kL1/n) + 2/n)-1;
773 if (fBuildLevel < 3) {
774 //Top CFRP Filament black-12 Carbon structure TGeoBBox (length,thickness,width)
775 TGeoBBox *t2=new TGeoBBox(kS2,0.007/2,0.15/2);//(kS2,0.002,0.02);
776 TGeoVolume *volT2=new TGeoVolume("TopFilament", t2, medM60J3K);
777 volT2->SetLineColor(12);
778 volT2->SetFillColor(12);
779
780 for(int i=1;i<loop;i++){ //i<60;i++){
852af72e 781 mechStavVol->AddNode(volT2,4*i+0,
b705c75b 782 new TGeoCombiTrans(x+kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),
783 new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));
852af72e 784 mechStavVol->AddNode(volT2,4*i+1,
b705c75b 785 new TGeoCombiTrans(x-kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),
786 new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));
852af72e 787 mechStavVol->AddNode(volT2,4*i+2,
b705c75b 788 new TGeoCombiTrans(x+kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),
789 new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));
852af72e 790 mechStavVol->AddNode(volT2,4*i+3,
b705c75b 791 new TGeoCombiTrans(x-kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),
792 new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));
793 }
794
795
796 //Bottom CFRP Filament black-12 Carbon structure TGeoBBox (thickness,width,length)
797 TGeoBBox *t1=new TGeoBBox(0.007/2,0.15/2,kS1);//(0.002,0.02,kS1);
798 TGeoVolume *volT1=new TGeoVolume("CFRPBottom", t1, medM60J3K);
799 volT1->SetLineColor(12);
800 volT1->SetFillColor(12);
801
802 for(int i=1;i<loop;i++){
852af72e 803 mechStavVol->AddNode(volT1,4*i+0,
b705c75b 804 new TGeoCombiTrans(x+kWidth,y-kHeight,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(i*2*kL1),
805 new TGeoRotation("volT1",-90,kAlpha,0)));
852af72e 806 mechStavVol->AddNode(volT1,4*i+1,
b705c75b 807 new TGeoCombiTrans(x-kWidth,y-kHeight,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(i*2*kL1),
808 new TGeoRotation("volT1",90,kAlpha,0)));
852af72e 809 mechStavVol->AddNode(volT1,4*i+2,
b705c75b 810 new TGeoCombiTrans(x+kWidth,y-kHeight,z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2, //z-14.25+(i*2*kL1),
811 new TGeoRotation("volT1",-90,-kAlpha,0)));
852af72e 812 mechStavVol->AddNode(volT1,4*i+3,
b705c75b 813 new TGeoCombiTrans(x-kWidth,y-kHeight,z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2, //z-14.25+(i*2*kL1),
814 new TGeoRotation("volT1",-90,+kAlpha,0)));
815 }
816 }
817
818 if (fBuildLevel < 2) {
819 // Glue CFRP-Silicon layers TGeoBBox(thickness,width,kS1);
820 TGeoBBox *tG=new TGeoBBox(0.0075/2,0.18/2,kS1);
821 TGeoVolume *volTG=new TGeoVolume("Glue1", tG, medGlue);
822 volTG->SetLineColor(5);
823 volTG->SetFillColor(5);
824
825 for(int i=1;i<loop;i++){ //i<60;i++){
852af72e 826 mechStavVol->AddNode(volTG,4*i+0,
b705c75b 827 new TGeoCombiTrans(x+kWidth,y-0.16,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(2*kL1*i),
828 new TGeoRotation("volTG",-90,kAlpha,0)));
852af72e 829 mechStavVol->AddNode(volTG,4*i+1,
b705c75b 830 new TGeoCombiTrans(x-kWidth,y-0.16,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(2*kL1*i),
831 new TGeoRotation("volTG",90,kAlpha,0)));
852af72e 832 mechStavVol->AddNode(volTG,4*i+2,
b705c75b 833 new TGeoCombiTrans(x+kWidth,y-0.16,z-kStaveLength/2+((4/n)*i*kL1)+kS1/2, //z-14.25+(i*2*kL1),
834 new TGeoRotation("volTG",-90,-kAlpha,0)));
852af72e 835 mechStavVol->AddNode(volTG,4*i+3,
b705c75b 836 new TGeoCombiTrans(x-kWidth,y-0.16,z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2, //z-14.25+(i*2*kL1),
837 new TGeoRotation("volTG",-90,+kAlpha,0)));
838 }
839
852af72e 840 TGeoBBox *glue = new TGeoBBox(xsta, 0.005/2, zsta);
b705c75b 841 TGeoVolume *volGlue=new TGeoVolume("Glue2", glue, medGlue);
842 volGlue->SetLineColor(5);
843 volGlue->SetFillColor(5);
852af72e 844 //mechStavVol->AddNode(volGlue, 0, new TGeoCombiTrans(x, y-0.16, z, new TGeoRotation("",0, 0, 0)));
845 mechStavVol->AddNode(volGlue, 1, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005, z, new TGeoRotation("",0, 0, 0)));
b705c75b 846 }
847
848 if (fBuildLevel < 1) {
849 //Flex cable brown-28 TGeoBBox(width,thickness,length);
852af72e 850 TGeoBBox *kapCable = new TGeoBBox(xsta, 0.01/2, zsta);
b705c75b 851 TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);
852 volCable->SetLineColor(28);
853 volCable->SetFillColor(28);
852af72e 854 mechStavVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005-0.01, z, new TGeoRotation("",0, 0, 0)));
b705c75b 855 }
856
857 // Done, return the stave structur
852af72e 858 return mechStavVol;
b705c75b 859}
860
861
862//________________________________________________________________________
852af72e 863TGeoVolume* AliITSUv1Layer::CreateStaveModelInnerB1(const Double_t xsta,
864 const Double_t zsta,
b705c75b 865 const TGeoManager *mgr){
866//
867// Create the mechanical stave structure for Model 1 of TDR
868//
869// Input:
852af72e 870// xsta : X length
871// zsta : Z length
b705c75b 872// mgr : the GeoManager (used only to get the proper material)
873//
874// Output:
875//
876// Return:
877//
878// Created: 22 Mar 2013 Chinorat Kobdaj
879// Updated: 26 Apr 2013 Mario Sitta
880//
881
882 // Materials defined in AliITSUv1
883 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
884 TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");
885
886 TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$");
887 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
888 TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");
889 TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");
890
891 // Local parameters
892 Double_t kConeOutRadius = 0.15/2;
893 // Double_t kConeInRadius = 0.1430/2;
852af72e 894 Double_t kStaveLength = zsta*2;
895 // Double_t kStaveWidth = xsta*2-kConeOutRadius*2;
896 Double_t kStaveWidth = xsta*2;
b705c75b 897 Double_t kWidth = kStaveWidth/4;//1/2 of kWidth
898 Double_t kStaveHeight = 0.3;
899 Double_t kHeight = kStaveHeight/2;
900 Double_t kAlpha = 90-33.;//90-30;
901 Double_t kTheta = kAlpha*TMath::DegToRad();
902 Double_t kS1 = kWidth/TMath::Sin(kTheta);
903 Double_t kL1 = kWidth/TMath::Tan(kTheta);
904 Double_t kS2 = TMath::Sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(the2);
905 Double_t kThe2 = TMath::ATan(kHeight/kS1);
906 Double_t kBeta = kThe2*TMath::RadToDeg();
907 Int_t loop = (Int_t)((kStaveLength/(2*kL1))/2);
908
909
852af72e 910 TGeoVolume *mechStavVol = 0;
b705c75b 911
912 char volname[30];
852af72e 913 snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSStavePattern(), fLayerNumber);
b705c75b 914
915
916 // detailed structure ++++++++++++++
917 Double_t z=0, y=-0.011+0.0150, x=0;
918
919 // Polimide micro channels numbers
920 Double_t yMC = y-kHeight+0.01;
921 Int_t nb = (Int_t)(kStaveWidth/0.1)+1;
852af72e 922 Double_t xstaMC = (nb*0.1-0.08)/2;
b705c75b 923
924
925 if (fBuildLevel < 5) {
926 // world (trapezoid)
927 TGeoXtru *mechStruct = new TGeoXtru(2); //z sections
928 Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};
929 Double_t yv[5] = {-kConeOutRadius*2-0.07,0,kStaveHeight,0,-kConeOutRadius*2-0.07};
930 mechStruct->DefinePolygon(5,xv,yv);
931 mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);
932 mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);
933
852af72e 934 mechStavVol = new TGeoVolume(volname, mechStruct, medAir);
935 mechStavVol->SetLineColor(12);
936 mechStavVol->SetFillColor(12);
937 mechStavVol->SetVisibility(kTRUE);
b705c75b 938
939 // Polimide micro channels numbers
852af72e 940 TGeoBBox *tM0=new TGeoBBox(xstaMC, 0.005/2, zsta);
b705c75b 941 TGeoVolume *volTM0=new TGeoVolume("MicroChanCover", tM0, medKapton);
942 volTM0->SetLineColor(35);
943 volTM0->SetFillColor(35);
852af72e 944 mechStavVol->AddNode(volTM0, 0, new TGeoCombiTrans(x,-0.0125+yMC, z, new TGeoRotation("",0, 0, 0)));
945 mechStavVol->AddNode(volTM0, 1, new TGeoCombiTrans(x,+0.0125+yMC, z, new TGeoRotation("",0, 0, 0)));
b705c75b 946
852af72e 947 TGeoBBox *tM0b=new TGeoBBox(0.02/2, 0.02/2, zsta);
b705c75b 948 TGeoVolume *volTM0b=new TGeoVolume("MicroChanWalls", tM0b, medKapton);
949 volTM0b->SetLineColor(35);
950 volTM0b->SetFillColor(35);
951 for (Int_t ib=0;ib<nb;ib++) {
852af72e 952 mechStavVol->AddNode(volTM0b, ib, new TGeoCombiTrans(x+ib*0.1-xstaMC+0.01,yMC, z, new TGeoRotation("",0, 0, 0)));
b705c75b 953 }
954
955 }
956
957 if (fBuildLevel < 4) {
958 // Water in Polimide micro channels
852af72e 959 TGeoBBox *water=new TGeoBBox(0.08/2, 0.02/2, zsta+0.1);
b705c75b 960 TGeoVolume *volWater=new TGeoVolume("Water", water, medWater);
961 volWater->SetLineColor(4);
962 volWater->SetFillColor(4);
963 for (Int_t ib=0;ib<(nb-1);ib++) {
852af72e 964 mechStavVol->AddNode(volWater, ib, new TGeoCombiTrans(x+ib*0.1-xstaMC+0.06,yMC, z, new TGeoRotation("",0, 0, 0)));
b705c75b 965 }
966 }
967
968 if (fBuildLevel < 3) {
969 //Bottom filament CFRP black-12 Carbon structure TGeoBBox (thickness,width,length)
970 Double_t filWidth = 0.04;
971 Double_t filHeight= 0.02;
972 TGeoBBox *t1=new TGeoBBox(filHeight/2,filWidth/2,kS1);
973 TGeoVolume *volT1=new TGeoVolume("CFRPBottom", t1, medM60J3K);
974 volT1->SetLineColor(12);
975 volT1->SetFillColor(12);
976 for(int i=0;i<loop;i++){//i<30;i++){
852af72e 977 mechStavVol->AddNode(volT1,4*i+0,
b705c75b 978 new TGeoCombiTrans(x+kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+(4*kL1)+kS1/2,
979 new TGeoRotation("volT1",-90,kAlpha,0)));
852af72e 980 mechStavVol->AddNode(volT1,4*i+1,
b705c75b 981 new TGeoCombiTrans(x-kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+(4*kL1*i)+kS1/2,
982 new TGeoRotation("volT1",90,kAlpha,0)));
852af72e 983 mechStavVol->AddNode(volT1,4*i+2,
b705c75b 984 new TGeoCombiTrans(x+kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,
985 new TGeoRotation("volT1",-90,-kAlpha,0)));
852af72e 986 mechStavVol->AddNode(volT1,4*i+3,
b705c75b 987 new TGeoCombiTrans(x-kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,
988 new TGeoRotation("volT1",-90,+kAlpha,0)));
989 }
990
991 // Top filament CFRP black-12 Carbon structure TGeoBBox (length,thickness,width)
992 TGeoBBox *t2=new TGeoBBox(kS2,filHeight/2,filWidth/2);
993 TGeoVolume *volT2=new TGeoVolume("CFRPTop", t2, medM60J3K);
994 volT2->SetLineColor(12);
995 volT2->SetFillColor(12);
996 for(int i=0;i<loop;i++){ //i<30;i++){
852af72e 997 mechStavVol->AddNode(volT2,4*i+0,
b705c75b 998 new TGeoCombiTrans(x+kWidth,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*kL1)+kS1/2,
999 new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));
852af72e 1000 mechStavVol->AddNode(volT2,4*i+1,
b705c75b 1001 new TGeoCombiTrans(x-kWidth,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*kL1)+kS1/2,
1002 new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));
852af72e 1003 mechStavVol->AddNode(volT2,4*i+2,
b705c75b 1004 new TGeoCombiTrans(x+kWidth,y+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,
1005 new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));
852af72e 1006 mechStavVol->AddNode(volT2,4*i+3,
b705c75b 1007 new TGeoCombiTrans(x-kWidth,y+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,
1008 new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));
1009 }
1010 }
1011
1012 if (fBuildLevel < 2) {
1013 // Glue between filament and polimide micro channel
1014 TGeoBBox *t3=new TGeoBBox(0.01/2,0.04,kS1);
1015 TGeoVolume *volT3=new TGeoVolume("FilamentGlue", t3, medGlue);
1016 volT3->SetLineColor(5);
1017 volT3->SetFillColor(5);
1018 for(int i=0;i<loop;i++){//i<30;i++){
852af72e 1019 mechStavVol->AddNode(volT3,4*i+0,
b705c75b 1020 new TGeoCombiTrans(x+kWidth,y-kHeight+0.0325,z-kStaveLength/2+(4*kL1*i)+kS1/2,
1021 new TGeoRotation("volT1",-90,kAlpha,0)));
852af72e 1022 mechStavVol->AddNode(volT3,4*i+1,
b705c75b 1023 new TGeoCombiTrans(x-kWidth,y-kHeight+0.0325,z-kStaveLength/2+(4*kL1*i)+kS1/2,
1024 new TGeoRotation("volT1",90,kAlpha,0)));
852af72e 1025 mechStavVol->AddNode(volT3,4*i+2,
b705c75b 1026 new TGeoCombiTrans(x+kWidth,y-kHeight+0.0325,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,
1027 new TGeoRotation("volT1",-90,-kAlpha,0)));
852af72e 1028 mechStavVol->AddNode(volT3,4*i+3,
b705c75b 1029 new TGeoCombiTrans(x-kWidth,y-kHeight+0.0325,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,
1030 new TGeoRotation("volT1",-90,+kAlpha,0)));
1031 }
1032
1033 // Glue microchannel and sensor
852af72e 1034 TGeoBBox *glueM = new TGeoBBox(xsta, 0.01/2, zsta);
b705c75b 1035 TGeoVolume *volGlueM=new TGeoVolume("MicroChanGlue", glueM, medGlue);
1036 volGlueM->SetLineColor(5);
1037 volGlueM->SetFillColor(5);
852af72e 1038 mechStavVol->AddNode(volGlueM, 0, new TGeoCombiTrans(x, y-0.16, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1039
1040 // Glue sensor and kapton
852af72e 1041 TGeoBBox *glue = new TGeoBBox(xsta, 0.005/2, zsta);
b705c75b 1042 TGeoVolume *volGlue=new TGeoVolume("SensorGlue", glue, medGlue);
1043 volGlue->SetLineColor(5);
1044 volGlue->SetFillColor(5);
852af72e 1045 mechStavVol->AddNode(volGlue, 1, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1046 }
1047
1048 if (fBuildLevel < 1) {
852af72e 1049 TGeoBBox *kapCable = new TGeoBBox(xsta, 0.01/2, zsta);
b705c75b 1050 TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);
1051 volCable->SetLineColor(28);
1052 volCable->SetFillColor(28);
852af72e 1053 mechStavVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005-0.01, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1054 }
1055
1056 // Done, return the stave structur
852af72e 1057 return mechStavVol;
b705c75b 1058
1059}
1060
1061//________________________________________________________________________
852af72e 1062TGeoVolume* AliITSUv1Layer::CreateStaveModelInnerB21(const Double_t xsta,
1063 const Double_t zsta,
b705c75b 1064 const TGeoManager *mgr){
1065//
1066// Create the mechanical stave structure for Model 2.1 of TDR
1067//
1068// Input:
852af72e 1069// xsta : X length
1070// zsta : Z length
b705c75b 1071// mgr : the GeoManager (used only to get the proper material)
1072//
1073// Output:
1074//
1075// Return:
1076//
1077// Created: 22 Mar 2013 Chinorat Kobdaj
1078// Updated: 26 Apr 2013 Mario Sitta
1079//
1080
1081 // Materials defined in AliITSUv1
1082 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
1083 TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");
1084
1085 TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$");
1086 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
1087 TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");
1088 TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");
1089 TGeoMedium *medK13D2U2k = mgr->GetMedium("ITS_K13D2U2k$");
1090 TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$");
1091 TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$");
1092
1093 // Local parameters
1094 Double_t kConeOutRadius =0.151384/2;
1095 Double_t kConeInRadius = 0.145034/2;
852af72e 1096 Double_t kStaveLength = zsta;
1097 Double_t kStaveWidth = xsta*2;
b705c75b 1098 Double_t kWidth = (kStaveWidth+0.005)/4;
1099 Double_t kStaveHeigth = 0.33;//0.33;
1100 Double_t kHeight = (kStaveHeigth+0.025)/2;
1101 Double_t kAlpha = 57; //56.31;
1102 Double_t kTheta = kAlpha*TMath::DegToRad();
1103 Double_t kS1 = (kStaveWidth/4)/TMath::Sin(kTheta);
1104 Double_t kL1 = (kStaveWidth/4)/TMath::Tan(kTheta);
1105 Double_t kS2 = sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(the2);
1106 Double_t kThe2 = TMath::ATan(kHeight/kS1);
1107 Double_t kBeta = kThe2*TMath::RadToDeg();
1108 // Double_t lay1 = 0.003157;
1109 Double_t kLay1 = 0.003;//Amec carbon
1110 // Double_t lay2 = 0.0043215;//C Fleece carbon
1111 Double_t kLay2 = 0.002;//C Fleece carbon
1112 Double_t kLay3 = 0.007;//K13D2U carbon
1113 Int_t loop = (Int_t)(kStaveLength/(2*kL1));
1114
1115
1116 char volname[30];
852af72e 1117 snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSStavePattern(), fLayerNumber);
b705c75b 1118
1119 Double_t z=0, y=-(kConeOutRadius+0.03)+0.0385, x=0;
1120
852af72e 1121 TGeoVolume *mechStavVol = 0;
b705c75b 1122
1123 if (fBuildLevel < 5) {
1124 // world (trapezoid)
1125 TGeoXtru *mechStruct = new TGeoXtru(2); //z sections
1126 Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};
1127 Double_t yv[5] = {-kConeOutRadius*2-0.07,0,kStaveHeigth,0,-kConeOutRadius*2-0.07};
1128 mechStruct->DefinePolygon(5,xv,yv);
1129 mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);
1130 mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);
1131
852af72e 1132 mechStavVol = new TGeoVolume(volname, mechStruct, medAir);
1133 mechStavVol->SetLineColor(12);
1134 mechStavVol->SetFillColor(12);
1135 mechStavVol->SetVisibility(kTRUE);
b705c75b 1136
1137 //Pipe Kapton grey-35
1138 TGeoCone *cone1 = new TGeoCone(kStaveLength,kConeInRadius,kConeOutRadius,kConeInRadius,kConeOutRadius);
1139 TGeoVolume *volCone1= new TGeoVolume("PolyimidePipe", cone1, medKapton);
1140 volCone1->SetFillColor(35);
1141 volCone1->SetLineColor(35);
852af72e 1142 mechStavVol->AddNode(volCone1,1,new TGeoTranslation(x+0.25,y,z));
1143 mechStavVol->AddNode(volCone1,2,new TGeoTranslation(x-0.25,y,z));
b705c75b 1144 }
1145
1146 if (fBuildLevel < 4) {
1147
1148 TGeoTube *coolTubeW = new TGeoTube(0.,kConeInRadius,kStaveLength);
1149 TGeoVolume *volCoolTubeW= new TGeoVolume("Water", coolTubeW, medWater);
1150 volCoolTubeW->SetFillColor(4);
1151 volCoolTubeW->SetLineColor(4);
852af72e 1152 mechStavVol->AddNode(volCoolTubeW,0,new TGeoTranslation(x-0.25,y,z));
1153 mechStavVol->AddNode(volCoolTubeW,1,new TGeoTranslation(x+0.25,y,z));
b705c75b 1154 }
1155
1156 if (fBuildLevel < 3) {
1157 //top fillament
1158 // Top filament M60J black-12 Carbon structure TGeoBBox (length,thickness,width)
1159 TGeoBBox *t2=new TGeoBBox(kS2,0.02/2,0.04/2); //TGeoBBox *t2=new TGeoBBox(kS2,0.01,0.02);
1160 TGeoVolume *volT2=new TGeoVolume("TopFilament", t2, medM60J3K);
1161 volT2->SetLineColor(12);
1162 volT2->SetFillColor(12);
1163 for(int i=0;i<loop;i++){// i<28;i++){
852af72e 1164 mechStavVol->AddNode(volT2,i*4+1,new TGeoCombiTrans(x+kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));
1165 mechStavVol->AddNode(volT2,i*4+2,new TGeoCombiTrans(x-kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));
1166 mechStavVol->AddNode(volT2,i*4+3,new TGeoCombiTrans(x+kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));
1167 mechStavVol->AddNode(volT2,i*4+4,new TGeoCombiTrans(x-kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));
1168// mechStavVol->AddNode(volT2,i*4+1,new TGeoCombiTrans(x+kWidth+0.0036,y+kHeight-(0.12/2)+0.072,z+kStaveLength+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));
b705c75b 1169
1170 }
1171
1172 //wall side structure out
1173 TGeoBBox *box4 = new TGeoBBox(0.03/2,0.12/2,kStaveLength-0.50);
1174 TGeoVolume *plate4 = new TGeoVolume("WallOut",box4,medM60J3K);
1175 plate4->SetFillColor(35);
1176 plate4->SetLineColor(35);
852af72e 1177 mechStavVol->AddNode(plate4,1,new TGeoCombiTrans(x+(2*kStaveWidth/4)-(0.03/2),y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate4",0,0,0)));
1178 mechStavVol->AddNode(plate4,2,new TGeoCombiTrans(x-(2*kStaveWidth/4)+(0.03/2),y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate4",0,0,0)));
b705c75b 1179 //wall side in
1180 TGeoBBox *box5 = new TGeoBBox(0.015/2,0.12/2,kStaveLength-0.50);
1181 TGeoVolume *plate5 = new TGeoVolume("WallIn",box5,medM60J3K);
1182 plate5->SetFillColor(12);
1183 plate5->SetLineColor(12);
852af72e 1184 mechStavVol->AddNode(plate5,1,new TGeoCombiTrans(x+(2*kStaveWidth/4)-0.03-0.015/2,y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate5",0,0,0)));
1185 mechStavVol->AddNode(plate5,2,new TGeoCombiTrans(x-(2*kStaveWidth/4)+0.03+0.015/2,y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate5",0,0,0)));
b705c75b 1186
1187 //Amec Thermasol red-2 cover tube FGS300
1188 TGeoConeSeg *cons1 = new TGeoConeSeg(kStaveLength-0.50,kConeOutRadius,kConeOutRadius+kLay1,kConeOutRadius,kConeOutRadius+kLay1,0,180);
1189 TGeoVolume *cone11 = new TGeoVolume("ThermasolPipeCover",cons1,medFGS003);
1190 cone11->SetFillColor(2);
1191 cone11->SetLineColor(2);
852af72e 1192 mechStavVol->AddNode(cone11,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("Cone11",0,0,0)));
1193 mechStavVol->AddNode(cone11,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("Cone11",0,0,0)));
b705c75b 1194
1195 TGeoBBox *box2 = new TGeoBBox((0.50-(2*kConeOutRadius))/2,kLay1/2,kStaveLength-0.50);
1196 TGeoVolume *plate2 = new TGeoVolume("ThermasolMiddle",box2,medFGS003);
1197 plate2->SetFillColor(2);
1198 plate2->SetLineColor(2);
852af72e 1199 mechStavVol->AddNode(plate2,1,new TGeoCombiTrans(x,y-kConeOutRadius+(kLay1/2),z,new TGeoRotation("plate2",0,0,0)));
b705c75b 1200
1201 TGeoBBox *box21 = new TGeoBBox((0.75-0.25-kConeOutRadius-kLay1)/2,kLay1/2,kStaveLength-0.50);
1202 TGeoVolume *plate21 = new TGeoVolume("ThermasolLeftRight",box21,medFGS003);
1203 plate21->SetFillColor(2);
1204 plate21->SetLineColor(2);
852af72e 1205 mechStavVol->AddNode(plate21,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(0.75-0.25-kConeOutRadius)/2-(kLay1/2),y-kConeOutRadius+(kLay1/2),z,new TGeoRotation("plate21",0,0,0)));
1206 mechStavVol->AddNode(plate21,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-(0.75-0.25-kConeOutRadius)/2+(kLay1/2),y-kConeOutRadius+(kLay1/2),z,new TGeoRotation("plate21",0,0,0)));
b705c75b 1207
1208 TGeoBBox *box22 = new TGeoBBox((kLay1/2),kConeOutRadius/2,kStaveLength-0.50);
1209 TGeoVolume *plate22 = new TGeoVolume("ThermasolVertical",box22,medFGS003);
1210 plate22->SetFillColor(2);
1211 plate22->SetLineColor(2);
852af72e 1212 mechStavVol->AddNode(plate22,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
1213 mechStavVol->AddNode(plate22,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
1214 mechStavVol->AddNode(plate22,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
1215 mechStavVol->AddNode(plate22,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
b705c75b 1216
1217 //C Fleece
1218 TGeoConeSeg *cons2 = new TGeoConeSeg(kStaveLength-0.50,kConeOutRadius+kLay1,kConeOutRadius+kLay1+kLay2,kConeOutRadius+kLay1,kConeOutRadius+kLay1+kLay2,0,180);
1219 TGeoVolume *cone12 = new TGeoVolume("CFleecePipeCover",cons2,medCarbonFleece);
1220 cone12->SetFillColor(28);
1221 cone12->SetLineColor(28);
852af72e 1222 mechStavVol->AddNode(cone12,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("Cone12",0,0,0)));
1223 mechStavVol->AddNode(cone12,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("Cone12",0,0,0)));
b705c75b 1224
1225 TGeoBBox *box3 = new TGeoBBox((0.50-(2*(kConeOutRadius+kLay1)))/2,kLay2/2,kStaveLength-0.50);
1226 TGeoVolume *plate3 = new TGeoVolume("CFleeceMiddle",box3,medCarbonFleece);
1227 plate3->SetFillColor(28);
1228 plate3->SetLineColor(28);
852af72e 1229 mechStavVol->AddNode(plate3,1,new TGeoCombiTrans(x,y-kConeOutRadius+kLay1+(kLay2/2),z,new TGeoRotation("plate3",0,0,0)));
b705c75b 1230
1231 TGeoBBox *box31 = new TGeoBBox((0.75-0.25-kConeOutRadius-kLay1)/2,kLay2/2,kStaveLength-0.50);
1232 TGeoVolume *plate31 = new TGeoVolume("CFleeceLeftRight",box31,medCarbonFleece);
1233 plate31->SetFillColor(28);
1234 plate31->SetLineColor(28);
852af72e 1235 mechStavVol->AddNode(plate31,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+kLay1+(0.75-0.25-kConeOutRadius-kLay1)/2,y-kConeOutRadius+kLay1+(kLay2/2),z,new TGeoRotation("plate31",0,0,0)));
1236 mechStavVol->AddNode(plate31,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-kLay1-(0.75-0.25-kConeOutRadius-kLay1)/2,y-kConeOutRadius+kLay1+(kLay2/2),z,new TGeoRotation("plate31",0,0,0)));
b705c75b 1237
1238 TGeoBBox *box32 = new TGeoBBox((kLay2/2),(kConeOutRadius-kLay1)/2,kStaveLength-0.50);
1239 TGeoVolume *plate32 = new TGeoVolume("CFleeceVertical",box32,medCarbonFleece);
1240 plate32->SetFillColor(28);
1241 plate32->SetLineColor(28);
852af72e 1242 mechStavVol->AddNode(plate32,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+kLay1+(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
1243 mechStavVol->AddNode(plate32,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-kLay1-(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
1244 mechStavVol->AddNode(plate32,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+kLay1+(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
1245 mechStavVol->AddNode(plate32,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-kLay1-(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
b705c75b 1246
1247
1248 //K13D2U carbon plate
1249 TGeoBBox *box1 = new TGeoBBox(2*kWidth,kLay3/2,kStaveLength-0.50);
1250 TGeoVolume *plate1 = new TGeoVolume("CarbonPlate",box1,medK13D2U2k);
1251 plate1->SetFillColor(5);
1252 plate1->SetLineColor(5);
852af72e 1253 mechStavVol->AddNode(plate1,1,new TGeoCombiTrans(x,y-(kConeOutRadius+(kLay3/2)),z,new TGeoRotation("plate1",0,0,0)));
b705c75b 1254
1255 //C Fleece bottom plate
1256 TGeoBBox *box6 = new TGeoBBox(2*kWidth,kLay2/2,kStaveLength-0.50);
1257 TGeoVolume *plate6 = new TGeoVolume("CFleeceBottom",box6,medCarbonFleece);
1258 plate6->SetFillColor(2);
1259 plate6->SetLineColor(2);
852af72e 1260 mechStavVol->AddNode(plate6,1,new TGeoCombiTrans(x,y-(kConeOutRadius+kLay3+(kLay2/2)),z,new TGeoRotation("plate1",0,0,0)));
b705c75b 1261
1262
1263 }
1264
1265 if (fBuildLevel < 2) {
1266 //Glue layers and kapton
852af72e 1267 TGeoBBox *glue = new TGeoBBox(kStaveWidth/2, 0.005/2, zsta);
b705c75b 1268 TGeoVolume *volGlue=new TGeoVolume("Glue", glue, medGlue);
1269 volGlue->SetLineColor(5);
1270 volGlue->SetFillColor(5);
852af72e 1271 mechStavVol->AddNode(volGlue, 0, new TGeoCombiTrans(x,y-(kConeOutRadius+kLay3+(kLay2/2)+(0.01/2)), z, new TGeoRotation("",0, 0, 0)));
1272 mechStavVol->AddNode(volGlue, 1, new TGeoCombiTrans(x,y-(kConeOutRadius+kLay3+(kLay2/2)+0.01+fSensorThick+(0.01/2)), z, new TGeoRotation("",0, 0, 0)));
b705c75b 1273 }
1274
1275 if (fBuildLevel < 1) {
852af72e 1276 TGeoBBox *kapCable = new TGeoBBox(kStaveWidth/2, 0.01/2, zsta);
b705c75b 1277 TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);
1278 volCable->SetLineColor(28);
1279 volCable->SetFillColor(28);
852af72e 1280 mechStavVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-(kConeOutRadius+kLay3+(kLay2/2)+0.01+fSensorThick+0.01+(0.01/2)), z, new TGeoRotation("",0, 0, 0)));
b705c75b 1281 }
1282
1283
1284 // Done, return the stave structure
852af72e 1285 return mechStavVol;
b705c75b 1286
1287}
1288// new model22
1289//________________________________________________________________________
852af72e 1290TGeoVolume* AliITSUv1Layer::CreateStaveModelInnerB22(const Double_t xsta,
1291 const Double_t zsta,
b705c75b 1292 const TGeoManager *mgr){
1293//
1294// Create the mechanical stave structure for Model 2.2 of TDR
1295//
1296// Input:
852af72e 1297// xsta : X length
1298// zsta : Z length
b705c75b 1299// mgr : the GeoManager (used only to get the proper material)
1300//
1301// Output:
1302//
1303// Return:
1304//
1305// Created: 22 Mar 2013 Chinorat Kobdaj
1306// Updated: 26 Apr 2013 Mario Sitta
1307// Updated: 30 Apr 2013 Wanchaloem Poonsawat
1308//
1309
1310 // Materials defined in AliITSUv1
1311 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
1312 TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");
1313
1314 TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$");
1315 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
1316 TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");
1317 TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");
1318 TGeoMedium *medK13D2U2k = mgr->GetMedium("ITS_K13D2U2k$");
1319 TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$");
1320 TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$");
1321
1322 // Local parameters
d7ef241e 1323 Double_t kConeOutRadius =(0.1024+0.0025)/2;//0.107/2;
1324 Double_t kConeInRadius = 0.1024/2;//0.10105/2
852af72e 1325 Double_t kStaveLength = zsta;
1326 Double_t kStaveWidth = xsta*2;
b705c75b 1327 Double_t kWidth = (kStaveWidth)/4;
1328 Double_t kStaveHeight = 0.283;//0.33;
1329 Double_t kHeight = (kStaveHeight)/2;
1330 Double_t kAlpha = 57;//56.31;
1331 Double_t kTheta = kAlpha*TMath::DegToRad();
1332 Double_t kS1 = ((kStaveWidth)/4)/TMath::Sin(kTheta);
1333 Double_t kL1 = (kStaveWidth/4)/TMath::Tan(kTheta);
1334 Double_t kS2 = sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(kThe2);
1335 Double_t kThe2 = TMath::ATan(kHeight/(0.375-0.036));
1336 Double_t kBeta = kThe2*TMath::RadToDeg();
1337 Double_t klay1 = 0.003;//Amec carbon
1338 Double_t klay2 = 0.002;//C Fleece carbon
1339 Double_t klay3 = 0.007;//CFplate K13D2U carbon
1340 Double_t klay4 = 0.007;//GluekStaveLength/2
1341 Double_t klay5 = 0.01;//Flex cable
1342 Double_t kTopVertexMaxWidth = 0.072;
1343 Double_t kTopVertexHeight = 0.04;
1344 Double_t kSideVertexMWidth = 0.052;
1345 Double_t kSideVertexHeight = 0.11;
1346
1347
1348 Int_t loop = (Int_t)(kStaveLength/(2*kL1));
1349
1350 char volname[30];
852af72e 1351 snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSStavePattern(), fLayerNumber);
b705c75b 1352
1353 Double_t z=0, y=-(2*kConeOutRadius)+klay1+klay2+fSensorThick/2-0.0004, x=0;
1354
852af72e 1355 TGeoVolume *mechStavVol = 0;
b705c75b 1356
1357 if (fBuildLevel < 5) {
1358 // world (trapezoid)
1359 TGeoXtru *mechStruct = new TGeoXtru(2); //z sections
1360 Double_t xv[6] = {kStaveWidth/2,kStaveWidth/2,0.012,-0.012,-kStaveWidth/2,-kStaveWidth/2};
1361 /* Double_t yv[6] = {-2*(kConeOutRadius+klay1+1.5*klay2+klay3+klay4+fSensorThick+klay5),
1362 0-0.02,kStaveHeight+0.01,kStaveHeight+0.01,0-0.02,
1363 -2*(kConeOutRadius+klay1+1.5*klay2+klay3+klay4+fSensorThick+klay5)}; // (kConeOutRadius*2)-0.0635 */
1364 Double_t yv[6] = {-(kConeOutRadius*2)-0.06395,0-0.02,kStaveHeight+0.01,kStaveHeight+0.01,0-0.02,-(kConeOutRadius*2)-0.06395}; // (kConeOutRadius*2)-0.064
1365 mechStruct->DefinePolygon(6,xv,yv);
1366 mechStruct->DefineSection(0,-kStaveLength,0,0,1.);
1367 mechStruct->DefineSection(1,kStaveLength,0,0,1.);
1368
852af72e 1369 mechStavVol = new TGeoVolume(volname, mechStruct, medAir);
1370 mechStavVol->SetLineColor(12);
1371 mechStavVol->SetFillColor(12);
1372 mechStavVol->SetVisibility(kTRUE);
b705c75b 1373
1374 //Polyimide Pipe Kapton grey-35
1375 TGeoCone *cone1 = new TGeoCone(kStaveLength,kConeInRadius,kConeOutRadius-0.0001,kConeInRadius,kConeOutRadius-0.0001);
1376 TGeoVolume *volCone1= new TGeoVolume("PolyimidePipe", cone1, medKapton);
1377 volCone1->SetFillColor(35);
1378 volCone1->SetLineColor(35);
852af72e 1379 mechStavVol->AddNode(volCone1,1,new TGeoTranslation(x+0.25,y,z));
1380 mechStavVol->AddNode(volCone1,2,new TGeoTranslation(x-0.25,y,z));
b705c75b 1381 }
1382
1383 if (fBuildLevel < 4) {
1384 TGeoTube *coolTubeW = new TGeoTube(0.,kConeInRadius-0.0001,kStaveLength);
1385 TGeoVolume *volCoolTubeW= new TGeoVolume("Water", coolTubeW, medWater);
1386 volCoolTubeW->SetFillColor(4);
1387 volCoolTubeW->SetLineColor(4);
852af72e 1388 mechStavVol->AddNode(volCoolTubeW,0,new TGeoTranslation(x-0.25,y,z));
1389 mechStavVol->AddNode(volCoolTubeW,1,new TGeoTranslation(x+0.25,y,z));
b705c75b 1390 }
1391
1392 if (fBuildLevel < 3) {
1393 //top fillament
1394 // Top filament M60J black-12 Carbon structure TGeoBBox (length,thickness,width)
1395 TGeoBBox *t2=new TGeoBBox(kS2-0.028,0.02/2,0.02/2); //0.04/2//TGeoBBox *t2=new TGeoBBox(kS2,0.01,0.02);//kS2-0.03 old Config.C
1396 TGeoVolume *volT2=new TGeoVolume("TopFilament", t2, medM60J3K);
1397 volT2->SetLineColor(12);
1398 volT2->SetFillColor(12);
1399 for(int i=0;i<loop;i++){// i<28;i++){
1400 // 1) Front Left Top Filament
852af72e 1401 mechStavVol->AddNode(volT2,i*4+1,new TGeoCombiTrans(x+kWidth+0.0036,y+kHeight+0.01,z-kStaveLength+0.1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));
b705c75b 1402 // 2) Front Right Top Filament
852af72e 1403 mechStavVol->AddNode(volT2,i*4+2,new TGeoCombiTrans(x-kWidth-0.0036,y+kHeight+0.01,z-kStaveLength+0.1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));
b705c75b 1404 // 3) Back Left Top Filament
852af72e 1405 mechStavVol->AddNode(volT2,i*4+3,new TGeoCombiTrans(x+kWidth+0.0036,y+kHeight+0.01,z-kStaveLength+0.1+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));
b705c75b 1406 // 4) Back Right Top Filament
852af72e 1407 mechStavVol->AddNode(volT2,i*4+4,new TGeoCombiTrans(x-kWidth-0.0036,y+kHeight+0.01,z-kStaveLength+0.1+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));
b705c75b 1408 }
1409
1410 //Vertex structure
1411
1412 //top ver trd1
1413 TGeoTrd1 *trd1 = new TGeoTrd1(0,kTopVertexMaxWidth/2,kStaveLength,kTopVertexHeight/2);
1414 TGeoVolume *ibdv = new TGeoVolume("TopVertex",trd1,medM60J3K);
1415 ibdv->SetFillColor(12);
1416 ibdv->SetLineColor(12);
852af72e 1417 mechStavVol->AddNode(ibdv,1,new TGeoCombiTrans(x,y+kStaveHeight+0.03,z,new TGeoRotation("ibdv",0.,-90,0)));//y+kStaveHeight+0.056
b705c75b 1418
1419 //left trd2
1420 TGeoTrd1 *trd2 = new TGeoTrd1(0,kSideVertexMWidth/2,kStaveLength, kSideVertexHeight/2);
1421 TGeoVolume *ibdv2 = new TGeoVolume("LeftVertex",trd2,medM60J3K);
1422 ibdv2->SetFillColor(12);
1423 ibdv2->SetLineColor(12);
852af72e 1424 mechStavVol->AddNode(ibdv2,1,new TGeoCombiTrans(x+kStaveWidth/2-0.06,y-0.0355,z,new TGeoRotation("ibdv2",-103.3,90,0))); //x-kStaveWidth/2-0.09 old Config.C y-0.0355,
b705c75b 1425
1426 //right trd3
1427 TGeoTrd1 *trd3 = new TGeoTrd1(0,kSideVertexMWidth/2,kStaveLength, kSideVertexHeight/2);
1428 TGeoVolume *ibdv3 = new TGeoVolume("RightVertex",trd3,medM60J3K);
1429 ibdv3->SetFillColor(12);
1430 ibdv3->SetLineColor(12);
852af72e 1431 mechStavVol->AddNode(ibdv3,1,new TGeoCombiTrans(x-kStaveWidth/2+0.06,y-0.0355,z,new TGeoRotation("ibdv3",103.3,90,0))); //x-kStaveWidth/2+0.09 old Config.C
b705c75b 1432
1433 //Carbon Fleece
852af72e 1434 TGeoConeSeg *cons2 = new TGeoConeSeg(zsta,kConeOutRadius+klay1,kConeOutRadius+klay1+klay2,kConeOutRadius+klay1,kConeOutRadius+klay1+klay2,0,180);
b705c75b 1435 TGeoVolume *cone12 = new TGeoVolume("CarbonFleecePipeCover",cons2,medCarbonFleece);
1436 cone12->SetFillColor(28);
1437 cone12->SetLineColor(28);
852af72e 1438 mechStavVol->AddNode(cone12,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("cone12",0,0,0)));
1439 mechStavVol->AddNode(cone12,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("cone12",0,0,0)));
b705c75b 1440
852af72e 1441 TGeoBBox *box3 = new TGeoBBox((0.50-(2*(kConeOutRadius+klay1)))/2,klay2/2,zsta);//kStaveLength-0.50);
b705c75b 1442 TGeoVolume *plate3 = new TGeoVolume("CarbonFleeceMiddle",box3,medCarbonFleece);
1443 plate3->SetFillColor(28);
1444 plate3->SetLineColor(28);
852af72e 1445 mechStavVol->AddNode(plate3,1,new TGeoCombiTrans(x,y-kConeOutRadius+klay1+(klay2/2),z,new TGeoRotation("plate3",0,0,0)));
b705c75b 1446
852af72e 1447 TGeoBBox *box31 = new TGeoBBox((0.75-0.25-kConeOutRadius-klay1)/2+0.0025,klay2/2,zsta);
b705c75b 1448 TGeoVolume *plate31 = new TGeoVolume("CarbonFleeceLeftRight",box31,medCarbonFleece);
1449 plate31->SetFillColor(28);
1450 plate31->SetLineColor(28);
852af72e 1451 mechStavVol->AddNode(plate31,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+klay1+(0.75-0.25-kConeOutRadius-klay1)/2,y-kConeOutRadius+klay1+(klay2/2),z,new TGeoRotation("plate31",0,0,0)));
1452 mechStavVol->AddNode(plate31,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-klay1-(0.75-0.25-kConeOutRadius-klay1)/2,y-kConeOutRadius+klay1+(klay2/2),z,new TGeoRotation("plate31",0,0,0)));
b705c75b 1453
852af72e 1454 TGeoBBox *box32 = new TGeoBBox((klay2/2),(kConeOutRadius-klay1)/2,zsta);
b705c75b 1455 TGeoVolume *plate32 = new TGeoVolume("CarbonFleeceVertical",box32,medCarbonFleece);
1456 plate32->SetFillColor(28);
1457 plate32->SetLineColor(28);
852af72e 1458 mechStavVol->AddNode(plate32,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+klay1+(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
1459 mechStavVol->AddNode(plate32,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-klay1-(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
1460 mechStavVol->AddNode(plate32,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+klay1+(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
1461 mechStavVol->AddNode(plate32,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-klay1-(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));
b705c75b 1462
1463 //Amec Thermasol red-2 cover tube FGS300 or Carbon Paper
852af72e 1464 TGeoConeSeg *cons1 = new TGeoConeSeg(zsta,kConeOutRadius,kConeOutRadius+klay1-0.0001,kConeOutRadius,kConeOutRadius+klay1-0.0001,0,180);//kConeOutRadius+klay1-0.0001
b705c75b 1465 TGeoVolume *cone11 = new TGeoVolume("ThermasolPipeCover",cons1,medFGS003);
1466 cone11->SetFillColor(2);
1467 cone11->SetLineColor(2);
852af72e 1468 mechStavVol->AddNode(cone11,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("cone11",0,0,0)));
1469 mechStavVol->AddNode(cone11,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("cone11",0,0,0)));
b705c75b 1470
852af72e 1471 TGeoBBox *box2 = new TGeoBBox((0.50-(2*kConeOutRadius))/2,(klay1/2),zsta);//kStaveLength-0.50);
b705c75b 1472 TGeoVolume *plate2 = new TGeoVolume("ThermasolMiddle",box2,medFGS003);
1473 plate2->SetFillColor(2);
1474 plate2->SetLineColor(2);
852af72e 1475 mechStavVol->AddNode(plate2,1,new TGeoCombiTrans(x,y-kConeOutRadius+(klay1/2),z,new TGeoRotation("plate2",0,0,0)));
b705c75b 1476
852af72e 1477 TGeoBBox *box21 = new TGeoBBox((0.75-0.25-kConeOutRadius-klay1)/2+0.0025,(klay1/2),zsta);
b705c75b 1478 TGeoVolume *plate21 = new TGeoVolume("ThermasolLeftRight",box21,medFGS003);
1479 plate21->SetFillColor(2);
1480 plate21->SetLineColor(2);
852af72e 1481 mechStavVol->AddNode(plate21,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(0.75-0.25-kConeOutRadius)/2-(klay1/2)+0.0025,y-kConeOutRadius+(klay1/2),z,new TGeoRotation("plate21",0,0,0)));
1482 mechStavVol->AddNode(plate21,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-(0.75-0.25-kConeOutRadius)/2+(klay1/2)-0.0025,y-kConeOutRadius+(klay1/2),z,new TGeoRotation("plate21",0,0,0)));
b705c75b 1483
852af72e 1484 TGeoBBox *box22 = new TGeoBBox((klay1/2),kConeOutRadius/2,zsta);
b705c75b 1485 TGeoVolume *plate22 = new TGeoVolume("ThermasolVertical",box22,medFGS003);
1486 plate22->SetFillColor(2);
1487 plate22->SetLineColor(2);
852af72e 1488 mechStavVol->AddNode(plate22,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
1489 mechStavVol->AddNode(plate22,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
1490 mechStavVol->AddNode(plate22,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
1491 mechStavVol->AddNode(plate22,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));
b705c75b 1492
1493 //K13D2U CF plate
852af72e 1494 TGeoBBox *box1 = new TGeoBBox(2*kWidth,(klay3)/2,zsta);
b705c75b 1495 TGeoVolume *plate1 = new TGeoVolume("CFPlate",box1,medK13D2U2k);
1496 plate1->SetFillColor(5);
1497 plate1->SetLineColor(5);
852af72e 1498 mechStavVol->AddNode(plate1,1,new TGeoCombiTrans(x,y-(kConeOutRadius+(klay3/2)),z,new TGeoRotation("plate1",0,0,0)));
b705c75b 1499
1500 //C Fleece bottom plate
852af72e 1501 TGeoBBox *box6 = new TGeoBBox(2*kWidth,(klay2)/2,zsta);
b705c75b 1502 TGeoVolume *plate6 = new TGeoVolume("CarbonFleeceBottom",box6,medCarbonFleece);
1503 plate6->SetFillColor(2);
1504 plate6->SetLineColor(2);
852af72e 1505 mechStavVol->AddNode(plate6,1,new TGeoCombiTrans(x,y-(kConeOutRadius+klay3+(klay2/2)),z,new TGeoRotation("plate6",0,0,0)));
b705c75b 1506
1507 }
1508 if (fBuildLevel < 2) {
1509 //Glue klayers and kapton
852af72e 1510 TGeoBBox *glue = new TGeoBBox(kStaveWidth/2, (klay4)/2, zsta);
b705c75b 1511 TGeoVolume *volGlue=new TGeoVolume("Glue", glue, medGlue);
1512 volGlue->SetLineColor(5);
1513 volGlue->SetFillColor(5);
852af72e 1514 // mechStavVol->AddNode(volGlue, 0, new TGeoCombiTrans(x,y-(kConeOutRadius+klay3+klay2+(klay4/2)), z, new TGeoRotation("",0, 0, 0)));
1515 mechStavVol->AddNode(volGlue, 0, new TGeoCombiTrans(x,y-(kConeOutRadius+klay3+klay2+(klay4)/2)+0.00005, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1516 }
1517
1518 if (fBuildLevel < 1) {
1519 //Flex Cable or Bus
852af72e 1520 TGeoBBox *kapCable = new TGeoBBox(kStaveWidth/2, klay5/2, zsta);//klay5/2
b705c75b 1521 TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);
1522 volCable->SetLineColor(28);
1523 volCable->SetFillColor(28);
852af72e 1524 // mechStavVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-(kConeOutRadius+klay3+klay2+klay4+fSensorThick+(klay5)/2)+0.0002, z, new TGeoRotation("",0, 0, 0)));
1525 mechStavVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-(kConeOutRadius+klay3+klay2+klay4+fSensorThick+(klay5)/2)+0.01185, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1526 }
1527 // Done, return the stave structe
852af72e 1528 return mechStavVol;
b705c75b 1529}
1530
1531// model3
1532//________________________________________________________________________
852af72e 1533TGeoVolume* AliITSUv1Layer::CreateStaveModelInnerB3(const Double_t xsta,
1534 const Double_t zsta,
b705c75b 1535 const TGeoManager *mgr){
1536//
1537// Create the mechanical stave structure for Model 3 of TDR
1538//
1539// Input:
852af72e 1540// xsta : X length
1541// zsta : Z length
b705c75b 1542// mgr : the GeoManager (used only to get the proper material)
1543//
1544// Output:
1545//
1546// Return:
1547//
1548// Created: 28 May 2013 Chinorat Kobdaj
1549// Updated: Mario Sitta
1550// Updated: Wanchaloem Poonsawat
1551//
1552
1553 // Materials defined in AliITSUv1
1554 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
1555 TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");
1556
1557 TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$");
1558 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
1559 TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");
1560 TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");
1561 //TGeoMedium *medK13D2U2k = mgr->GetMedium("ITS_K13D2U2k$");
1562 //TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$");
1563 //TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$");
1564
1565 // Local parameters
1566 Double_t kConeOutRadius = 0.15/2;
852af72e 1567 Double_t kStaveLength = zsta*2;
1568 Double_t kStaveWidth = xsta*2;
b705c75b 1569 Double_t w = kStaveWidth/4;//1/2 of W
1570 Double_t staveHeight = 0.3;
1571 Double_t h = staveHeight/2;
1572 Double_t alpha = 90-33.;//90-30;
1573 Double_t the1 = alpha*TMath::DegToRad();
1574 Double_t s1 = w/TMath::Sin(the1);
1575 Double_t l = w/TMath::Tan(the1);
1576 Double_t s2 = TMath::Sqrt(h*h + s1*s1);//TMath::Sin(the2);
1577 Double_t the2 = TMath::ATan(h/s1);
1578 Double_t beta = the2*TMath::RadToDeg();
1579 Double_t klay4 = 0.007; //Glue
1580 Double_t klay5 = 0.01; //Flexcable
1581 Int_t loop = (Int_t)((kStaveLength/(2*l))/2);
1582 Double_t hh = 0.01;
1583 Double_t ang1 = 0*TMath::DegToRad();
1584 Double_t ang2 = 0*TMath::DegToRad();
1585 Double_t ang3 = 0*TMath::DegToRad();
852af72e 1586 Int_t chips = 4;
b705c75b 1587 Double_t headWidth=0.25;
852af72e 1588 Double_t smcLength=kStaveLength/chips-2*headWidth;//6.25;
b705c75b 1589 Double_t smcWidth=kStaveWidth;
1590 Double_t smcSide1Thick=0.03;
1591 Double_t vaporThick=0.032;
1592 Double_t liquidThick=0.028;
1593 Double_t smcSide2Thick=0.01;
1594 Double_t smcSide3Thick=0.0055;
1595 Double_t smcSide4Thick=0.0095;
1596 Double_t smcSide5Thick=0.0075;
1597 Double_t smcSpace=0.01;
1598
1599
1600 char volname[30];
852af72e 1601 snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSStavePattern(), fLayerNumber);
b705c75b 1602
1603 // detailed structure ++++++++++++++
1604 Double_t z=0, y=0-0.007, x=0;
1605
1606 // Polimide micro channels numbers
1607 Double_t yMC = y-h+0.01;
1608 Int_t nb = (Int_t)(kStaveWidth/0.1)+1;
852af72e 1609 Double_t xstaMC = (nb*0.1-0.08)/2;
b705c75b 1610
1611
852af72e 1612 TGeoVolume *mechStavVol = 0;
b705c75b 1613 if (fBuildLevel < 5) {
1614 // world (trapezoid)
1615 TGeoXtru *mechStruct = new TGeoXtru(2); //z sections
1616 Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};
1617 Double_t yv[5] = {-kConeOutRadius*2-0.07,0,staveHeight,0,-kConeOutRadius*2-0.07};
1618 mechStruct->DefinePolygon(5,xv,yv);
1619 mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);
1620 mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);
852af72e 1621 mechStavVol = new TGeoVolume(volname, mechStruct, medAir);
1622 mechStavVol->SetLineColor(12);
1623 mechStavVol->SetFillColor(12);
1624 mechStavVol->SetVisibility(kTRUE);
b705c75b 1625
1626 // Silicon micro channels numbers
1627
1628 TGeoBBox *tM0a=new TGeoBBox(smcWidth/2, 0.003/2, headWidth/2);
1629 TGeoVolume *volTM0a=new TGeoVolume("microChanTop1", tM0a, medKapton);
1630 volTM0a->SetLineColor(35);
1631 volTM0a->SetFillColor(35);
1632
852af72e 1633 for(Int_t mo=1; mo<=chips; mo++) {
1634 mechStavVol->AddNode(volTM0a, 0, new TGeoCombiTrans(x,yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));
1635 mechStavVol->AddNode(volTM0a, 1, new TGeoCombiTrans(x,yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));
b705c75b 1636 }
1637 TGeoBBox *tM0c=new TGeoBBox(0.3/2, 0.003/2,smcLength/2);
1638 TGeoVolume *volTM0c=new TGeoVolume("microChanTop2", tM0c, medKapton);
1639 volTM0c->SetLineColor(35);
1640 volTM0c->SetFillColor(35);
852af72e 1641 for(Int_t mo=1; mo<=chips; mo++) {
1642 mechStavVol->AddNode(volTM0c, 0, new TGeoCombiTrans(x+(smcWidth/2)-(0.3/2),yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));
1643 mechStavVol->AddNode(volTM0c, 1, new TGeoCombiTrans(x-(smcWidth/2)+(0.3/2),yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1644 }
1645 TGeoBBox *tM0c1=new TGeoBBox(0.2225/2, 0.003/2,smcLength/2);
1646 TGeoVolume *volTM0c1=new TGeoVolume("microChanBot1", tM0c1, medKapton);
1647 volTM0c1->SetLineColor(6);
1648 volTM0c1->SetFillColor(6);
852af72e 1649 for(Int_t mo=1; mo<=chips; mo++) {
1650 mechStavVol->AddNode(volTM0c1, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick)-(0.2225/2),yMC+0.03-hh-(0.003), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1651 mechStavVol->AddNode(volTM0c1, 1, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick)+(smcSide4Thick)+(0.2225/2),yMC+0.03-hh-(0.003), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1652 }
1653 TGeoBBox *tM0c2=new TGeoBBox(0.072/2, 0.003/2,smcLength/2);
1654 TGeoVolume *volTM0c2=new TGeoVolume("microChanBot2", tM0c2, medKapton);
1655 volTM0c2->SetLineColor(35);
1656 volTM0c2->SetFillColor(35);
852af72e 1657 for(Int_t mo=1; mo<=chips; mo++) {
1658 mechStavVol->AddNode(volTM0c2, 0, new TGeoCombiTrans(x+smcWidth/2-(0.072/2),yMC+0.03-(0.035+0.0015)-(0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1659 }
1660 TGeoBBox *tM0c2r=new TGeoBBox(0.068/2, 0.003/2,smcLength/2);
1661 TGeoVolume *volTM0c2r=new TGeoVolume("microChanBot3", tM0c2r, medKapton);
1662 volTM0c2r->SetLineColor(35);
1663 volTM0c2r->SetFillColor(35);
852af72e 1664 for(Int_t mo=1; mo<=chips; mo++) {
1665 mechStavVol->AddNode(volTM0c2r, 0, new TGeoCombiTrans(x-smcWidth/2+(0.068/2),yMC+0.03-(0.035+0.0015)-(0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1666 }
1667 TGeoBBox *tM0d=new TGeoBBox(smcSide1Thick/2, 0.035/2,smcLength/2);
1668 TGeoVolume *volTM0d=new TGeoVolume("microChanSide1", tM0d, medKapton);
1669 volTM0d->SetLineColor(12);
1670 volTM0d->SetFillColor(12);
852af72e 1671 for(Int_t mo=1; mo<=chips; mo++) {
1672 mechStavVol->AddNode(volTM0d, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1673 mechStavVol->AddNode(volTM0d, 1, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1674 }
1675
1676 TGeoBBox *tM0d1=new TGeoBBox(smcSide2Thick/2, 0.035/2,smcLength/2);
1677 TGeoVolume *volTM0d1=new TGeoVolume("microChanSide2", tM0d1, medKapton);
1678 volTM0d1->SetLineColor(12);
1679 volTM0d1->SetFillColor(12);
852af72e 1680 for(Int_t mo=1; mo<=chips; mo++) {
1681 mechStavVol->AddNode(volTM0d1, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick/2),yMC+0.03-(0.003+0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1682 mechStavVol->AddNode(volTM0d1, 1, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick/2),yMC+0.03-(0.003+0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1683 }
1684 TGeoBBox *tM0d2=new TGeoBBox(smcSide3Thick/2, (hh+0.003)/2, smcLength/2);
1685 TGeoVolume *volTM0d2=new TGeoVolume("microChanSide3", tM0d2, medKapton);
1686 volTM0d2->SetLineColor(12);
1687 volTM0d2->SetFillColor(12);
852af72e 1688 for(Int_t mo=1; mo<=chips; mo++) {
1689 mechStavVol->AddNode(volTM0d2, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick/2),yMC+0.03-(0.003+hh+0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1690 }
1691 TGeoBBox *tM0d2r=new TGeoBBox(smcSide4Thick/2, (hh+0.003)/2, smcLength/2);
1692 TGeoVolume *volTM0d2r=new TGeoVolume("microChanSide4", tM0d2r, medKapton);
1693 volTM0d2r->SetLineColor(12);
1694 volTM0d2r->SetFillColor(12);
852af72e 1695 for(Int_t mo=1; mo<=chips; mo++) {
1696 mechStavVol->AddNode(volTM0d2r, 0, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick)+(smcSide4Thick/2),yMC+0.03-(0.003+hh+0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1697 }
1698 TGeoBBox *tM0e=new TGeoBBox(smcSide5Thick/2, hh/2,smcLength/2);
1699 TGeoVolume *volTM0e=new TGeoVolume("microChanSide5", tM0e, medKapton);
1700 volTM0e->SetLineColor(12);
1701 volTM0e->SetFillColor(12);
852af72e 1702 for(Int_t mo=1; mo<=chips; mo++) {
b705c75b 1703 for (Int_t ie=0;ie<11;ie++) {
852af72e 1704 mechStavVol->AddNode(volTM0e, 0, new TGeoCombiTrans(x-(ie*(smcSpace+smcSide5Thick))+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick)-smcSpace-(smcSide5Thick/2),yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1705 mechStavVol->AddNode(volTM0e, 1, new TGeoCombiTrans(x+(ie*(smcSpace+smcSide5Thick))-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick)+(smcSide4Thick)+smcSpace+(smcSide5Thick/2),yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1706 }
1707 }
1708
1709 TGeoBBox *tM0f=new TGeoBBox(0.02/2, hh/2, smcLength/2);
1710 TGeoVolume *volTM0f=new TGeoVolume("microChanTop3", tM0f, medKapton);
1711 //Double_t smcChannels=12;
1712 Double_t smcCloseWallvapor=smcWidth/2-smcSide1Thick-vaporThick-smcSide2Thick-smcSide3Thick-12*smcSpace-11*smcSide5Thick;
1713 Double_t smcCloseWallliquid=smcWidth/2-smcSide1Thick-liquidThick-smcSide2Thick-smcSide4Thick-12*smcSpace-11*smcSide5Thick;
1714 volTM0f->SetLineColor(12);
1715 volTM0f->SetFillColor(12);
852af72e 1716 for(Int_t mo=1; mo<=chips; mo++) {
1717 mechStavVol->AddNode(volTM0f, 0, new TGeoCombiTrans(x+smcCloseWallvapor-(0.02)/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1718 mechStavVol->AddNode(volTM0f, 1, new TGeoCombiTrans(x-smcCloseWallliquid+(0.02)/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1719 }
1720 //Head(back) microchannel
1721
1722 TGeoBBox *tM0hb=new TGeoBBox(smcWidth/2, 0.025/2, headWidth/2);
1723 TGeoVolume *volTM0hb=new TGeoVolume("microChanHeadBackBottom1", tM0hb, medKapton);
1724 volTM0hb->SetLineColor(4);
1725 volTM0hb->SetFillColor(4);
852af72e 1726 for(Int_t mo=1; mo<=chips; mo++) {
1727 mechStavVol->AddNode(volTM0hb, 0, new TGeoCombiTrans(x,yMC+0.03-0.0145-(0.025/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1728 mechStavVol->AddNode(volTM0hb, 1, new TGeoCombiTrans(x,yMC+0.03-0.0145-(0.025)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1729 }
1730 TGeoBBox *tM0h1=new TGeoBBox(smcWidth/2, 0.013/2, 0.05/2);
1731 TGeoVolume *volTM0h1=new TGeoVolume("microChanHeadBackBottom2", tM0h1, medKapton);
1732 volTM0h1->SetLineColor(5);
1733 volTM0h1->SetFillColor(5);
852af72e 1734 for(Int_t mo=1; mo<=chips; mo++) {
1735 mechStavVol->AddNode(volTM0h1, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-headWidth+(0.05/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1736 }
1737 TGeoBBox *tM0h2=new TGeoBBox(smcWidth/2, 0.003/2, 0.18/2);
1738 TGeoVolume *volTM0h2=new TGeoVolume("microChanHeadBackBottom7", tM0h2, medKapton);
1739 volTM0h2->SetLineColor(6);
1740 volTM0h2->SetFillColor(6);
852af72e 1741 for(Int_t mo=1; mo<=chips; mo++) {
1742 mechStavVol->AddNode(volTM0h2, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-0.01-(0.003/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-0.02-(0.18/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1743 }
1744 TGeoBBox *tM0h3=new TGeoBBox(smcWidth/2, 0.013/2, 0.02/2);
1745 TGeoVolume *volTM0h3=new TGeoVolume("microChanHeadBackBottom3", tM0h3, medKapton);
1746 volTM0h3->SetLineColor(5);
1747 volTM0h3->SetFillColor(5);
852af72e 1748 for(Int_t mo=1; mo<=chips; mo++) {
1749 mechStavVol->AddNode(volTM0h3, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-(0.02/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1750 }
1751 TGeoBBox *tM0b1=new TGeoBBox(smcWidth/2, 0.013/2, 0.03/2);
1752 TGeoVolume *volTM0b1=new TGeoVolume("microChanHeadBackBottom4", tM0b1, medKapton);
1753 volTM0b1->SetLineColor(5);
1754 volTM0b1->SetFillColor(5);
852af72e 1755 for(Int_t mo=1; mo<=chips; mo++) {
1756 mechStavVol->AddNode(volTM0b1, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+headWidth-(0.03/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1757 }
1758 TGeoBBox *tM0b2=new TGeoBBox(smcWidth/2, 0.003/2, 0.2/2);
1759 TGeoVolume *volTM0b2=new TGeoVolume("microChanHeadBackBottom5", tM0b2, medKapton);
1760 volTM0b2->SetLineColor(6);
1761 volTM0b2->SetFillColor(6);
852af72e 1762 for(Int_t mo=1; mo<=chips; mo++) {
1763 mechStavVol->AddNode(volTM0b2, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-0.01-(0.003/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+0.02+(0.2/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1764 }
1765 TGeoBBox *tM0b3=new TGeoBBox(smcWidth/2, 0.013/2, 0.02/2);
1766 TGeoVolume *volTM0b3=new TGeoVolume("microChanHeadBackBottom6", tM0b3, medKapton);
1767 volTM0b3->SetLineColor(5);
1768 volTM0b3->SetFillColor(5);
852af72e 1769 for(Int_t mo=1; mo<=chips; mo++) {
1770 mechStavVol->AddNode(volTM0b3, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+(0.02/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1771 }
1772
852af72e 1773 TGeoBBox *tM0b=new TGeoBBox(0.02/2, 0.02/2, zsta);
b705c75b 1774 TGeoVolume *volTM0b=new TGeoVolume("microChanWalls", tM0b, medKapton);
1775 volTM0b->SetLineColor(35);
1776 volTM0b->SetFillColor(35);
1777 for (Int_t ib=0;ib<nb;ib++) {
852af72e 1778 //mechStavVol->AddNode(volTM0b, ib, new TGeoCombiTrans(x+ib*0.1-xstaMC+0.01,yMC, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1779 }
1780
1781 }
1782
1783 if (fBuildLevel < 4) {
1784
1785 //**********cooling inlet outlet
1786
1787 TGeoBBox *tM0dv=new TGeoBBox(vaporThick/2, 0.035/2,smcLength/2);
1788 TGeoVolume *volTM0dv=new TGeoVolume("microChanVapor", tM0dv, medWater);
1789 volTM0dv->SetLineColor(2);
1790 volTM0dv->SetFillColor(2);
852af72e 1791 for(Int_t mo=1; mo<=chips; mo++) {
1792 mechStavVol->AddNode(volTM0dv, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1793 }
1794 TGeoBBox *tM0dl=new TGeoBBox(liquidThick/2, 0.035/2,smcLength/2);
1795 TGeoVolume *volTM0dl=new TGeoVolume("microChanLiquid", tM0dl, medWater);
1796 volTM0dl->SetLineColor(3);
1797 volTM0dl->SetFillColor(3);
852af72e 1798 for(Int_t mo=1; mo<=chips; mo++) {
1799 mechStavVol->AddNode(volTM0dl, 0, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1800 }
1801 // small cooling fluid now using water wait for freeon value
1802 TGeoBBox *tM0dlq=new TGeoBBox(smcSpace/2, hh/2,smcLength/2);
1803 TGeoVolume *volTM0dlq=new TGeoVolume("smallLiquid", tM0dlq, medWater);
1804 volTM0dlq->SetLineColor(3);
1805 volTM0dlq->SetFillColor(3);
1806 TGeoBBox *tM0dvp=new TGeoBBox(smcSpace/2, hh/2,smcLength/2);
1807 TGeoVolume *volTM0dvp=new TGeoVolume("microChanVapor", tM0dvp, medWater);
1808 volTM0dvp->SetLineColor(2);
1809 volTM0dvp->SetFillColor(2);
852af72e 1810 for(Int_t mo=1; mo<=chips; mo++) {
b705c75b 1811 for (Int_t is=0;is<12;is++) {
852af72e 1812 mechStavVol->AddNode(volTM0dlq, 0, new TGeoCombiTrans(x+(is*(smcSpace+smcSide5Thick))-smcWidth/2+(smcSide1Thick)+(vaporThick)+(smcSide2Thick)+(smcSide3Thick)+smcSpace/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
1813 mechStavVol->AddNode(volTM0dvp, 1, new TGeoCombiTrans(x-(is*(smcSpace+smcSide5Thick))+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick)-smcSpace/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));
b705c75b 1814 }
1815 }
1816
1817 //*************
1818
1819 }
1820
1821 if (fBuildLevel < 3) {
1822
1823 //Bottom filament CFRP black-12 Carbon structure TGeoBBox (thickness,width,length)
1824
1825 Double_t filWidth = 0.04;
1826 Double_t filHeight= 0.02;
1827 TGeoBBox *t1=new TGeoBBox(filHeight/2,filWidth/2,s1);
1828 TGeoVolume *volT1=new TGeoVolume("bottomFilament", t1, medM60J3K);
1829 volT1->SetLineColor(12);
1830 volT1->SetFillColor(12);
1831 for(int i=0;i<loop;i++){//i<30;i++){
852af72e 1832 mechStavVol->AddNode(volT1,4*i+0,
b705c75b 1833 new TGeoCombiTrans(x+w,y-h+0.04+filHeight/2,z-kStaveLength/2+(4*l*i)+s1/2,
1834 new TGeoRotation("volT1",-90,alpha,0)));
852af72e 1835 mechStavVol->AddNode(volT1,4*i+1,
b705c75b 1836 new TGeoCombiTrans(x-w,y-h+0.04+filHeight/2,z-kStaveLength/2+(4*l*i)+s1/2,
1837 new TGeoRotation("volT1",90,alpha,0)));
852af72e 1838 mechStavVol->AddNode(volT1,4*i+2,
b705c75b 1839 new TGeoCombiTrans(x+w,y-h+0.04+filHeight/2,z-kStaveLength/2+2*l+(i*4*l)+s1/2,
1840 new TGeoRotation("volT1",-90,-alpha,0)));
852af72e 1841 mechStavVol->AddNode(volT1,4*i+3,
b705c75b 1842 new TGeoCombiTrans(x-w,y-h+0.04+filHeight/2,z-kStaveLength/2+2*l+(i*4*l)+s1/2,
1843 new TGeoRotation("volT1",-90,+alpha,0)));
1844 }
1845
1846 // Top filament CERP black-12 Carbon structure TGeoBBox (length,thickness,width)
1847
1848 TGeoBBox *t2=new TGeoBBox(s2,filHeight/2,filWidth/2);
1849 TGeoVolume *volT2=new TGeoVolume("topFilament", t2, medM60J3K);
1850 volT2->SetLineColor(12);
1851 volT2->SetFillColor(12);
1852 for(int i=0;i<loop;i++){ //i<30;i++){
852af72e 1853 mechStavVol->AddNode(volT2,4*i+0,
b705c75b 1854 new TGeoCombiTrans(x+w,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*l)+s1/2,
1855 new TGeoRotation("volT2",90,90-alpha,90-beta)));
852af72e 1856 mechStavVol->AddNode(volT2,4*i+1,
b705c75b 1857 new TGeoCombiTrans(x-w,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*l)+s1/2,
1858 new TGeoRotation("volT2",90,-90+alpha,-90+beta)));
852af72e 1859 mechStavVol->AddNode(volT2,4*i+2,
b705c75b 1860 new TGeoCombiTrans(x+w,y+0.04+filHeight/2,z-kStaveLength/2+2*l+(i*4*l)+s1/2,
1861 new TGeoRotation("volT2",90,-90+alpha,90-beta)));
852af72e 1862 mechStavVol->AddNode(volT2,4*i+3,
b705c75b 1863 new TGeoCombiTrans(x-w,y+0.04+filHeight/2,z-kStaveLength/2+2*l+(i*4*l)+s1/2,
1864 new TGeoRotation("volT2",90,90-alpha,-90+beta)));
1865 }
1866 }
1867
1868 if (fBuildLevel < 2) {
1869
1870 // Glue Filament and Silicon MicroChannel
852af72e 1871 TGeoBBox *tM0=new TGeoBBox(xstaMC/5, klay4/2, zsta);
b705c75b 1872 TGeoVolume *volTM0=new TGeoVolume("glueFM", tM0,medGlue );
1873 volTM0->SetLineColor(5);
1874 volTM0->SetFillColor(5);
852af72e 1875 mechStavVol->AddNode(volTM0, 0, new TGeoCombiTrans(x-xsta/2-0.25,0.03+yMC, z, new TGeoRotation("",0, 0, 0)));
1876 mechStavVol->AddNode(volTM0, 1, new TGeoCombiTrans(x+xsta/2+0.25,0.03+yMC, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1877
1878
1879 // Glue microchannel and sensor
852af72e 1880 TGeoBBox *glueM = new TGeoBBox(xstaMC/5, klay4/2, zsta);
b705c75b 1881 TGeoVolume *volGlueM=new TGeoVolume("glueMS", glueM, medGlue);
1882 volGlueM->SetLineColor(5);
1883 volGlueM->SetFillColor(5);
852af72e 1884 mechStavVol->AddNode(volGlueM, 0, new TGeoCombiTrans(x-xsta/2-0.25,yMC-0.01, z, new TGeoRotation("",0, 0, 0)));
1885 mechStavVol->AddNode(volGlueM, 1, new TGeoCombiTrans(x+xsta/2+0.25,yMC-0.01, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1886
1887 // Glue sensor and kapton
852af72e 1888 TGeoBBox *glue = new TGeoBBox(xsta, klay4/2, zsta);
b705c75b 1889 TGeoVolume *volGlue=new TGeoVolume("glueSensorBus", glue, medGlue);
1890 volGlue->SetLineColor(5);
1891 volGlue->SetFillColor(5);
852af72e 1892 mechStavVol->AddNode(volGlue, 1, new TGeoCombiTrans(x, y-0.154-fSensorThick-klay4/2, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1893 }
1894
1895 if (fBuildLevel < 1) {
852af72e 1896 TGeoBBox *kapCable = new TGeoBBox(xsta, klay5/2, zsta);
b705c75b 1897 TGeoVolume *volCable=new TGeoVolume("Flexcable", kapCable, medFlexCable);
1898 volCable->SetLineColor(28);
1899 volCable->SetFillColor(28);
852af72e 1900 mechStavVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-0.154-fSensorThick-klay4-klay5/2, z, new TGeoRotation("",0, 0, 0)));
b705c75b 1901 }
1902
1903 // Done, return the stave structur
852af72e 1904 return mechStavVol;
b705c75b 1905 }
1906
1907//________________________________________________________________________
2b9468b2 1908TGeoVolume* AliITSUv1Layer::CreateStaveOuterB(const TGeoManager *mgr){
b705c75b 1909//
852af72e 1910// Create the chip stave for the Outer Barrel
b705c75b 1911//
1912// Input:
b705c75b 1913// mgr : the GeoManager (used only to get the proper material)
1914//
1915// Output:
1916//
1917// Return:
1918//
1919// Created: 20 Dec 2013 Mario Sitta
2b9468b2 1920// Updated: 12 Mar 2014 Mario Sitta
b705c75b 1921//
1922
852af72e 1923 TGeoVolume *mechStavVol = 0;
b705c75b 1924
1925 switch (fStaveModel) {
1926 case AliITSUv1::kOBModelDummy:
2b9468b2 1927 mechStavVol = CreateStaveModelOuterBDummy(mgr);
b705c75b 1928 break;
1929 case AliITSUv1::kOBModel0:
2b9468b2 1930 mechStavVol = CreateStaveModelOuterB0(mgr);
b705c75b 1931 break;
1932 case AliITSUv1::kOBModel1:
c55b10c2 1933 mechStavVol = CreateStaveModelOuterB1(mgr);
b705c75b 1934 break;
1935 default:
1936 AliFatal(Form("Unknown stave model %d",fStaveModel));
1937 break;
1938 }
1939
852af72e 1940 return mechStavVol;
b705c75b 1941}
1942
1943//________________________________________________________________________
2b9468b2 1944TGeoVolume* AliITSUv1Layer::CreateStaveModelOuterBDummy(const TGeoManager *) const {
b705c75b 1945//
1946// Create dummy stave
1947//
1948// Input:
b705c75b 1949// mgr : the GeoManager (used only to get the proper material)
1950//
1951// Output:
1952//
1953// Return:
1954//
1955// Created: 20 Dec 2013 Mario Sitta
1956//
1957
1958
1959 // Done, return the stave structure
1960 return 0;
1961}
1962
1963//________________________________________________________________________
2b9468b2 1964TGeoVolume* AliITSUv1Layer::CreateStaveModelOuterB0(const TGeoManager *mgr){
b705c75b 1965//
1966// Creation of the mechanical stave structure for the Outer Barrel as in v0
2b9468b2 1967// (we fake the module and halfstave volumes to have always
1968// the same formal geometry hierarchy)
b705c75b 1969//
1970// Input:
b705c75b 1971// mgr : the GeoManager (used only to get the proper material)
1972//
1973// Output:
1974//
1975// Return:
1976//
1977// Created: 20 Dec 2013 Mario Sitta
2b9468b2 1978// Updated: 12 Mar 2014 Mario Sitta
b705c75b 1979//
1980
2b9468b2 1981 // Local variables
1982 Double_t xmod, ymod, zmod;
1983 Double_t xlen, ylen, zlen;
1984 Double_t ypos, zpos;
1985 char volname[30];
1986
1987 // First create all needed shapes
1988
1989 // The chip
1990 xlen = fgkOBHalfStaveWidth;
1991 ylen = 0.5*fStaveThick; // TO BE CHECKED
1992 zlen = fgkOBModuleZLength/2;
1993
1994 TGeoVolume *chipVol = CreateChipInnerB(xlen, ylen, zlen);
1995
1996 xmod = ((TGeoBBox*)chipVol->GetShape())->GetDX();
1997 ymod = ((TGeoBBox*)chipVol->GetShape())->GetDY();
1998 zmod = ((TGeoBBox*)chipVol->GetShape())->GetDZ();
1999
2000 TGeoBBox *module = new TGeoBBox(xmod, ymod, zmod);
2001
2002 zlen = fgkOBModuleZLength*fNModules;
2003 TGeoBBox *hstave = new TGeoBBox(xlen, ylen, zlen/2);
2004
2005
2006 // We have all shapes: now create the real volumes
2007
2008 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
2009
2010 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSModulePattern(), fLayerNumber);
2011 TGeoVolume *modVol = new TGeoVolume(volname, module, medAir);
2012 modVol->SetVisibility(kTRUE);
2013
2014 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSHalfStavePattern(), fLayerNumber);
2015 TGeoVolume *hstaveVol = new TGeoVolume(volname, hstave, medAir);
2016
2017
2018 // Finally build it up
2019 modVol->AddNode(chipVol, 0);
2020 fHierarchy[kChip]=1;
2021
2022 for (Int_t j=0; j<fNModules; j++) {
2023 ypos = 0.021; // Remove small overlap - M.S: 21may13
2024 zpos = -hstave->GetDZ() + j*2*zmod + zmod;
2025 hstaveVol->AddNode(modVol, j, new TGeoTranslation(0, ypos, zpos));
2026 fHierarchy[kModule]++;
2027 }
2028
2029
b705c75b 2030 // Done, return the stave structure
2b9468b2 2031 return hstaveVol;
b705c75b 2032}
2033
2034//________________________________________________________________________
c55b10c2 2035TGeoVolume* AliITSUv1Layer::CreateStaveModelOuterB1(const TGeoManager *mgr){
b705c75b 2036//
c55b10c2 2037// Create the mechanical half stave structure
2038// for the Outer Barrel as in TDR
b705c75b 2039//
2040// Input:
b705c75b 2041// mgr : the GeoManager (used only to get the proper material)
2042//
2043// Output:
2044//
2045// Return:
2046//
2047// Created: 20 Nov 2013 Anastasia Barbano
2048// Updated: 16 Jan 2014 Mario Sitta
c55b10c2 2049// Updated: 24 Feb 2014 Mario Sitta
b705c75b 2050//
2051
c55b10c2 2052
2053 // Local parameters
2054 Double_t yFlex1 = fgkOBFlexCableAlThick;
2055 Double_t yFlex2 = fgkOBFlexCableKapThick;
2056 Double_t flexOverlap = 5; // to be checked
2057 Double_t xHalfSt = fgkOBHalfStaveWidth/2;
2058 Double_t rCoolMin = fgkOBCoolTubeInnerD/2;
2059 Double_t rCoolMax = rCoolMin + fgkOBCoolTubeThick;
2060 Double_t kLay1 = 0.004; // to be checked
2061 Double_t kLay2 = fgkOBGraphiteFoilThick;
2062
2063 Double_t xlen, ylen;
2064 Double_t ymod, zmod;
2b9468b2 2065 Double_t xtru[12], ytru[12];
c55b10c2 2066 Double_t xpos, ypos, ypos1, zpos/*, zpos5cm*/;
2067 Double_t zlen;
2068 char volname[30];
2069
2070
2b9468b2 2071 zlen = (fNModules*fgkOBModuleZLength + (fNModules-1)*fgkOBModuleGap)/2;
c55b10c2 2072
2073
2074 // First create all needed shapes
2075
2076 TGeoVolume *moduleVol = CreateModuleOuterB();
2077 moduleVol->SetVisibility(kTRUE);
2078 ymod = ((TGeoBBox*)(moduleVol->GetShape()))->GetDY();
2079 zmod = ((TGeoBBox*)(moduleVol->GetShape()))->GetDZ();
2080
2081 TGeoBBox *busAl = new TGeoBBox("BusAl", xHalfSt, fgkOBBusCableAlThick/2,
2082 zlen);
2083 TGeoBBox *busKap = new TGeoBBox("BusKap", xHalfSt, fgkOBBusCableKapThick/2,
2084 zlen);
2085
2086 TGeoBBox *coldPlate = new TGeoBBox("ColdPlate", fgkOBHalfStaveWidth/2,
2087 fgkOBColdPlateThick/2, zlen);
2088
2089 TGeoTube *coolTube = new TGeoTube("CoolingTube", rCoolMin, rCoolMax, zlen);
2090 TGeoTube *coolWater = new TGeoTube("CoolingWater", 0., rCoolMin, zlen);
2091
2092 xlen = xHalfSt - fgkOBCoolTubeXDist/2 - coolTube->GetRmax();
2093 TGeoBBox *graphlat = new TGeoBBox("GraphLateral", xlen/2, kLay2/2, zlen);
2094
2095 xlen = fgkOBCoolTubeXDist/2 - coolTube->GetRmax();
2096 TGeoBBox *graphmid = new TGeoBBox("GraphMiddle", xlen, kLay2/2, zlen);
2097
2098 ylen = coolTube->GetRmax() - kLay2;
2099 TGeoBBox *graphvert = new TGeoBBox("GraphVertical", kLay2/2, ylen/2, zlen);
2100
2101 TGeoTubeSeg *graphtub = new TGeoTubeSeg("GraphTube", rCoolMax,
2102 rCoolMax+kLay2, zlen,
2103 180., 360.);
2104
2105 xlen = xHalfSt - fgkOBCoolTubeXDist/2 - coolTube->GetRmax() - kLay2;
2106 TGeoBBox *fleeclat = new TGeoBBox("FleecLateral", xlen/2, kLay1/2, zlen);
2107
2108 xlen = fgkOBCoolTubeXDist/2 - coolTube->GetRmax() - kLay2;
2109 TGeoBBox *fleecmid = new TGeoBBox("FleecMiddle", xlen, kLay1/2, zlen);
2110
2111 ylen = coolTube->GetRmax() - kLay2 - kLay1;
2112 TGeoBBox *fleecvert = new TGeoBBox("FleecVertical", kLay1/2, ylen/2, zlen);
2113
2114 TGeoTubeSeg *fleectub = new TGeoTubeSeg("FleecTube", rCoolMax+kLay2,
2115 rCoolMax+kLay1+kLay2,
2116 zlen, 180., 360.);
2117
2118 TGeoBBox *flex1_5cm = new TGeoBBox("Flex1MV_5cm",xHalfSt,yFlex1/2,flexOverlap/2);
2119 TGeoBBox *flex2_5cm = new TGeoBBox("Flex2MV_5cm",xHalfSt,yFlex2/2,flexOverlap/2);
2120
2b9468b2 2121 // The half stave container (an XTru to avoid overlaps between neightbours)
2122 xtru[0] = xHalfSt;
2123 ytru[0] = 0;
2124 xtru[1] = xtru[0];
2125 ytru[1] = -2*(ymod + busAl->GetDY() + busKap->GetDY() + coldPlate->GetDY()
2126 + graphlat->GetDY() + fleeclat->GetDY());
2127 xtru[2] = fgkOBCoolTubeXDist/2 + fleectub->GetRmax();
2128 ytru[2] = ytru[1];
2129 xtru[3] = xtru[2];
2130 ytru[3] = ytru[2] - (coolTube->GetRmax() + fleectub->GetRmax());
2131 xtru[4] = fgkOBCoolTubeXDist/2 - fleectub->GetRmax();
2132 ytru[4] = ytru[3];
2133 xtru[5] = xtru[4];
2134 ytru[5] = ytru[2];
2135 for (Int_t i = 0; i<6; i++) {
2136 xtru[6+i] = -xtru[5-i];
2137 ytru[6+i] = ytru[5-i];
2138 }
2139 TGeoXtru *halfStave = new TGeoXtru(2);
2140 halfStave->DefinePolygon(12, xtru, ytru);
2141 halfStave->DefineSection(0,-fZLength/2);
2142 halfStave->DefineSection(1, fZLength/2);
c55b10c2 2143
2144
2145 // We have all shapes: now create the real volumes
2146
b705c75b 2147 TGeoMedium *medAluminum = mgr->GetMedium("ITS_ALUMINUM$");
2148 TGeoMedium *medCarbon = mgr->GetMedium("ITS_CARBON$");
2149 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
b705c75b 2150 TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");
2151 TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$");
2152 TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$"); //amec thermasol
2153 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
2154
2155
c55b10c2 2156 TGeoVolume *busAlVol = new TGeoVolume("BusAlVol", busAl , medAluminum);
2157 busAlVol->SetLineColor(kCyan);
2158 busAlVol->SetFillColor(busAlVol->GetLineColor());
2159 busAlVol->SetFillStyle(4000); // 0% transparent
b705c75b 2160
c55b10c2 2161 TGeoVolume *busKapVol = new TGeoVolume("BusKapVol", busKap, medKapton);
2162 busKapVol->SetLineColor(kBlue);
2163 busKapVol->SetFillColor(busKapVol->GetLineColor());
2164 busKapVol->SetFillStyle(4000); // 0% transparent
b705c75b 2165
c55b10c2 2166 TGeoVolume *coldPlateVol = new TGeoVolume("ColdPlateVol",
2167 coldPlate, medCarbon);
2168 coldPlateVol->SetLineColor(kYellow-3);
2169 coldPlateVol->SetFillColor(coldPlateVol->GetLineColor());
2170 coldPlateVol->SetFillStyle(4000); // 0% transparent
b705c75b 2171
c55b10c2 2172 TGeoVolume *coolTubeVol = new TGeoVolume("CoolingTubeVol",
2173 coolTube, medKapton);
2174 coolTubeVol->SetLineColor(kGray);
2175 coolTubeVol->SetFillColor(coolTubeVol->GetLineColor());
2176 coolTubeVol->SetFillStyle(4000); // 0% transparent
2177
2178 TGeoVolume *coolWaterVol = new TGeoVolume("CoolingWaterVol",
2179 coolWater,medWater);
2180 coolWaterVol->SetLineColor(kBlue);
2181 coolWaterVol->SetFillColor(coolWaterVol->GetLineColor());
2182 coolWaterVol->SetFillStyle(4000); // 0% transparent
2183
2184 TGeoVolume *graphlatVol = new TGeoVolume("GraphiteFoilLateral",
2185 graphlat, medFGS003);
2186 graphlatVol->SetLineColor(kGreen);
2187 graphlatVol->SetFillColor(graphlatVol->GetLineColor());
2188 graphlatVol->SetFillStyle(4000); // 0% transparent
2189
2190 TGeoVolume *graphmidVol = new TGeoVolume("GraphiteFoilMiddle",
2191 graphmid, medFGS003);
2192 graphmidVol->SetLineColor(kGreen);
2193 graphmidVol->SetFillColor(graphmidVol->GetLineColor());
2194 graphmidVol->SetFillStyle(4000); // 0% transparent
2195
2196 TGeoVolume *graphvertVol = new TGeoVolume("GraphiteFoilVertical",
2197 graphvert, medFGS003);
2198 graphvertVol->SetLineColor(kGreen);
2199 graphvertVol->SetFillColor(graphvertVol->GetLineColor());
2200 graphvertVol->SetFillStyle(4000); // 0% transparent
2201
2202 TGeoVolume *graphtubVol = new TGeoVolume("GraphiteFoilPipeCover",
2203 graphtub, medFGS003);
2204 graphtubVol->SetLineColor(kGreen);
2205 graphtubVol->SetFillColor(graphtubVol->GetLineColor());
2206 graphtubVol->SetFillStyle(4000); // 0% transparent
2207
2208 TGeoVolume *fleeclatVol = new TGeoVolume("CarbonFleeceLateral",
2209 fleeclat, medCarbonFleece);
2210 fleeclatVol->SetLineColor(kViolet);
2211 fleeclatVol->SetFillColor(fleeclatVol->GetLineColor());
2212 fleeclatVol->SetFillStyle(4000); // 0% transparent
2213
2214 TGeoVolume *fleecmidVol = new TGeoVolume("CarbonFleeceMiddle",
2215 fleecmid, medCarbonFleece);
2216 fleecmidVol->SetLineColor(kViolet);
2217 fleecmidVol->SetFillColor(fleecmidVol->GetLineColor());
2218 fleecmidVol->SetFillStyle(4000); // 0% transparent
2219
2220 TGeoVolume *fleecvertVol = new TGeoVolume("CarbonFleeceVertical",
2221 fleecvert, medCarbonFleece);
2222 fleecvertVol->SetLineColor(kViolet);
2223 fleecvertVol->SetFillColor(fleecvertVol->GetLineColor());
2224 fleecvertVol->SetFillStyle(4000); // 0% transparent
2225
2226 TGeoVolume *fleectubVol = new TGeoVolume("CarbonFleecePipeCover",
2227 fleectub, medCarbonFleece);
2228 fleectubVol->SetLineColor(kViolet);
2229 fleectubVol->SetFillColor(fleectubVol->GetLineColor());
2230 fleectubVol->SetFillStyle(4000); // 0% transparent
2231
2232 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSHalfStavePattern(), fLayerNumber);
2233 TGeoVolume *halfStaveVol = new TGeoVolume(volname, halfStave, medAir);
2234// halfStaveVol->SetLineColor(12);
2235// halfStaveVol->SetFillColor(12);
2236// halfStaveVol->SetVisibility(kTRUE);
b705c75b 2237
b705c75b 2238
b705c75b 2239 TGeoVolume *flex1_5cmVol = new TGeoVolume("Flex1Vol5cm",flex1_5cm,medAluminum);
2240 TGeoVolume *flex2_5cmVol = new TGeoVolume("Flex2Vol5cm",flex2_5cm,medKapton);
b705c75b 2241
c55b10c2 2242
b705c75b 2243 flex1_5cmVol->SetLineColor(kRed);
2244 flex2_5cmVol->SetLineColor(kGreen);
b705c75b 2245
b705c75b 2246
c55b10c2 2247 // Now build up the half stave
2b9468b2 2248 ypos = - busKap->GetDY();
c55b10c2 2249 halfStaveVol->AddNode(busKapVol, 1, new TGeoTranslation(0, ypos, 0));
b705c75b 2250
c55b10c2 2251 ypos -= (busKap->GetDY() + busAl->GetDY());
2252 halfStaveVol->AddNode(busAlVol, 1, new TGeoTranslation(0, ypos, 0));
b705c75b 2253
c55b10c2 2254 ypos -= (busAl->GetDY() + ymod);
2b9468b2 2255 for (Int_t j=0; j<fNModules; j++) {
c55b10c2 2256 zpos = -zlen + j*(2*zmod + fgkOBModuleGap) + zmod;
2257 halfStaveVol->AddNode(moduleVol, j, new TGeoTranslation(0, ypos, zpos));
2258 fHierarchy[kModule]++;
b705c75b 2259 }
c55b10c2 2260
2261 ypos -= (ymod + coldPlate->GetDY());
2262 halfStaveVol->AddNode(coldPlateVol, 1, new TGeoTranslation(0, ypos, 0));
2263
2264 coolTubeVol->AddNode(coolWaterVol, 1, 0);
2265
2266 xpos = fgkOBCoolTubeXDist/2;
2267 ypos1 = ypos - (coldPlate->GetDY() + coolTube->GetRmax());
2268 halfStaveVol->AddNode(coolTubeVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2269 halfStaveVol->AddNode(coolTubeVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2270
2271 halfStaveVol->AddNode(graphtubVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2272 halfStaveVol->AddNode(graphtubVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2273
2274 halfStaveVol->AddNode(fleectubVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2275 halfStaveVol->AddNode(fleectubVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2276
2277 xpos = xHalfSt - graphlat->GetDX();
2278 ypos1 = ypos - (coldPlate->GetDY() + graphlat->GetDY());
2279 halfStaveVol->AddNode(graphlatVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2280 halfStaveVol->AddNode(graphlatVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2281
2282 halfStaveVol->AddNode(graphmidVol, 1, new TGeoTranslation(0, ypos1, 0));
2283
2284 xpos = xHalfSt - 2*graphlat->GetDX() + graphvert->GetDX();
2285 ypos1 = ypos - (coldPlate->GetDY() +2*graphlat->GetDY() +graphvert->GetDY());
2286 halfStaveVol->AddNode(graphvertVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2287 halfStaveVol->AddNode(graphvertVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2288 xpos = graphmid->GetDX() - graphvert->GetDX();
2289 halfStaveVol->AddNode(graphvertVol, 3, new TGeoTranslation(-xpos, ypos1, 0));
2290 halfStaveVol->AddNode(graphvertVol, 4, new TGeoTranslation( xpos, ypos1, 0));
2291
2292 xpos = xHalfSt - fleeclat->GetDX();
2293 ypos1 = ypos - (coldPlate->GetDY() +2*graphlat->GetDY() +fleeclat->GetDY());
2294 halfStaveVol->AddNode(fleeclatVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2295 halfStaveVol->AddNode(fleeclatVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2296
2297 halfStaveVol->AddNode(fleecmidVol, 1, new TGeoTranslation(0, ypos1, 0));
2298
2299 xpos = xHalfSt - 2*fleeclat->GetDX() + fleecvert->GetDX();
2300 ypos1 = ypos - (coldPlate->GetDY() +2*graphlat->GetDY()
2301 + 2*fleeclat->GetDY() + fleecvert->GetDY());
2302 halfStaveVol->AddNode(fleecvertVol, 1, new TGeoTranslation(-xpos, ypos1, 0));
2303 halfStaveVol->AddNode(fleecvertVol, 2, new TGeoTranslation( xpos, ypos1, 0));
2304 xpos = fleecmid->GetDX() - fleecvert->GetDX();
2305 halfStaveVol->AddNode(fleecvertVol, 3, new TGeoTranslation(-xpos, ypos1, 0));
2306 halfStaveVol->AddNode(fleecvertVol, 4, new TGeoTranslation( xpos, ypos1, 0));
2307
2308
2309
2310 //THE FOLLOWING IS ONLY A REMINDER FOR WHAT IS STILL MISSING
2311
2312// for (Int_t j=0; j<fNChips; j++) {
2313
2314// zpos = -(zact + (fNChips-1)*modGap)/2 + j*(zMod + modGap) + zMod/2;
2315// zpos5cm = -(zact + (fNChips-1)*modGap)/2 + (j+1)*(zMod + modGap) + flexOverlap/2 ;
2316
2317// halfStaveVol->AddNode(moduleVol, j, new TGeoTranslation(xPos, -ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + ymod, zpos));
2318// halfStaveVol->AddNode(moduleVol, fNChips+j, new TGeoTranslation(-xPos, -ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + ymod +deltaY, zpos));
2319
2320// if((j+1)!=fNChips){
2321// halfStaveVol->AddNode(flex1_5cmVol,j,new TGeoTranslation(xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + yFlex1 + yFlex2 + yFlex1/2,zpos5cm));
2322// halfStaveVol->AddNode(flex1_5cmVol,fNChips+j,new TGeoTranslation(-xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + yFlex1 + yFlex2 + yFlex1/2 +deltaY,zpos5cm));
2323// halfStaveVol->AddNode(flex2_5cmVol,j,new TGeoTranslation(xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + 2*yFlex1 + 3*yFlex2/2,zpos5cm));
2324// halfStaveVol->AddNode(flex2_5cmVol,fNChips+j,new TGeoTranslation(-xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + 2*yFlex1 + 3*yFlex2/2 +deltaY,zpos5cm));
2325// }
2326// else {
2327// halfStaveVol->AddNode(flex1_5cmVol,j,new TGeoTranslation(xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + yFlex1/2,zpos5cm-modGap));
2328// halfStaveVol->AddNode(flex1_5cmVol,fNChips+j,new TGeoTranslation(-xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + yFlex1/2 +deltaY,zpos5cm-modGap));
2329// halfStaveVol->AddNode(flex2_5cmVol,j,new TGeoTranslation(xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate +2*ymod + yFlex1 + yFlex2/2,zpos5cm-modGap));
2330// halfStaveVol->AddNode(flex2_5cmVol,fNChips+j,new TGeoTranslation(-xPos,-ylen + yPos + 2*rCoolMax + yCPlate + yGlue + yModPlate + 2*ymod + yFlex1 + yFlex2/2 +deltaY,zpos5cm-modGap));
2331
2332// }
2333// }
b705c75b 2334
2335
c55b10c2 2336 // Done, return the half stave structure
2337 return halfStaveVol;
b705c75b 2338}
2339
2340//________________________________________________________________________
2b9468b2 2341TGeoVolume* AliITSUv1Layer::CreateSpaceFrameOuterB(const TGeoManager *mgr){
b705c75b 2342//
2343// Create the space frame for the Outer Barrel
2344//
2345// Input:
b705c75b 2346// mgr : the GeoManager (used only to get the proper material)
2347//
2348// Output:
2349//
2350// Return:
2351//
2352//
2353
852af72e 2354 TGeoVolume *mechStavVol = 0;
b705c75b 2355
2356 switch (fStaveModel) {
2357 case AliITSUv1::kOBModelDummy:
c55b10c2 2358 case AliITSUv1::kOBModel0:
2b9468b2 2359 mechStavVol = CreateSpaceFrameOuterBDummy(mgr);
b705c75b 2360 break;
2361 case AliITSUv1::kOBModel1:
2b9468b2 2362 mechStavVol = CreateSpaceFrameOuterB1(mgr);
b705c75b 2363 break;
2364 default:
2365 AliFatal(Form("Unknown stave model %d",fStaveModel));
2366 break;
2367 }
2368
852af72e 2369 return mechStavVol;
b705c75b 2370}
2371
2372//________________________________________________________________________
2b9468b2 2373TGeoVolume* AliITSUv1Layer::CreateSpaceFrameOuterBDummy(const TGeoManager *) const {
b705c75b 2374//
2375// Create dummy stave
2376//
2377// Input:
b705c75b 2378// mgr : the GeoManager (used only to get the proper material)
2379//
2380// Output:
2381//
2382// Return:
2383//
2384
2385
2386 // Done, return the stave structur
2387 return 0;
2388}
2389
2390//________________________________________________________________________
2b9468b2 2391TGeoVolume* AliITSUv1Layer::CreateSpaceFrameOuterB1(const TGeoManager *mgr){
b705c75b 2392//
c55b10c2 2393// Create the space frame for the Outer Barrel (Model 1)
b705c75b 2394//
2395// Input:
b705c75b 2396// mgr : the GeoManager (used only to get the proper material)
2397//
2398// Output:
2399//
2400// Return:
2401// a TGeoVolume with the Space Frame of a stave
2402//
2403// Created: 20 Dec 2013 Anastasia Barbano
2404// Updated: 15 Jan 2014 Mario Sitta
c55b10c2 2405// Updated: 18 Feb 2014 Mario Sitta
2b9468b2 2406// Updated: 12 Mar 2014 Mario Sitta
b705c75b 2407//
2408
2409
2410 // Materials defined in AliITSUv0
2411 TGeoMedium *medCarbon = mgr->GetMedium("ITS_CARBON$");
2412 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
2413
2414
2415 // Local parameters
c55b10c2 2416 Double_t sframeWidth = fgkOBSpaceFrameWidth;
2417 Double_t sframeHeight = fgkOBSpaceFrameTotHigh - fgkOBHalfStaveYTrans;
2b9468b2 2418 Double_t staveBeamRadius = fgkOBSFrameBeamRadius;
2419 Double_t staveLa = fgkOBSpaceFrameLa;
2420 Double_t staveHa = fgkOBSpaceFrameHa;
2421 Double_t staveLb = fgkOBSpaceFrameLb;
2422 Double_t staveHb = fgkOBSpaceFrameHb;
2423 Double_t stavel = fgkOBSpaceFrameL;
2424 Double_t bottomBeamAngle = fgkOBSFBotBeamAngle;
c55b10c2 2425 Double_t triangleHeight = sframeHeight - staveBeamRadius;
2426 Double_t halfTheta = TMath::ATan( 0.5*sframeWidth/triangleHeight );
2b9468b2 2427// Double_t alpha = TMath::Pi()*3./4. - halfTheta/2.;
b705c75b 2428 Double_t beta = (TMath::Pi() - 2.*halfTheta)/4.;
2b9468b2 2429// Double_t distCenterSideDown = 0.5*sframeWidth/TMath::Cos(beta);
c55b10c2 2430
b705c75b 2431 Double_t zlen;
2b9468b2 2432 Double_t xpos, ypos, zpos;
2433 Double_t seglen;
2434 char volname[30];
b705c75b 2435
2436
c55b10c2 2437 zlen = fNModules*fgkOBModuleZLength + (fNModules-1)*fgkOBModuleGap;
2438
2b9468b2 2439 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSHalfStavePattern(), fLayerNumber);
2440 if (gGeoManager->GetVolume(volname)) { // Should always be so
2441 sframeHeight -= ((TGeoBBox*)gGeoManager->GetVolume(volname)->GetShape())->GetDY()*2;
2442 zlen = ((TGeoBBox*)gGeoManager->GetVolume(volname)->GetShape())->GetDZ()*2;
2443 }
2444 seglen = zlen/fNModules;
c55b10c2 2445
2446
b705c75b 2447 // First create all needed shapes and volumes
2448
2b9468b2 2449 TGeoBBox *spaceFrame = new TGeoBBox(sframeWidth/2,sframeHeight/2,zlen/2);
c55b10c2 2450 TGeoBBox *segment = new TGeoBBox(sframeWidth/2,sframeHeight/2,seglen/2);
b705c75b 2451
2452 TGeoVolume *spaceFrameVol = new TGeoVolume("CarbonFrameVolume",
2453 spaceFrame, medAir);
2b9468b2 2454 spaceFrameVol->SetVisibility(kFALSE);
b705c75b 2455
2b9468b2 2456 TGeoVolume *segmentVol = new TGeoVolume("segmentVol", segment, medAir);
b705c75b 2457
2458 //SpaceFrame
2459
852af72e 2460 //--- the top V of the Carbon Fiber Stave (segment)
2461 TGeoArb8 *cfStavTop1 = CreateStaveSide("CFstavTopCornerVol1shape", seglen/2., halfTheta, -1, staveLa, staveHa, stavel);
2b9468b2 2462 TGeoVolume *cfStavTopVol1 = new TGeoVolume("CFstavTopCornerVol1",
2463 cfStavTop1, medCarbon);
2464 cfStavTopVol1->SetLineColor(35);
2465
2466 TGeoArb8 *cfStavTop2 = CreateStaveSide("CFstavTopCornerVol2shape", seglen/2., halfTheta, 1, staveLa, staveHa, stavel);
2467 TGeoVolume *cfStavTopVol2 = new TGeoVolume("CFstavTopCornerVol2",
2468 cfStavTop2, medCarbon );
2469 cfStavTopVol2->SetLineColor(35);
b705c75b 2470
c55b10c2 2471 TGeoTranslation *trTop1 = new TGeoTranslation(0, sframeHeight/2, 0);
b705c75b 2472
2473 //--- the 2 side V
2b9468b2 2474 TGeoArb8 *cfStavSide1 = CreateStaveSide("CFstavSideCornerVol1shape", seglen/2., beta, -1, staveLb, staveHb, stavel);
2475 TGeoVolume *cfStavSideVol1 = new TGeoVolume("CFstavSideCornerVol1",
2476 cfStavSide1, medCarbon);
2477 cfStavSideVol1->SetLineColor(35);
b705c75b 2478
2b9468b2 2479 TGeoArb8 *cfStavSide2 = CreateStaveSide("CFstavSideCornerVol2shape", seglen/2., beta, 1, staveLb, staveHb, stavel);
2480 TGeoVolume *cfStavSideVol2 = new TGeoVolume("CFstavSideCornerVol2",
2481 cfStavSide2, medCarbon );
2482 cfStavSideVol2->SetLineColor(35);
2483
2484 xpos = -sframeWidth/2;
2485 ypos = -sframeHeight/2 + staveBeamRadius + staveHb*TMath::Sin(beta);
2486 TGeoCombiTrans *ctSideR = new TGeoCombiTrans( xpos, ypos, 0,
2487 new TGeoRotation("", 180-2*beta*TMath::RadToDeg(), 0, 0));
2488 TGeoCombiTrans *ctSideL = new TGeoCombiTrans(-xpos, ypos, 0,
2489 new TGeoRotation("",-180+2*beta*TMath::RadToDeg(), 0, 0));
b705c75b 2490
852af72e 2491 segmentVol->AddNode(cfStavTopVol1,1,trTop1);
2492 segmentVol->AddNode(cfStavTopVol2,1,trTop1);
2493 segmentVol->AddNode(cfStavSideVol1,1,ctSideR);
2494 segmentVol->AddNode(cfStavSideVol1,2,ctSideL);
2495 segmentVol->AddNode(cfStavSideVol2,1,ctSideR);
2496 segmentVol->AddNode(cfStavSideVol2,2,ctSideL);
b705c75b 2497
2498
2499 //--- The beams
2500 // Beams on the sides
c55b10c2 2501 Double_t beamPhiPrime = TMath::ASin(1./TMath::Sqrt( (1+TMath::Sin(2*beta)*TMath::Sin(2*beta)/(TanD(fgkOBSFrameBeamSidePhi)*TanD(fgkOBSFrameBeamSidePhi))) ));
2502 Double_t beamLength = TMath::Sqrt( sframeHeight*sframeHeight/( TMath::Sin(beamPhiPrime)*TMath::Sin(beamPhiPrime))+ sframeWidth*sframeWidth/4.)-staveLa/2-staveLb/2;
2b9468b2 2503 TGeoTubeSeg *sideBeam = new TGeoTubeSeg(0, staveBeamRadius,
2504 beamLength/2, 0, 180);
2505 TGeoVolume *sideBeamVol = new TGeoVolume("CFstavSideBeamVol",
2506 sideBeam, medCarbon);
2507 sideBeamVol->SetLineColor(35);
2508
2509 TGeoRotation *beamRot1 = new TGeoRotation("", /*90-2*beta*/halfTheta*TMath::RadToDeg(),
2510 -beamPhiPrime*TMath::RadToDeg(), -90);
2511 TGeoRotation *beamRot2 = new TGeoRotation("", 90-2.*beta*TMath::RadToDeg(),
2512 beamPhiPrime*TMath::RadToDeg(), -90);
2513 TGeoRotation *beamRot3 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
2514 beamPhiPrime*TMath::RadToDeg(), -90);
2515 TGeoRotation *beamRot4 = new TGeoRotation("", 90+2.*beta*TMath::RadToDeg(),
2516 -beamPhiPrime*TMath::RadToDeg(), -90);
b705c75b 2517
2518 TGeoCombiTrans *beamTransf[8];
1d19233b 2519 xpos = 0.49*triangleHeight*TMath::Tan(halfTheta);//was 0.5, fix small overlap
2b9468b2 2520 ypos = staveBeamRadius/2;
2521 zpos = seglen/8;
2522 beamTransf[0] = new TGeoCombiTrans( xpos, ypos,-3*zpos, beamRot1);
b705c75b 2523
2b9468b2 2524 beamTransf[1] = new TGeoCombiTrans( xpos, ypos,-3*zpos, beamRot1);
b705c75b 2525 AddTranslationToCombiTrans(beamTransf[1], 0, 0, seglen/2);
2526
2b9468b2 2527 beamTransf[2] = new TGeoCombiTrans( xpos, ypos, -zpos, beamRot2);
b705c75b 2528
2b9468b2 2529 beamTransf[3] = new TGeoCombiTrans( xpos, ypos, -zpos, beamRot2);
b705c75b 2530 AddTranslationToCombiTrans(beamTransf[3], 0, 0, seglen/2);
2531
2b9468b2 2532 beamTransf[4] = new TGeoCombiTrans(-xpos, ypos,-3*zpos, beamRot3);
b705c75b 2533
2b9468b2 2534 beamTransf[5] = new TGeoCombiTrans(-xpos, ypos,-3*zpos, beamRot3);
b705c75b 2535 AddTranslationToCombiTrans(beamTransf[5], 0, 0, seglen/2);
2536
2b9468b2 2537 beamTransf[6] = new TGeoCombiTrans(-xpos, ypos, -zpos, beamRot4);
2538 beamTransf[7] = new TGeoCombiTrans(-xpos, ypos, 3*zpos, beamRot4);
b705c75b 2539
2540 //--- Beams of the bottom
2b9468b2 2541 TGeoTubeSeg *bottomBeam1 = new TGeoTubeSeg(0, staveBeamRadius,
2542 sframeWidth/2.-staveLb/3, 0, 180);
2543 TGeoVolume *bottomBeam1Vol = new TGeoVolume("CFstavBottomBeam1Vol",
2544 bottomBeam1, medCarbon);
b705c75b 2545 bottomBeam1Vol->SetLineColor(35);
2b9468b2 2546
2547 TGeoTubeSeg *bottomBeam2 = new TGeoTubeSeg(0, staveBeamRadius,
2548 sframeWidth/2.-staveLb/3, 0, 90);
2549 TGeoVolume *bottomBeam2Vol = new TGeoVolume("CFstavBottomBeam2Vol",
2550 bottomBeam2, medCarbon);
b705c75b 2551 bottomBeam2Vol->SetLineColor(35);
2b9468b2 2552
2553 TGeoTubeSeg *bottomBeam3 = new TGeoTubeSeg(0, staveBeamRadius,
2554 0.5*sframeWidth/SinD(bottomBeamAngle) - staveLb/3,
2555 0, 180);
2556 TGeoVolume *bottomBeam3Vol = new TGeoVolume("CFstavBottomBeam3Vol",
2557 bottomBeam3, medCarbon);
b705c75b 2558 bottomBeam3Vol->SetLineColor(35);
2559
2b9468b2 2560 TGeoRotation *bottomBeamRot1 = new TGeoRotation("", 90, 90, 90);
2561 TGeoRotation *bottomBeamRot2 = new TGeoRotation("",-90, 90, -90);
b705c75b 2562
2b9468b2 2563 TGeoCombiTrans *bottomBeamTransf1 = new TGeoCombiTrans("",0,
2564 -(sframeHeight/2-staveBeamRadius), 0,
2565 bottomBeamRot1);
2566 TGeoCombiTrans *bottomBeamTransf2 = new TGeoCombiTrans(0,
2567 -(sframeHeight/2-staveBeamRadius),
2568 -seglen/2,
2569 bottomBeamRot1);
2570 TGeoCombiTrans *bottomBeamTransf3 = new TGeoCombiTrans(0,
2571 -(sframeHeight/2-staveBeamRadius),
2572 seglen/2,
2573 bottomBeamRot2);
2574 // be careful for beams #3: when "reading" from -z to +z and
2575 // from the bottom of the stave, it should draw a Lambda, and not a V
2576 TGeoRotation *bottomBeamRot4 = new TGeoRotation("",-90, bottomBeamAngle,-90);
2577 TGeoRotation *bottomBeamRot5 = new TGeoRotation("",-90,-bottomBeamAngle,-90);
2578
2579 TGeoCombiTrans *bottomBeamTransf4 = new TGeoCombiTrans(0,
2580 -(sframeHeight/2-staveBeamRadius),
2581 -seglen/4,
2582 bottomBeamRot4);
2583 TGeoCombiTrans *bottomBeamTransf5 = new TGeoCombiTrans(0,
2584 -(sframeHeight/2-staveBeamRadius),
2585 seglen/4,
2586 bottomBeamRot5);
2587
2588
2589 segmentVol->AddNode(sideBeamVol,1, beamTransf[0]);
2590 segmentVol->AddNode(sideBeamVol,2, beamTransf[1]);
2591 segmentVol->AddNode(sideBeamVol,3, beamTransf[2]);
2592 segmentVol->AddNode(sideBeamVol,4, beamTransf[3]);
2593 segmentVol->AddNode(sideBeamVol,5, beamTransf[4]);
2594 segmentVol->AddNode(sideBeamVol,6, beamTransf[5]);
2595 segmentVol->AddNode(sideBeamVol,7, beamTransf[6]);
2596 segmentVol->AddNode(sideBeamVol,8, beamTransf[7]);
b705c75b 2597 segmentVol->AddNode(bottomBeam1Vol,1,bottomBeamTransf1);
2598 segmentVol->AddNode(bottomBeam2Vol,1,bottomBeamTransf2);
740c273e 2599 segmentVol->AddNode(bottomBeam2Vol,2,bottomBeamTransf3);
b705c75b 2600 segmentVol->AddNode(bottomBeam3Vol,1,bottomBeamTransf4);
740c273e 2601 segmentVol->AddNode(bottomBeam3Vol,2,bottomBeamTransf5);
b705c75b 2602
2b9468b2 2603
2604 // Then build up the space frame
2605 for(Int_t i=0; i<fNModules; i++){
2606 zpos = -spaceFrame->GetDZ() + (1 + 2*i)*segment->GetDZ();
2607 spaceFrameVol->AddNode(segmentVol, i, new TGeoTranslation(0, 0, zpos));
b705c75b 2608 }
2609
2610
2b9468b2 2611 // Done, return the space frame structure
b705c75b 2612 return spaceFrameVol;
2613}
2614
2615//________________________________________________________________________
c55b10c2 2616TGeoVolume* AliITSUv1Layer::CreateChipInnerB(const Double_t xchip,
2617 const Double_t ychip,
2618 const Double_t zchip,
2619 const TGeoManager *mgr){
b705c75b 2620//
852af72e 2621// Creates the actual Chip
b705c75b 2622//
2623// Input:
c55b10c2 2624// xchip,ychip,zchip : the chip dimensions
b705c75b 2625// mgr : the GeoManager (used only to get the proper material)
2626//
2627// Output:
2628//
2629// Return:
2630//
2631// Created: 22 Jun 2011 Mario Sitta
2632//
2633
2634 char volname[30];
2635 Double_t xlen, ylen, zlen;
2636 Double_t xpos, ypos, zpos;
2637
2638
2639 // First create all needed shapes
2640
852af72e 2641 // The chip
c55b10c2 2642 TGeoBBox *chip = new TGeoBBox(xchip, ychip, zchip);
b705c75b 2643
2644 // The sensor
852af72e 2645 xlen = chip->GetDX();
b705c75b 2646 ylen = 0.5*fSensorThick;
852af72e 2647 zlen = chip->GetDZ();
b705c75b 2648 TGeoBBox *sensor = new TGeoBBox(xlen, ylen, zlen);
2649
2650
2651 // We have all shapes: now create the real volumes
b705c75b 2652 TGeoMedium *medSi = mgr->GetMedium("ITS_SI$");
2653
852af72e 2654 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSChipPattern(), fLayerNumber);
c55b10c2 2655 TGeoVolume *chipVol = new TGeoVolume(volname, chip, medSi);
2656 chipVol->SetVisibility(kTRUE);
2657 chipVol->SetLineColor(1);
b705c75b 2658
2659 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSSensorPattern(), fLayerNumber);
2660 TGeoVolume *sensVol = new TGeoVolume(volname, sensor, medSi);
2661 sensVol->SetVisibility(kTRUE);
2662 sensVol->SetLineColor(8);
2663 sensVol->SetLineWidth(1);
2664 sensVol->SetFillColor(sensVol->GetLineColor());
2665 sensVol->SetFillStyle(4000); // 0% transparent
2666
2667
852af72e 2668 // Now build up the chip
b705c75b 2669 xpos = 0.;
852af72e 2670 ypos = -chip->GetDY() + sensor->GetDY();
b705c75b 2671 zpos = 0.;
2672
c55b10c2 2673 chipVol->AddNode(sensVol, 1, new TGeoTranslation(xpos, ypos, zpos));
b705c75b 2674
852af72e 2675 // Done, return the chip
c55b10c2 2676 return chipVol;
b705c75b 2677}
2678
2679//________________________________________________________________________
c55b10c2 2680TGeoVolume* AliITSUv1Layer::CreateModuleOuterB(const TGeoManager *mgr){
b705c75b 2681//
c55b10c2 2682// Creates the OB Module: HIC + FPC + Carbon plate
b705c75b 2683//
2684// Input:
b705c75b 2685// mgr : the GeoManager (used only to get the proper material)
2686//
2687// Output:
2688//
2689// Return:
c55b10c2 2690// the module as a TGeoVolume
b705c75b 2691//
2692// Created: 18 Dec 2013 M. Sitta, A. Barbano
c55b10c2 2693// Updated: 26 Feb 2014 M. Sitta
b705c75b 2694//
2695
2696
2697 char volname[30];
2698
c55b10c2 2699 Double_t xGap = fgkOBChipXGap;
2700 Double_t zGap = fgkOBChipZGap;
b705c75b 2701
2b9468b2 2702 Double_t xchip, ychip, zchip;
b705c75b 2703 Double_t xlen, ylen, zlen;
2704 Double_t xpos, ypos, zpos;
2705
2706 // First create all needed shapes
2707
c55b10c2 2708 // The chip (the same as for IB)
2709 xlen = (fgkOBHalfStaveWidth/2-xGap/2)/fgkOBNChipRows;
2710 ylen = 0.5*fStaveThick; // TO BE CHECKED
2711 zlen = (fgkOBModuleZLength - (fgkOBChipsPerRow-1)*zGap)/(2*fgkOBChipsPerRow);
b705c75b 2712
c55b10c2 2713 TGeoVolume *chipVol = CreateChipInnerB(xlen, ylen, zlen);
2714
2b9468b2 2715 xchip = ((TGeoBBox*)chipVol->GetShape())->GetDX();
2716 ychip = ((TGeoBBox*)chipVol->GetShape())->GetDY();
2717 zchip = ((TGeoBBox*)chipVol->GetShape())->GetDZ();
c55b10c2 2718
2719 // The module carbon plate
2720 xlen = fgkOBHalfStaveWidth/2;
2721 ylen = fgkOBCarbonPlateThick/2;
2722 zlen = fgkOBModuleZLength/2;
2723 TGeoBBox *modPlate = new TGeoBBox("CarbonPlate", xlen, ylen, zlen);
2724
2725 // The glue
2726 ylen = fgkOBGlueThick/2;
2727 TGeoBBox *glue = new TGeoBBox("Glue", xlen, ylen, zlen);
2728
2729 // The flex cables
2730 ylen = fgkOBFlexCableAlThick/2;
2731 TGeoBBox *flexAl = new TGeoBBox("FlexAl", xlen, ylen, zlen);
2732
2733 ylen = fgkOBFlexCableKapThick/2;
2734 TGeoBBox *flexKap = new TGeoBBox("FlexKap", xlen, ylen, zlen);
2735
2736 // The module
2737 xlen = fgkOBHalfStaveWidth/2;
2b9468b2 2738 ylen = ychip + modPlate->GetDY() + glue->GetDY() +
c55b10c2 2739 flexAl->GetDY() + flexKap->GetDY();
2740 zlen = fgkOBModuleZLength/2;
2741 TGeoBBox *module = new TGeoBBox("OBModule", xlen, ylen, zlen);
b705c75b 2742
2743
2744 // We have all shapes: now create the real volumes
2745
c55b10c2 2746 TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");
2747 TGeoMedium *medCarbon = mgr->GetMedium("ITS_CARBON$");
2748 TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");
2749 TGeoMedium *medAluminum = mgr->GetMedium("ITS_ALUMINUM$");
2750 TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");
2751
2752 TGeoVolume *modPlateVol = new TGeoVolume("CarbonPlateVol",
2753 modPlate, medCarbon);
2754 modPlateVol->SetLineColor(kMagenta-8);
2755 modPlateVol->SetFillColor(modPlateVol->GetLineColor());
2756 modPlateVol->SetFillStyle(4000); // 0% transparent
b705c75b 2757
c55b10c2 2758 TGeoVolume *glueVol = new TGeoVolume("GlueVol", glue, medGlue);
2759 glueVol->SetLineColor(kBlack);
2760 glueVol->SetFillColor(glueVol->GetLineColor());
2761 glueVol->SetFillStyle(4000); // 0% transparent
2762
2763 TGeoVolume *flexAlVol = new TGeoVolume("FlexAlVol", flexAl, medAluminum);
2764 flexAlVol->SetLineColor(kRed);
2765 flexAlVol->SetFillColor(flexAlVol->GetLineColor());
2766 flexAlVol->SetFillStyle(4000); // 0% transparent
2767
2768 TGeoVolume *flexKapVol = new TGeoVolume("FlexKapVol", flexKap, medKapton);
2769 flexKapVol->SetLineColor(kGreen);
2770 flexKapVol->SetFillColor(flexKapVol->GetLineColor());
2771 flexKapVol->SetFillStyle(4000); // 0% transparent
2772
2773 snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSModulePattern(), fLayerNumber);
2774 TGeoVolume *modVol = new TGeoVolume(volname, module, medAir);
2775 modVol->SetVisibility(kTRUE);
b705c75b 2776
2777
c55b10c2 2778 // Now build up the module
2779 ypos = -module->GetDY() + modPlate->GetDY();
2780 modVol->AddNode(modPlateVol, 1, new TGeoTranslation(0, ypos, 0));
b705c75b 2781
c55b10c2 2782 ypos += (modPlate->GetDY() + glue->GetDY());
2783 modVol->AddNode(glueVol, 1, new TGeoTranslation(0, ypos, 0));
2784
2b9468b2 2785 xpos = -module->GetDX() + xchip;
2786 ypos += (glue->GetDY() + ychip);
c55b10c2 2787 for(Int_t k=0; k<fgkOBChipsPerRow; k++) //put 7x2 chip into one module
b705c75b 2788 {
2b9468b2 2789 zpos = -module->GetDZ() + zchip + k*(2*zchip + zGap);
c55b10c2 2790 modVol->AddNode(chipVol, 2*k , new TGeoTranslation( xpos, ypos, zpos));
65740b7a 2791 modVol->AddNode(chipVol, 2*k+1,
2792 new TGeoCombiTrans(-xpos, ypos, zpos, new TGeoRotation("",0,180,180)));
c55b10c2 2793 fHierarchy[kChip]+=2;
b705c75b 2794 }
c55b10c2 2795
2b9468b2 2796 ypos += (ychip + flexAl->GetDY());
c55b10c2 2797 modVol->AddNode(flexAlVol, 1, new TGeoTranslation(0, ypos, 0));
2798
2799 ypos += (flexAl->GetDY() + flexKap->GetDY());
2800 modVol->AddNode(flexKapVol, 1, new TGeoTranslation(0, ypos, 0));
b705c75b 2801
c55b10c2 2802
2803 // Done, return the module
b705c75b 2804 return modVol;
2805}
2806
2807//________________________________________________________________________
2808Double_t AliITSUv1Layer::RadiusOfTurboContainer(){
2809//
2810// Computes the inner radius of the air container for the Turbo configuration
852af72e 2811// as the radius of either the circle tangent to the stave or the circle
2812// passing for the stave's lower vertex
b705c75b 2813//
2814// Input:
2815// none (all needed parameters are class members)
2816//
2817// Output:
2818//
2819// Return:
2820// the radius of the container if >0, else flag to use the lower vertex
2821//
2822// Created: 08 Mar 2012 Mario Sitta
2823//
2824
852af72e 2825 Double_t rr, delta, z, lstav, rstav;
b705c75b 2826
852af72e 2827 if (fStaveThick > 89.) // Very big angle: avoid overflows since surely
b705c75b 2828 return -1; // the radius from lower vertex is the right value
2829
852af72e 2830 rstav = fLayRadius + 0.5*fStaveThick;
2831 delta = (0.5*fStaveThick)/CosD(fStaveTilt);
2832 z = (0.5*fStaveThick)*TanD(fStaveTilt);
b705c75b 2833
852af72e 2834 rr = rstav - delta;
2835 lstav = (0.5*fStaveWidth) - z;
b705c75b 2836
852af72e 2837 if ( (rr*SinD(fStaveTilt) < lstav) )
2838 return (rr*CosD(fStaveTilt));
b705c75b 2839 else
2840 return -1;
2841}
2842
c55b10c2 2843//________________________________________________________________________
2844void AliITSUv1Layer::SetNUnits(Int_t u)
2845{
2846//
2847// Sets the number of units in a stave:
2848// for the Inner Barrel: the number of chips per stave
2849// for the Outer Barrel: the number of modules per half stave
2850//
2851//
2852// Input:
2853// u : the number of units
2854//
2855// Output:
2856//
2857// Return:
2858//
2859// Created: 18 Feb 2013 Mario Sitta (was already SetNChips)
2860//
2861
2862 if (fLayerNumber < fgkNumberOfInnerLayers)
2863 fNChips = u;
2864 else {
2865 fNModules = u;
2866 fNChips = fgkOBChipsPerRow;
2867 }
2868
2869}
2870
b705c75b 2871//________________________________________________________________________
852af72e 2872void AliITSUv1Layer::SetStaveTilt(const Double_t t)
b705c75b 2873{
2874//
852af72e 2875// Sets the Stave tilt angle (for turbo layers only)
b705c75b 2876//
2877// Input:
852af72e 2878// t : the stave tilt angle
b705c75b 2879//
2880// Output:
2881//
2882// Return:
2883//
2884// Created: 08 Jul 2011 Mario Sitta
2885//
2886
2887 if (fIsTurbo)
852af72e 2888 fStaveTilt = t;
b705c75b 2889 else
2890 AliError("Not a Turbo layer");
2891
2892}
2893
2894//________________________________________________________________________
852af72e 2895void AliITSUv1Layer::SetStaveWidth(const Double_t w){
b705c75b 2896//
852af72e 2897// Sets the Stave width (for turbo layers only)
b705c75b 2898//
2899// Input:
852af72e 2900// w : the stave width
b705c75b 2901//
2902// Output:
2903//
2904// Return:
2905//
2906// Created: 08 Jul 2011 Mario Sitta
2907//
2908
2909 if (fIsTurbo)
852af72e 2910 fStaveWidth = w;
b705c75b 2911 else
2912 AliError("Not a Turbo layer");
2913
2914}
2915
2916//________________________________________________________________________
852af72e 2917TGeoArb8 *AliITSUv1Layer::CreateStaveSide(const char *name,
b705c75b 2918 Double_t dz, Double_t angle, Double_t xSign,
2919 Double_t L, Double_t H, Double_t l) {
2920//
2921// Creates the V-shaped sides of the OB space frame
2922// (from a similar method with same name and function
2923// in AliITSv11GeometrySDD class by L.Gaudichet)
2924//
2925
852af72e 2926 // Create one half of the V shape corner of CF stave
b705c75b 2927
852af72e 2928 TGeoArb8 *cfStavSide = new TGeoArb8(dz);
2929 cfStavSide->SetName(name);
b705c75b 2930
2931 // Points must be in clockwise order
852af72e 2932 cfStavSide->SetVertex(0, 0, 0);
2933 cfStavSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
b705c75b 2934 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
852af72e 2935 cfStavSide->SetVertex(4, 0, 0);
2936 cfStavSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
b705c75b 2937 -L*TMath::Cos(angle)-l*TMath::Sin(angle));
2938 if (xSign < 0) {
852af72e 2939 cfStavSide->SetVertex(1, 0, -H);
2940 cfStavSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2941 cfStavSide->SetVertex(5, 0, -H);
2942 cfStavSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
b705c75b 2943 } else {
852af72e 2944 cfStavSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2945 cfStavSide->SetVertex(3, 0, -H);
2946 cfStavSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
2947 cfStavSide->SetVertex(7, 0, -H);
b705c75b 2948 }
852af72e 2949 return cfStavSide;
b705c75b 2950}
2951
2952//________________________________________________________________________
2953TGeoCombiTrans *AliITSUv1Layer::CreateCombiTrans(const char *name,
2954 Double_t dy, Double_t dz,
2955 Double_t dphi, Bool_t planeSym) {
2956//
2957// Help method to create a TGeoCombiTrans matrix
2958// (from a similar method with same name and function
2959// in AliITSv11GeometrySDD class by L.Gaudichet)
2960//
2961
2962 //
2963 // return the TGeoCombiTrans which make a translation in y and z
2964 // and a rotation in phi in the global coord system
2965 // If planeSym = true, the rotation places the object symetrically
2966 // (with respect to the transverse plane) to its position in the
2967 // case planeSym = false
2968 //
2969
2970 TGeoTranslation t1(dy*CosD(90.+dphi),dy*SinD(90.+dphi), dz);
2971 TGeoRotation r1("",0.,0.,dphi);
2972 TGeoRotation r2("",90, 180, -90-dphi);
2973
2974 TGeoCombiTrans *combiTrans1 = new TGeoCombiTrans(name);
2975 combiTrans1->SetTranslation(t1);
2976 if (planeSym) combiTrans1->SetRotation(r1);
2977 else combiTrans1->SetRotation(r2);
2978 return combiTrans1;
2979}
2980
2981//________________________________________________________________________
2982void AliITSUv1Layer::AddTranslationToCombiTrans(TGeoCombiTrans* ct,
2983 Double_t dx,
2984 Double_t dy,
2985 Double_t dz) const{
2986//
2987// Help method to add a translation to a TGeoCombiTrans matrix
2988// (from a similar method with same name and function
2989// in AliITSv11GeometrySDD class by L.Gaudichet)
2990//
2991
2992 // Add a dx,dy,dz translation to the initial TGeoCombiTrans
2993 const Double_t *vect = ct->GetTranslation();
2994 Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz};
2995 ct->SetTranslation(newVect);
2996}