]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRD.cxx
Cleanup
[u/mrichter/AliRoot.git] / TRD / AliTRD.cxx
CommitLineData
4c039060 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$Log$
1cedd08a 18Revision 1.15 1999/11/02 17:04:25 fca
19Small syntax change for HP compiler
20
94c641ff 21Revision 1.14 1999/11/02 16:57:02 fca
22Avoid non ansi warnings on HP compilers
23
8459a454 24Revision 1.13 1999/11/02 16:35:56 fca
25New version of TRD introduced
26
5c7f4665 27Revision 1.12 1999/11/01 20:41:51 fca
28Added protections against using the wrong version of FRAME
29
ab76897d 30Revision 1.11 1999/09/29 09:24:34 fca
31Introduction of the Copyright and cvs Log
32
4c039060 33*/
34
fe4da5cc 35///////////////////////////////////////////////////////////////////////////////
36// //
37// Transition Radiation Detector //
38// This class contains the basic functions for the Transition Radiation //
5c7f4665 39// Detector, as well as the geometry. //
40// Functions specific to one particular geometry are contained in the //
41// derived classes. //
fe4da5cc 42// //
43//Begin_Html
44/*
1439f98e 45<img src="picts/AliTRDClass.gif">
fe4da5cc 46*/
47//End_Html
48// //
49// //
50///////////////////////////////////////////////////////////////////////////////
51
5c7f4665 52#include <stdlib.h>
53
fe4da5cc 54#include <TMath.h>
fe4da5cc 55#include <TNode.h>
fe4da5cc 56#include <TPGON.h>
57
fe4da5cc 58#include "AliTRD.h"
59#include "AliRun.h"
d3f347ff 60#include "AliConst.h"
fe4da5cc 61
62ClassImp(AliTRD)
63
64//_____________________________________________________________________________
65AliTRD::AliTRD()
66{
67 //
68 // Default constructor
69 //
82bbf98a 70
8459a454 71 Int_t iplan;
72
d3f347ff 73 fIshunt = 0;
74 fGasMix = 0;
99d5402e 75 fHits = 0;
76 fDigits = 0;
5c7f4665 77 fHole = 0;
78
79 fClusters = 0;
80 fNclusters = 0;
82bbf98a 81
82 // The chamber dimensions
8459a454 83 for (iplan = 0; iplan < kNplan; iplan++) {
5c7f4665 84 fClengthI[iplan] = 0.;
85 fClengthM1[iplan] = 0.;
86 fClengthM2[iplan] = 0.;
87 fClengthO1[iplan] = 0.;
88 fClengthO2[iplan] = 0.;
89 fClengthO3[iplan] = 0.;
90 fCwidth[iplan] = 0.;
91 }
92
8459a454 93 for (iplan = 0; iplan < kNplan; iplan++) {
5c7f4665 94 for (Int_t icham = 0; icham < kNcham; icham++) {
95 for (Int_t isect = 0; isect < kNsect; isect++) {
96 fRowMax[iplan][icham][isect] = 0;
97 }
98 }
99 fColMax[iplan] = 0;
82bbf98a 100 }
5c7f4665 101 fTimeMax = 0;
102
103 fRowPadSize = 0;
104 fColPadSize = 0;
105 fTimeBinSize = 0;
82bbf98a 106
fe4da5cc 107}
108
109//_____________________________________________________________________________
110AliTRD::AliTRD(const char *name, const char *title)
111 : AliDetector(name,title)
112{
113 //
114 // Standard constructor for the TRD
115 //
116
8459a454 117 Int_t iplan;
118
5c7f4665 119 // Check that FRAME is there otherwise we have no place where to
120 // put TRD
121 AliModule* FRAME=gAlice->GetModule("FRAME");
122 if (!FRAME) {
123 Error("Ctor","TRD needs FRAME to be present\n");
124 exit(1);
125 }
126
127 // Define the TRD geometry according to the FRAME geometry
128 if (FRAME->IsVersion() == 0)
129 // With hole
130 fHole = 1;
131 else
132 // Without hole
133 fHole = 0;
134
fe4da5cc 135 // Allocate the hit array
5c7f4665 136 fHits = new TClonesArray("AliTRDhit" , 405);
1cedd08a 137 gAlice->AddHitList(fHits);
99d5402e 138
139 // Allocate the digits array
5c7f4665 140 fDigits = new TClonesArray("AliTRDdigit" ,10000);
141
142 // Allocate the cluster array
143 fClusters = new TClonesArray("AliTRDcluster", 400);
144 fNclusters = 0;
99d5402e 145
82bbf98a 146 fIshunt = 0;
147 fGasMix = 0;
148
149 // The chamber dimensions
8459a454 150 for (iplan = 0; iplan < kNplan; iplan++) {
5c7f4665 151 fClengthI[iplan] = 0.;
152 fClengthM1[iplan] = 0.;
153 fClengthM2[iplan] = 0.;
154 fClengthO1[iplan] = 0.;
155 fClengthO2[iplan] = 0.;
156 fClengthO3[iplan] = 0.;
157 fCwidth[iplan] = 0.;
82bbf98a 158 }
fe4da5cc 159
8459a454 160 for (iplan = 0; iplan < kNplan; iplan++) {
5c7f4665 161 for (Int_t icham = 0; icham < kNcham; icham++) {
162 for (Int_t isect = 0; isect < kNsect; isect++) {
163 fRowMax[iplan][icham][isect] = 0;
164 }
165 }
166 fColMax[iplan] = 0;
167 }
168 fTimeMax = 0;
169
170 fRowPadSize = 0;
171 fColPadSize = 0;
172 fTimeBinSize = 0;
173
fe4da5cc 174 SetMarkerColor(kWhite);
82bbf98a 175
fe4da5cc 176}
99d5402e 177
178//_____________________________________________________________________________
179AliTRD::~AliTRD()
180{
181 //
182 // TRD destructor
183 //
184
185 fIshunt = 0;
186
187 delete fHits;
188 delete fDigits;
5c7f4665 189 delete fClusters;
190
191}
192
193//_____________________________________________________________________________
194void AliTRD::AddCluster(Int_t *tracks, Int_t *clusters, Float_t *position)
195{
196 //
197 // Add a cluster for the TRD
198 //
199
200 TClonesArray &lclusters = *fClusters;
201 new(lclusters[fNclusters++]) AliTRDcluster(tracks,clusters,position);
99d5402e 202
203}
204
205//_____________________________________________________________________________
206void AliTRD::AddDigit(Int_t *tracks, Int_t *digits)
207{
208 //
209 // Add a digit for the TRD
210 //
211
212 TClonesArray &ldigits = *fDigits;
213 new(ldigits[fNdigits++]) AliTRDdigit(tracks,digits);
214
215}
216
fe4da5cc 217//_____________________________________________________________________________
218void AliTRD::AddHit(Int_t track, Int_t *vol, Float_t *hits)
219{
220 //
221 // Add a hit for the TRD
222 //
82bbf98a 223
fe4da5cc 224 TClonesArray &lhits = *fHits;
225 new(lhits[fNhits++]) AliTRDhit(fIshunt,track,vol,hits);
82bbf98a 226
fe4da5cc 227}
228
229//_____________________________________________________________________________
230void AliTRD::BuildGeometry()
231{
232 //
233 // Create the ROOT TNode geometry for the TRD
234 //
82bbf98a 235
fe4da5cc 236 TNode *Node, *Top;
237 TPGON *pgon;
238 const Int_t kColorTRD = 46;
d3f347ff 239
fe4da5cc 240 // Find the top node alice
82bbf98a 241 Top = gAlice->GetGeometry()->GetNode("alice");
d3f347ff 242
82bbf98a 243 pgon = new TPGON("S_TRD","TRD","void",0,360,kNsect,4);
244 Float_t ff = TMath::Cos(kDegrad * 180 / kNsect);
245 Float_t rrmin = kRmin / ff;
246 Float_t rrmax = kRmax / ff;
247 pgon->DefineSection(0,-kZmax1,rrmax,rrmax);
248 pgon->DefineSection(1,-kZmax2,rrmin,rrmax);
249 pgon->DefineSection(2, kZmax2,rrmin,rrmax);
250 pgon->DefineSection(3, kZmax1,rrmax,rrmax);
fe4da5cc 251 Top->cd();
252 Node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
253 Node->SetLineColor(kColorTRD);
254 fNodes->Add(Node);
d3f347ff 255
fe4da5cc 256}
257
258//_____________________________________________________________________________
82bbf98a 259void AliTRD::CreateGeometry()
fe4da5cc 260{
82bbf98a 261 //
262 // Creates the volumes for the TRD chambers
263 //
264 // Author: Christoph Blume (C.Blume@gsi.de) 20/07/99
265 //
266 // The volumes:
5c7f4665 267 // TRD1-3 (Air) --- The TRD mother volumes for one sector.
82bbf98a 268 // To be placed into the spaceframe.
269 //
270 // UAFI(/M/O) (Al) --- The aluminum frame of the inner(/middle/outer) chambers (readout)
271 // UCFI(/M/O) (C) --- The carbon frame of the inner(/middle/outer) chambers
272 // (driftchamber + radiator)
273 // UAII(/M/O) (Air) --- The inner part of the readout of the inner(/middle/outer) chambers
274 // UFII(/M/O) (Air) --- The inner part of the chamner and radiator of the
275 // inner(/middle/outer) chambers
276 //
277 // The material layers in one chamber:
278 // UL01 (G10) --- The gas seal of the radiator
279 // UL02 (CO2) --- The gas in the radiator
280 // UL03 (PE) --- The foil stack
281 // UL04 (Mylar) --- Entrance window to the driftvolume and HV-cathode
282 // UL05 (Xe) --- The driftvolume
283 // UL06 (Xe) --- The amplification region
284 //
285 // UL07 (Cu) --- The pad plane
286 // UL08 (G10) --- The Nomex honeycomb support structure
287 // UL09 (Cu) --- FEE and signal lines
288 // UL10 (PE) --- The cooling devices
289 // UL11 (Water) --- The cooling water
290
291 // Check that FRAME is there otherwise we have no place where to put the TRD
292 AliModule* FRAME = gAlice->GetModule("FRAME");
293 if (!FRAME) return;
294
8459a454 295 Int_t iplan;
296
82bbf98a 297 const Int_t npar_trd = 4;
298 const Int_t npar_cha = 3;
299
300 Float_t par_dum[3];
301 Float_t par_trd[npar_trd];
302 Float_t par_cha[npar_cha];
303
304 Float_t xpos, ypos, zpos;
305
5c7f4665 306 Int_t *idtmed = fIdtmed->GetArray() - 1299;
82bbf98a 307
308 // The length of the inner chambers
8459a454 309 for (iplan = 0; iplan < kNplan; iplan++)
5c7f4665 310 fClengthI[iplan] = 110.0;
311
82bbf98a 312 // The length of the middle chambers
5c7f4665 313 fClengthM1[0] = 123.5;
314 fClengthM1[1] = 131.0;
315 fClengthM1[2] = 138.5;
316 fClengthM1[3] = 146.0;
317 fClengthM1[4] = 153.0;
318 fClengthM1[5] = 160.5;
319
320 fClengthM2[0] = 123.5 - 7.0;
321 fClengthM2[1] = 131.0 - 7.0;
322 fClengthM2[2] = 138.5 - 7.0;
323 fClengthM2[3] = 146.0 - 7.0;
324 fClengthM2[4] = 153.0 - 7.0;
325 fClengthM2[5] = 160.4 - 7.0;
326
82bbf98a 327 // The length of the outer chambers
5c7f4665 328 fClengthO1[0] = 123.5;
329 fClengthO1[1] = 131.0;
330 fClengthO1[2] = 134.5;
331 fClengthO1[3] = 142.0;
332 fClengthO1[4] = 142.0;
333 fClengthO1[5] = 134.5;
334
335 fClengthO2[0] = 123.5;
336 fClengthO2[1] = 131.0;
337 fClengthO2[2] = 134.5;
338 fClengthO2[3] = 142.0;
339 fClengthO2[4] = 142.0;
340 fClengthO2[5] = 134.5;
341
342 fClengthO3[0] = 86.5;
343 fClengthO3[1] = 101.5;
344 fClengthO3[2] = 112.5;
345 fClengthO3[3] = 127.5;
346 fClengthO3[4] = 134.5;
347 fClengthO3[5] = 134.5;
82bbf98a 348
349 // The width of the chambers
5c7f4665 350 fCwidth[0] = 99.6;
351 fCwidth[1] = 104.1;
352 fCwidth[2] = 108.5;
353 fCwidth[3] = 112.9;
354 fCwidth[4] = 117.4;
355 fCwidth[5] = 121.8;
356
357 // The TRD mother volume for one sector (Air) (dimensions identical to BTR1)
82bbf98a 358 par_trd[0] = kSwidth1/2.;
359 par_trd[1] = kSwidth2/2.;
5c7f4665 360 par_trd[2] = kSlenTR1/2.;
82bbf98a 361 par_trd[3] = kSheight/2.;
5c7f4665 362 gMC->Gsvolu("TRD1","TRD1",idtmed[1302-1],par_trd,npar_trd);
363
364 // The TRD mother volume for one sector (Air) (dimensions identical to BTR2 + BTR3).
365 // Only used for the geometry with holes.
366 if (fHole) {
367
368 par_trd[0] = kSwidth1/2.;
369 par_trd[1] = kSwidth2/2.;
370 par_trd[2] = kSlenTR2/2.;
371 par_trd[3] = kSheight/2.;
372 gMC->Gsvolu("TRD2","TRD1",idtmed[1302-1],par_trd,npar_trd);
373
374 par_trd[0] = kSwidth1/2.;
375 par_trd[1] = kSwidth2/2.;
376 par_trd[2] = kSlenTR3/2.;
377 par_trd[3] = kSheight/2.;
378 gMC->Gsvolu("TRD3","TRD1",idtmed[1302-1],par_trd,npar_trd);
379
380 }
82bbf98a 381
382 // The aluminum frames - readout + electronics (Al)
383 // The inner chambers
384 gMC->Gsvolu("UAFI","BOX ",idtmed[1301-1],par_dum,0);
385 // The middle chambers
386 gMC->Gsvolu("UAFM","BOX ",idtmed[1301-1],par_dum,0);
387 // The outer chambers
388 gMC->Gsvolu("UAFO","BOX ",idtmed[1301-1],par_dum,0);
389
390 // The inner part of the aluminum frames (Air)
391 // The inner chambers
392 gMC->Gsvolu("UAII","BOX ",idtmed[1302-1],par_dum,0);
393 // The middle chambers
394 gMC->Gsvolu("UAIM","BOX ",idtmed[1302-1],par_dum,0);
395 // The outer chambers
396 gMC->Gsvolu("UAIO","BOX ",idtmed[1302-1],par_dum,0);
397
398 // The carbon frames - radiator + driftchamber (C)
399 // The inner chambers
400 gMC->Gsvolu("UCFI","BOX ",idtmed[1307-1],par_dum,0);
401 // The middle chambers
402 gMC->Gsvolu("UCFM","BOX ",idtmed[1307-1],par_dum,0);
403 // The outer chambers
404 gMC->Gsvolu("UCFO","BOX ",idtmed[1307-1],par_dum,0);
405
406 // The inner part of the carbon frames (Air)
407 // The inner chambers
408 gMC->Gsvolu("UCII","BOX ",idtmed[1302-1],par_dum,0);
409 // The middle chambers
410 gMC->Gsvolu("UCIM","BOX ",idtmed[1302-1],par_dum,0);
411 // The outer chambers
412 gMC->Gsvolu("UCIO","BOX ",idtmed[1302-1],par_dum,0);
413
414 // The material layers inside the chambers
415 par_cha[0] = -1.;
416 par_cha[1] = -1.;
417 // G10 layer (radiator seal)
418 par_cha[2] = kSeThick/2;
419 gMC->Gsvolu("UL01","BOX ",idtmed[1313-1],par_cha,npar_cha);
420 // CO2 layer (radiator)
421 par_cha[2] = kRaThick/2;
422 gMC->Gsvolu("UL02","BOX ",idtmed[1312-1],par_cha,npar_cha);
423 // PE layer (radiator)
424 par_cha[2] = kPeThick/2;
425 gMC->Gsvolu("UL03","BOX ",idtmed[1303-1],par_cha,npar_cha);
426 // Mylar layer (entrance window + HV cathode)
427 par_cha[2] = kMyThick/2;
428 gMC->Gsvolu("UL04","BOX ",idtmed[1308-1],par_cha,npar_cha);
429 // Xe/Isobutane layer (drift volume, sensitive)
430 par_cha[2] = kDrThick/2.;
431 gMC->Gsvolu("UL05","BOX ",idtmed[1309-1],par_cha,npar_cha);
432 // Xe/Isobutane layer (amplification volume, not sensitive)
433 par_cha[2] = kAmThick/2.;
434 gMC->Gsvolu("UL06","BOX ",idtmed[1309-1],par_cha,npar_cha);
435
436 // Cu layer (pad plane)
437 par_cha[2] = kCuThick/2;
438 gMC->Gsvolu("UL07","BOX ",idtmed[1305-1],par_cha,npar_cha);
439 // G10 layer (support structure)
440 par_cha[2] = kSuThick/2;
441 gMC->Gsvolu("UL08","BOX ",idtmed[1313-1],par_cha,npar_cha);
442 // Cu layer (FEE + signal lines)
443 par_cha[2] = kFeThick/2;
444 gMC->Gsvolu("UL09","BOX ",idtmed[1305-1],par_cha,npar_cha);
445 // PE layer (cooling devices)
446 par_cha[2] = kCoThick/2;
447 gMC->Gsvolu("UL10","BOX ",idtmed[1303-1],par_cha,npar_cha);
448 // Water layer (cooling)
449 par_cha[2] = kWaThick/2;
450 gMC->Gsvolu("UL11","BOX ",idtmed[1314-1],par_cha,npar_cha);
451
452 // Position the layers in the chambers
453 xpos = 0;
454 ypos = 0;
455
456 // G10 layer (radiator seal)
457 zpos = kSeZpos;
458 gMC->Gspos("UL01",1,"UCII",xpos,ypos,zpos,0,"ONLY");
459 gMC->Gspos("UL01",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
460 gMC->Gspos("UL01",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
461 // CO2 layer (radiator)
462 zpos = kRaZpos;
463 gMC->Gspos("UL02",1,"UCII",xpos,ypos,zpos,0,"ONLY");
464 gMC->Gspos("UL02",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
465 gMC->Gspos("UL02",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
466 // PE layer (radiator)
467 zpos = 0;
468 gMC->Gspos("UL03",1,"UL02",xpos,ypos,zpos,0,"ONLY");
469 // Mylar layer (entrance window + HV cathode)
470 zpos = kMyZpos;
471 gMC->Gspos("UL04",1,"UCII",xpos,ypos,zpos,0,"ONLY");
472 gMC->Gspos("UL04",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
473 gMC->Gspos("UL04",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
474 // Xe/Isobutane layer (drift volume)
475 zpos = kDrZpos;
476 gMC->Gspos("UL05",1,"UCII",xpos,ypos,zpos,0,"ONLY");
477 gMC->Gspos("UL05",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
478 gMC->Gspos("UL05",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
479 // Xe/Isobutane layer (amplification volume)
480 zpos = kAmZpos;
481 gMC->Gspos("UL06",1,"UCII",xpos,ypos,zpos,0,"ONLY");
482 gMC->Gspos("UL06",2,"UCIM",xpos,ypos,zpos,0,"ONLY");
483 gMC->Gspos("UL06",3,"UCIO",xpos,ypos,zpos,0,"ONLY");
484
485 // Cu layer (pad plane)
486 zpos = kCuZpos;
487 gMC->Gspos("UL07",1,"UAII",xpos,ypos,zpos,0,"ONLY");
488 gMC->Gspos("UL07",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
489 gMC->Gspos("UL07",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
490 // G10 layer (support structure)
491 zpos = kSuZpos;
492 gMC->Gspos("UL08",1,"UAII",xpos,ypos,zpos,0,"ONLY");
493 gMC->Gspos("UL08",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
494 gMC->Gspos("UL08",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
495 // Cu layer (FEE + signal lines)
496 zpos = kFeZpos;
497 gMC->Gspos("UL09",1,"UAII",xpos,ypos,zpos,0,"ONLY");
498 gMC->Gspos("UL09",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
499 gMC->Gspos("UL09",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
500 // PE layer (cooling devices)
501 zpos = kCoZpos;
502 gMC->Gspos("UL10",1,"UAII",xpos,ypos,zpos,0,"ONLY");
503 gMC->Gspos("UL10",2,"UAIM",xpos,ypos,zpos,0,"ONLY");
504 gMC->Gspos("UL10",3,"UAIO",xpos,ypos,zpos,0,"ONLY");
505 // Water layer (cooling)
506 zpos = kWaZpos;
507 gMC->Gspos("UL11",1,"UAII",xpos,ypos,zpos,0,"ONLY");
508 gMC->Gspos("UL11",1,"UAIM",xpos,ypos,zpos,0,"ONLY");
509 gMC->Gspos("UL11",1,"UAIO",xpos,ypos,zpos,0,"ONLY");
510
511 // Position the chambers in the TRD mother volume
8459a454 512 for (iplan = 1; iplan <= kNplan; iplan++) {
82bbf98a 513
514 // The inner chambers ---------------------------------------------------------------
515
516 // the aluminum frame
82bbf98a 517 par_cha[0] = fCwidth[iplan-1]/2.;
518 par_cha[1] = fClengthI[iplan-1]/2.;
519 par_cha[2] = kCaframe/2.;
520 xpos = 0.;
521 ypos = 0.;
522 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 523 gMC->Gsposp("UAFI",iplan ,"TRD1",xpos,ypos,zpos,0,"MANY",par_cha,npar_cha);
82bbf98a 524
525 // the inner part of the aluminum frame
82bbf98a 526 par_cha[0] = fCwidth[iplan-1]/2. - kCathick;
527 par_cha[1] = fClengthI[iplan-1]/2. - kCathick;
528 par_cha[2] = kCaframe/2.;
529 xpos = 0.;
530 ypos = 0.;
531 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 532 gMC->Gsposp("UAII",iplan ,"TRD1",xpos,ypos,zpos,0,"ONLY",par_cha,npar_cha);
82bbf98a 533
534 // the carbon frame
82bbf98a 535 par_cha[0] = fCwidth[iplan-1]/2.;
536 par_cha[1] = fClengthI[iplan-1]/2.;
537 par_cha[2] = kCcframe/2.;
538 xpos = 0.;
539 ypos = 0.;
540 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 541 gMC->Gsposp("UCFI",iplan ,"TRD1",xpos,ypos,zpos,0,"MANY",par_cha,npar_cha);
82bbf98a 542
543 // the inner part of the carbon frame
82bbf98a 544 par_cha[0] = fCwidth[iplan-1]/2. - kCcthick;
545 par_cha[1] = fClengthI[iplan-1]/2. - kCcthick;
546 par_cha[2] = kCcframe/2.;
547 xpos = 0.;
548 ypos = 0.;
549 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 550 gMC->Gsposp("UCII",iplan ,"TRD1",xpos,ypos,zpos,0,"ONLY",par_cha,npar_cha);
82bbf98a 551
552 // The middle chambers --------------------------------------------------------------
553
554 // the aluminum frame
82bbf98a 555 par_cha[0] = fCwidth[iplan-1]/2.;
5c7f4665 556 par_cha[1] = fClengthM1[iplan-1]/2.;
82bbf98a 557 par_cha[2] = kCaframe/2.;
558 xpos = 0.;
5c7f4665 559 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.;
82bbf98a 560 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 561 gMC->Gsposp("UAFM",iplan ,"TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
562 gMC->Gsposp("UAFM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
82bbf98a 563
564 // the inner part of the aluminum frame
5c7f4665 565 par_cha[0] = fCwidth[iplan-1]/2. - kCathick;
566 par_cha[1] = fClengthM1[iplan-1]/2. - kCathick;
82bbf98a 567 par_cha[2] = kCaframe/2.;
568 xpos = 0.;
5c7f4665 569 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.;
82bbf98a 570 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 571 gMC->Gsposp("UAIM",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
572 gMC->Gsposp("UAIM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
82bbf98a 573
574 // the carbon frame
82bbf98a 575 par_cha[0] = fCwidth[iplan-1]/2.;
5c7f4665 576 par_cha[1] = fClengthM1[iplan-1]/2.;
82bbf98a 577 par_cha[2] = kCcframe/2.;
578 xpos = 0.;
5c7f4665 579 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.;
580 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
581 gMC->Gsposp("UCFM",iplan ,"TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
582 gMC->Gsposp("UCFM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
82bbf98a 583
584 // the inner part of the carbon frame
5c7f4665 585 par_cha[0] = fCwidth[iplan-1]/2. - kCcthick;
586 par_cha[1] = fClengthM1[iplan-1]/2. - kCcthick;
82bbf98a 587 par_cha[2] = kCcframe/2.;
588 xpos = 0.;
5c7f4665 589 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1]/2.;
590 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
591 gMC->Gsposp("UCIM",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
592 gMC->Gsposp("UCIM",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
593
594 // Only for the geometry with holes
595 if (fHole) {
596
597 // the aluminum frame
598 par_cha[0] = fCwidth[iplan-1]/2.;
599 par_cha[1] = fClengthM2[iplan-1]/2.;
600 par_cha[2] = kCaframe/2.;
601 xpos = 0.;
602 ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.;
603 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
604 gMC->Gsposp("UAFM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
605
606 // the inner part of the aluminum frame
607 par_cha[0] = fCwidth[iplan-1]/2. - kCathick;
608 par_cha[1] = fClengthM2[iplan-1]/2. - kCathick;
609 par_cha[2] = kCaframe/2.;
610 xpos = 0.;
611 ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.;
612 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
613 gMC->Gsposp("UAIM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
614
615 // the carbon frame
616 par_cha[0] = fCwidth[iplan-1]/2.;
617 par_cha[1] = fClengthM2[iplan-1]/2.;
618 par_cha[2] = kCcframe/2.;
619 xpos = 0.;
620 ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.;
621 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
622 gMC->Gsposp("UCFM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
623
624 // the inner part of the carbon frame
625 par_cha[0] = fCwidth[iplan-1]/2. - kCcthick;
626 par_cha[1] = fClengthM2[iplan-1]/2. - kCcthick;
627 par_cha[2] = kCcframe/2.;
628 xpos = 0.;
629 ypos = fClengthM2[iplan-1]/2. - kSlenTR2/2.;
630 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
631 gMC->Gsposp("UCIM",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
632
633 }
82bbf98a 634
635 // The outer chambers ---------------------------------------------------------------
636
637 // the aluminum frame
82bbf98a 638 par_cha[0] = fCwidth[iplan-1]/2.;
5c7f4665 639 par_cha[1] = fClengthO1[iplan-1]/2.;
82bbf98a 640 par_cha[2] = kCaframe/2.;
641 xpos = 0.;
5c7f4665 642 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.;
82bbf98a 643 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 644 gMC->Gsposp("UAFO",iplan ,"TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
645 gMC->Gsposp("UAFO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
82bbf98a 646
647 // the inner part of the aluminum frame
5c7f4665 648 par_cha[0] = fCwidth[iplan-1]/2. - kCathick;
649 par_cha[1] = fClengthO1[iplan-1]/2. - kCathick;
82bbf98a 650 par_cha[2] = kCaframe/2.;
651 xpos = 0.;
5c7f4665 652 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.;
82bbf98a 653 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
5c7f4665 654 gMC->Gsposp("UAIO",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
655 gMC->Gsposp("UAIO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
82bbf98a 656
657 // the carbon frame
82bbf98a 658 par_cha[0] = fCwidth[iplan-1]/2.;
5c7f4665 659 par_cha[1] = fClengthO1[iplan-1]/2.;
82bbf98a 660 par_cha[2] = kCcframe/2.;
661 xpos = 0.;
5c7f4665 662 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.;
663 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
664 gMC->Gsposp("UCFO",iplan, "TRD1",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
665 gMC->Gsposp("UCFO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"MANY",par_cha,npar_cha);
82bbf98a 666
667 // the inner part of the carbon frame
5c7f4665 668 par_cha[0] = fCwidth[iplan-1]/2. - kCcthick;
669 par_cha[1] = fClengthO1[iplan-1]/2. - kCcthick;
82bbf98a 670 par_cha[2] = kCcframe/2.;
671 xpos = 0.;
5c7f4665 672 ypos = fClengthI[iplan-1]/2. + fClengthM1[iplan-1] + fClengthO1[iplan-1]/2.;
673 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
674 gMC->Gsposp("UCIO",iplan ,"TRD1",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
675 gMC->Gsposp("UCIO",iplan+ kNplan,"TRD1",xpos,-ypos,zpos,0,"ONLY",par_cha,npar_cha);
676
677 // Only for the geometry with holes
678 if (fHole) {
679
680 // the aluminum frame
681 par_cha[0] = fCwidth[iplan-1]/2.;
682 par_cha[1] = fClengthO2[iplan-1]/2.;
683 par_cha[2] = kCaframe/2.;
684 xpos = 0.;
685 ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.;
686 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
687 gMC->Gsposp("UAFO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
688
689 // the inner part of the aluminum frame
690 par_cha[0] = fCwidth[iplan-1]/2. - kCathick;
691 par_cha[1] = fClengthO2[iplan-1]/2. - kCathick;
692 par_cha[2] = kCaframe/2.;
693 xpos = 0.;
694 ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.;
695 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
696 gMC->Gsposp("UAIO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
697
698 // the carbon frame
699 par_cha[0] = fCwidth[iplan-1]/2.;
700 par_cha[1] = fClengthO2[iplan-1]/2.;
701 par_cha[2] = kCcframe/2.;
702 xpos = 0.;
703 ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.;
704 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
705 gMC->Gsposp("UCFO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
706
707 // the inner part of the carbon frame
708 par_cha[0] = fCwidth[iplan-1]/2. - kCcthick;
709 par_cha[1] = fClengthO2[iplan-1]/2. - kCcthick;
710 par_cha[2] = kCcframe/2.;
711 xpos = 0.;
712 ypos = fClengthM2[iplan-1] + fClengthO2[iplan-1]/2. - kSlenTR2/2.;
713 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
714 gMC->Gsposp("UCIO",iplan+2*kNplan,"TRD2",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
715
716 // the aluminum frame
717 par_cha[0] = fCwidth[iplan-1]/2.;
718 par_cha[1] = fClengthO3[iplan-1]/2.;
719 par_cha[2] = kCaframe/2.;
720 xpos = 0.;
721 ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.;
722 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
723 gMC->Gsposp("UAFO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
724
725 // the inner part of the aluminum frame
726 par_cha[0] = fCwidth[iplan-1]/2. - kCathick;
727 par_cha[1] = fClengthO3[iplan-1]/2. - kCathick;
728 par_cha[2] = kCaframe/2.;
729 xpos = 0.;
730 ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.;
731 zpos = kCheight - kCaframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
732 gMC->Gsposp("UAIO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
733
734 // the carbon frame
735 par_cha[0] = fCwidth[iplan-1]/2.;
736 par_cha[1] = fClengthO3[iplan-1]/2.;
737 par_cha[2] = kCcframe/2.;
738 xpos = 0.;
739 ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.;
740 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
741 gMC->Gsposp("UCFO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"MANY",par_cha,npar_cha);
742
743 // the inner part of the carbon frame
744 par_cha[0] = fCwidth[iplan-1]/2. - kCcthick;
745 par_cha[1] = fClengthO3[iplan-1]/2. - kCcthick;
746 par_cha[2] = kCcframe/2.;
747 xpos = 0.;
748 ypos = fClengthO3[iplan-1]/2. - kSlenTR3/2.;
749 zpos = kCcframe/2. - kSheight/2. + (iplan-1) * (kCheight + kCspace);
750 gMC->Gsposp("UCIO",iplan+4*kNplan,"TRD3",xpos, ypos,zpos,0,"ONLY",par_cha,npar_cha);
751
752 }
82bbf98a 753
754 }
d3f347ff 755
5c7f4665 756 if (fHole) {
757 xpos = 0.;
758 ypos = 0.;
759 zpos = 0.;
760 gMC->Gspos("TRD1",1,"BTR1",xpos,ypos,zpos,0,"ONLY");
761 gMC->Gspos("TRD2",1,"BTR2",xpos,ypos,zpos,0,"ONLY");
762 gMC->Gspos("TRD3",1,"BTR3",xpos,ypos,zpos,0,"ONLY");
763 }
764 else {
765 xpos = 0.;
766 ypos = 0.;
767 zpos = 0.;
768 gMC->Gspos("TRD1",1,"BTR1",xpos,ypos,zpos,0,"ONLY");
769 gMC->Gspos("TRD1",2,"BTR2",xpos,ypos,zpos,0,"ONLY");
770 gMC->Gspos("TRD1",3,"BTR3",xpos,ypos,zpos,0,"ONLY");
771 }
772
82bbf98a 773}
774
775//_____________________________________________________________________________
776void AliTRD::CreateMaterials()
777{
fe4da5cc 778 //
779 // Create the materials for the TRD
780 // Origin Y.Foka
781 //
782
fe4da5cc 783 Int_t ISXFLD = gAlice->Field()->Integ();
784 Float_t SXMGMX = gAlice->Field()->Max();
785
d3f347ff 786 // For polyethilene (CH2)
787 Float_t ape[2] = { 12., 1. };
788 Float_t zpe[2] = { 6., 1. };
789 Float_t wpe[2] = { 1., 2. };
790 Float_t dpe = 0.95;
791
792 // For mylar (C5H4O2)
793 Float_t amy[3] = { 12., 1., 16. };
794 Float_t zmy[3] = { 6., 1., 8. };
795 Float_t wmy[3] = { 5., 4., 2. };
fe4da5cc 796 Float_t dmy = 1.39;
d3f347ff 797
798 // For CO2
799 Float_t aco[2] = { 12., 16. };
800 Float_t zco[2] = { 6., 8. };
801 Float_t wco[2] = { 1., 2. };
802 Float_t dco = 0.001977;
803
804 // For water
805 Float_t awa[2] = { 1., 16. };
806 Float_t zwa[2] = { 1., 8. };
807 Float_t wwa[2] = { 2., 1. };
808 Float_t dwa = 1.0;
809
810 // For isobutane (C4H10)
811 Float_t ais[2] = { 12., 1. };
812 Float_t zis[2] = { 6., 1. };
813 Float_t wis[2] = { 4., 10. };
814 Float_t dis = 0.00267;
815
816 // For Xe/CO2-gas-mixture
817 // Xe-content of the Xe/CO2-mixture (90% / 10%)
818 Float_t fxc = .90;
819 // Xe-content of the Xe/Isobutane-mixture (97% / 3%)
820 Float_t fxi = .97;
fe4da5cc 821 Float_t dxe = .005858;
822
d3f347ff 823 // General tracking parameter
fe4da5cc 824 Float_t tmaxfd = -10.;
825 Float_t stemax = -1e10;
d3f347ff 826 Float_t deemax = -0.1;
827 Float_t epsil = 1e-4;
828 Float_t stmin = -0.001;
fe4da5cc 829
830 Float_t absl, radl, d, buf[1];
831 Float_t agm[2], dgm, zgm[2], wgm[2];
d3f347ff 832 Int_t nbuf;
fe4da5cc 833
d3f347ff 834 //////////////////////////////////////////////////////////////////////////
fe4da5cc 835 // Define Materials
d3f347ff 836 //////////////////////////////////////////////////////////////////////////
837
838 AliMaterial( 1, "Al $", 26.98, 13.0, 2.7 , 8.9 , 37.2);
839 AliMaterial( 2, "Air$", 14.61, 7.3, 0.001205, 30420.0 , 67500.0);
840 AliMaterial( 4, "Xe $", 131.29, 54.0, dxe , 1447.59, 0.0);
841 AliMaterial( 5, "Cu $", 63.54, 29.0, 8.96 , 1.43, 14.8);
842 AliMaterial( 6, "C $", 12.01, 6.0, 2.265 , 18.8 , 74.4);
843 AliMaterial(12, "G10$", 20.00, 10.0, 1.7 , 19.4 , 999.0);
844
845 // Mixtures
846 AliMixture(3, "Polyethilene$", ape, zpe, dpe, -2, wpe);
847 AliMixture(7, "Mylar$", amy, zmy, dmy, -3, wmy);
848 AliMixture(8, "CO2$", aco, zco, dco, -2, wco);
849 AliMixture(9, "Isobutane$", ais, zis, dis, -2, wis);
82bbf98a 850 AliMixture(13,"Water$", awa, zwa, dwa, -2, wwa);
d3f347ff 851
852 // Gas mixtures
82bbf98a 853 Char_t namate[21];
d3f347ff 854 // Xe/CO2-mixture
855 // Get properties of Xe
cfce8870 856 gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
d3f347ff 857 // Get properties of CO2
cfce8870 858 gMC->Gfmate((*fIdmate)[8], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
d3f347ff 859 // Create gas mixture
860 wgm[0] = fxc;
861 wgm[1] = 1. - fxc;
fe4da5cc 862 dgm = wgm[0] * dxe + wgm[1] * dco;
d3f347ff 863 AliMixture(10, "Gas mixture 1$", agm, zgm, dgm, 2, wgm);
864 // Xe/Isobutane-mixture
865 // Get properties of Xe
cfce8870 866 gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
d3f347ff 867 // Get properties of Isobutane
cfce8870 868 gMC->Gfmate((*fIdmate)[9], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
d3f347ff 869 // Create gas mixture
870 wgm[0] = fxi;
871 wgm[1] = 1. - fxi;
872 dgm = wgm[0] * dxe + wgm[1] * dis;
873 AliMixture(11, "Gas mixture 2$", agm, zgm, dgm, 2, wgm);
874
875 //////////////////////////////////////////////////////////////////////////
fe4da5cc 876 // Tracking Media Parameters
d3f347ff 877 //////////////////////////////////////////////////////////////////////////
878
879 // Al Frame
ad51aeb0 880 AliMedium(1, "Al Frame$", 1, 0, ISXFLD, SXMGMX
d3f347ff 881 , tmaxfd, stemax, deemax, epsil, stmin);
882 // Air
ad51aeb0 883 AliMedium(2, "Air$", 2, 0, ISXFLD, SXMGMX
d3f347ff 884 , tmaxfd, stemax, deemax, epsil, stmin);
885 // Polyethilene
ad51aeb0 886 AliMedium(3, "Radiator$", 3, 0, ISXFLD, SXMGMX
d3f347ff 887 , tmaxfd, stemax, deemax, epsil, stmin);
888 // Xe
ad51aeb0 889 AliMedium(4, "Xe$", 4, 1, ISXFLD, SXMGMX
d3f347ff 890 , tmaxfd, stemax, deemax, epsil, stmin);
891 // Cu pads
ad51aeb0 892 AliMedium(5, "Padplane$", 5, 1, ISXFLD, SXMGMX
d3f347ff 893 , tmaxfd, stemax, deemax, epsil, stmin);
894 // Fee + cables
ad51aeb0 895 AliMedium(6, "Readout$", 1, 0, ISXFLD, SXMGMX
d3f347ff 896 , tmaxfd, stemax, deemax, epsil, stmin);
897 // C frame
ad51aeb0 898 AliMedium(7, "C Frame$", 6, 0, ISXFLD, SXMGMX
d3f347ff 899 , tmaxfd, stemax, deemax, epsil, stmin);
900 // Mylar foils
ad51aeb0 901 AliMedium(8, "Mylar$", 7, 0, ISXFLD, SXMGMX
d3f347ff 902 , tmaxfd, stemax, deemax, epsil, stmin);
903 if (fGasMix == 1) {
904 // Gas-mixture (Xe/CO2)
ad51aeb0 905 AliMedium(9, "Gas-mix$", 10, 1, ISXFLD, SXMGMX
d3f347ff 906 , tmaxfd, stemax, deemax, epsil, stmin);
907 }
908 else {
909 // Gas-mixture (Xe/Isobutane)
ad51aeb0 910 AliMedium(9, "Gas-mix$", 11, 1, ISXFLD, SXMGMX
d3f347ff 911 , tmaxfd, stemax, deemax, epsil, stmin);
912 }
913 // Nomex-honeycomb (use carbon for the time being)
ad51aeb0 914 AliMedium(10, "Nomex$", 6, 0, ISXFLD, SXMGMX
d3f347ff 915 , tmaxfd, stemax, deemax, epsil, stmin);
916 // Kapton foils (use Mylar for the time being)
ad51aeb0 917 AliMedium(11, "Kapton$", 7, 0, ISXFLD, SXMGMX
d3f347ff 918 , tmaxfd, stemax, deemax, epsil, stmin);
919 // Gas-filling of the radiator
ad51aeb0 920 AliMedium(12, "CO2$", 8, 0, ISXFLD, SXMGMX
d3f347ff 921 , tmaxfd, stemax, deemax, epsil, stmin);
922 // G10-plates
ad51aeb0 923 AliMedium(13, "G10-plates$",12, 0, ISXFLD, SXMGMX
d3f347ff 924 , tmaxfd, stemax, deemax, epsil, stmin);
925 // Cooling water
ad51aeb0 926 AliMedium(14, "Water$", 13, 0, ISXFLD, SXMGMX
d3f347ff 927 , tmaxfd, stemax, deemax, epsil, stmin);
928
fe4da5cc 929}
930
82bbf98a 931//_____________________________________________________________________________
932void AliTRD::DrawModule()
933{
934 //
935 // Draw a shaded view of the Transition Radiation Detector version 0
936 //
937
938 // Set everything unseen
939 gMC->Gsatt("*" ,"SEEN",-1);
940
941 // Set ALIC mother transparent
942 gMC->Gsatt("ALIC","SEEN", 0);
943
944 // Set the volumes visible
5c7f4665 945 if (fHole) {
946 gMC->Gsatt("B071","SEEN", 0);
947 gMC->Gsatt("B074","SEEN", 0);
948 gMC->Gsatt("B075","SEEN", 0);
949 gMC->Gsatt("B077","SEEN", 0);
950 gMC->Gsatt("BTR1","SEEN", 0);
951 gMC->Gsatt("BTR2","SEEN", 0);
952 gMC->Gsatt("BTR3","SEEN", 0);
953 gMC->Gsatt("TRD1","SEEN", 0);
954 gMC->Gsatt("TRD2","SEEN", 0);
955 gMC->Gsatt("TRD3","SEEN", 0);
956 }
957 else {
958 gMC->Gsatt("B071","SEEN", 0);
959 gMC->Gsatt("B074","SEEN", 0);
960 gMC->Gsatt("B075","SEEN", 0);
961 gMC->Gsatt("B077","SEEN", 0);
962 gMC->Gsatt("BTR1","SEEN", 0);
963 gMC->Gsatt("BTR2","SEEN", 0);
964 gMC->Gsatt("BTR3","SEEN", 0);
965 gMC->Gsatt("TRD1","SEEN", 0);
966 }
82bbf98a 967 gMC->Gsatt("UCII","SEEN", 0);
968 gMC->Gsatt("UCIM","SEEN", 0);
969 gMC->Gsatt("UCIO","SEEN", 0);
970 gMC->Gsatt("UL02","SEEN", 1);
971 gMC->Gsatt("UL05","SEEN", 1);
972 gMC->Gsatt("UL06","SEEN", 1);
973
974 gMC->Gdopt("hide", "on");
975 gMC->Gdopt("shad", "on");
976 gMC->Gsatt("*", "fill", 7);
977 gMC->SetClipBox(".");
978 gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
979 gMC->DefaultRange();
980 gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
981 gMC->Gdhead(1111, "Transition Radiation Detector");
982 gMC->Gdman(18, 4, "MAN");
983
984}
985
fe4da5cc 986//_____________________________________________________________________________
987Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
988{
989 //
990 // Distance between the mouse and the TRD detector on the screen
991 // Dummy routine
82bbf98a 992
993 return 9999;
994
fe4da5cc 995}
996
997//_____________________________________________________________________________
998void AliTRD::Init()
999{
1000 //
1001 // Initialise the TRD detector after the geometry has been created
1002 //
82bbf98a 1003
5c7f4665 1004 Int_t i;
8459a454 1005 Int_t iplan;
5c7f4665 1006
1007 printf("\n");
1008 for(i=0;i<35;i++) printf("*");
1009 printf(" TRD_INIT ");
1010 for(i=0;i<35;i++) printf("*");
1011 printf("\n");
1012
fe4da5cc 1013 // Here the TRD initialisation code (if any!)
d3f347ff 1014 if (fGasMix == 1)
1015 printf(" Gas Mixture: 90%% Xe + 10%% CO2\n");
1016 else
1017 printf(" Gas Mixture: 97%% Xe + 3%% Isobutane\n");
82bbf98a 1018
5c7f4665 1019 if (fHole)
1020 printf(" Geometry with holes\n");
1021 else
1022 printf(" Full geometry\n");
1023
1024 // The default pad dimensions
1025 if (!(fRowPadSize)) fRowPadSize = 4.5;
1026 if (!(fColPadSize)) fColPadSize = 1.0;
1027 if (!(fTimeBinSize)) fTimeBinSize = 0.1;
1028
1029 // The maximum number of pads
1030 // and the position of pad 0,0,0
1031 //
1032 // chambers seen from the top:
1033 // +----------------------------+
1034 // | |
1035 // | | ^
1036 // | | rphi|
1037 // | | |
1038 // |0 | |
1039 // +----------------------------+ +------>
1040 // z
1041 // chambers seen from the side: ^
1042 // +----------------------------+ time|
1043 // | | |
1044 // |0 | |
1045 // +----------------------------+ +------>
1046 // z
1047 //
8459a454 1048 for (iplan = 0; iplan < kNplan; iplan++) {
5c7f4665 1049
1050 // The pad row (z-direction)
1051 for (Int_t isect = 0; isect < kNsect; isect++) {
1052 Float_t clengthI = fClengthI[iplan];
1053 Float_t clengthM = fClengthM1[iplan];
1054 Float_t clengthO = fClengthO1[iplan];
1055 if (fHole) {
1056 switch (isect) {
1057 case 12:
1058 case 13:
1059 case 14:
1060 case 15:
1061 case 16:
1062 clengthM = fClengthM2[iplan];
1063 clengthO = fClengthO2[iplan];
1064 break;
1065 case 4:
1066 case 5:
1067 case 6:
1068 clengthO = fClengthO3[iplan];
1069 break;
1070 };
1071 }
1072 fRowMax[iplan][0][isect] = 1 + TMath::Nint((clengthO - 2. * kCcthick)
1073 / fRowPadSize - 0.5);
1074 fRowMax[iplan][1][isect] = 1 + TMath::Nint((clengthM - 2. * kCcthick)
1075 / fRowPadSize - 0.5);
1076 fRowMax[iplan][2][isect] = 1 + TMath::Nint((clengthI - 2. * kCcthick)
1077 / fRowPadSize - 0.5);
1078 fRowMax[iplan][3][isect] = 1 + TMath::Nint((clengthM - 2. * kCcthick)
1079 / fRowPadSize - 0.5);
1080 fRowMax[iplan][4][isect] = 1 + TMath::Nint((clengthO - 2. * kCcthick)
1081 / fRowPadSize - 0.5);
1082 fRow0[iplan][0][isect] = -clengthI/2. - clengthM - clengthO + kCcthick;
1083 fRow0[iplan][1][isect] = -clengthI/2. - clengthM + kCcthick;
1084 fRow0[iplan][2][isect] = -clengthI/2. + kCcthick;
1085 fRow0[iplan][3][isect] = clengthI/2. + kCcthick;
1086 fRow0[iplan][4][isect] = clengthI/2. + clengthM + kCcthick;
1087 }
1088
1089 // The pad column (rphi-direction)
1090 fColMax[iplan] = 1 + TMath::Nint((fCwidth[iplan] - 2. * kCcthick)
1091 / fColPadSize - 0.5);
1092 fCol0[iplan] = -fCwidth[iplan]/2. + kCcthick;
1093
1094 }
1095
1096 // The time bucket
1097 fTimeMax = 1 + TMath::Nint(kDrThick / fTimeBinSize - 0.5);
94c641ff 1098 for (iplan = 0; iplan < kNplan; iplan++) {
5c7f4665 1099 fTime0[iplan] = kRmin + kCcframe/2. + kDrZpos - 0.5 * kDrThick
1100 + iplan * (kCheight + kCspace);
1101 }
1102
1103}
1104
1105//_____________________________________________________________________________
1106void AliTRD::MakeBranch(Option_t* option)
1107{
1108 //
1109 // Create Tree branches for the TRD digits and cluster.
1110 //
1111
1112 Int_t buffersize = 4000;
1113 Char_t branchname[15];
1114
1115 AliDetector::MakeBranch(option);
1116
1117 Char_t *D = strstr(option,"D");
1118 sprintf(branchname,"%s",GetName());
1119 if (fDigits && gAlice->TreeD() && D) {
1120 gAlice->TreeD()->Branch(branchname,&fDigits, buffersize);
1121 printf("* AliTRD::MakeBranch * Making Branch %s for digits in TreeD\n",branchname);
1122 }
1123
1124 sprintf(branchname,"%scluster",GetName());
1125 if (fClusters && gAlice->TreeD() && D) {
1126 gAlice->TreeD()->Branch(branchname,&fClusters,buffersize);
1127 printf("* AliTRD::MakeBranch * Making Branch %s for cluster in TreeD\n",branchname);
1128 }
1129
1130}
1131
1132//_____________________________________________________________________________
1133void AliTRD::SetTreeAddress()
1134{
1135 //
1136 // Set the branch addresses for the trees.
1137 //
1138
1139 Char_t branchname[15];
1140
1141 AliDetector::SetTreeAddress();
1142
1143 TBranch *branch;
1144 TTree *treeD = gAlice->TreeD();
1145
1146 if (treeD) {
1147 sprintf(branchname,"%scluster",GetName());
1148 if (fClusters) {
1149 branch = treeD->GetBranch(branchname);
1150 if (branch) branch->SetAddress(&fClusters);
1151 }
1152 }
1153
fe4da5cc 1154}
1155
d3f347ff 1156//_____________________________________________________________________________
b060c36f 1157void AliTRD::SetGasMix(Int_t imix)
d3f347ff 1158{
82bbf98a 1159 //
1160 // Defines the gas mixture (imix=0: Xe/Isobutane imix=1: Xe/CO2)
1161 //
1162
d3f347ff 1163 if ((imix < 0) || (imix > 1)) {
1164 printf("Wrong input value: %d\n",imix);
1165 printf("Use standard setting\n");
1166 fGasMix = 0;
1167 return;
1168 }
1169
1170 fGasMix = imix;
1171
1172}
1173
5c7f4665 1174//______________________________________________________________________________
1175void AliTRD::Streamer(TBuffer &R__b)
1176{
1177 // Stream an object of class AliTRD.
1178
1179 if (R__b.IsReading()) {
1180 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
1181 AliDetector::Streamer(R__b);
1182 R__b >> fGasMix;
1183 R__b.ReadStaticArray(fClengthI);
1184 R__b.ReadStaticArray(fClengthM1);
1185 R__b.ReadStaticArray(fClengthM2);
1186 R__b.ReadStaticArray(fClengthO1);
1187 R__b.ReadStaticArray(fClengthO2);
1188 R__b.ReadStaticArray(fClengthO3);
1189 R__b.ReadStaticArray(fCwidth);
1190 R__b.ReadStaticArray((int*)fRowMax);
1191 R__b.ReadStaticArray(fColMax);
1192 R__b >> fTimeMax;
1193 R__b.ReadStaticArray((float*)fRow0);
1194 R__b.ReadStaticArray(fCol0);
1195 R__b.ReadStaticArray(fTime0);
1196 R__b >> fRowPadSize;
1197 R__b >> fColPadSize;
1198 R__b >> fTimeBinSize;
1199 R__b >> fHole;
1200 // Stream the pointers but not the TClonesArray
1201 R__b >> fClusters; // diff
1202 //R__b >> fNclusters;
1203 } else {
1204 R__b.WriteVersion(AliTRD::IsA());
1205 AliDetector::Streamer(R__b);
1206 R__b << fGasMix;
1207 R__b.WriteArray(fClengthI, 6);
1208 R__b.WriteArray(fClengthM1, 6);
1209 R__b.WriteArray(fClengthM2, 6);
1210 R__b.WriteArray(fClengthO1, 6);
1211 R__b.WriteArray(fClengthO2, 6);
1212 R__b.WriteArray(fClengthO3, 6);
1213 R__b.WriteArray(fCwidth, 6);
1214 R__b.WriteArray((int*)fRowMax, 540);
1215 R__b.WriteArray(fColMax, 6);
1216 R__b << fTimeMax;
1217 R__b.WriteArray((float*)fRow0, 540);
1218 R__b.WriteArray(fCol0, 6);
1219 R__b.WriteArray(fTime0, 6);
1220 R__b << fRowPadSize;
1221 R__b << fColPadSize;
1222 R__b << fTimeBinSize;
1223 R__b << fHole;
1224 // Stream the pointers but not the TClonesArrays
1225 R__b << fClusters; // diff
1226 //R__b << fNclusters;
1227 }
1228
1229}
1230
fe4da5cc 1231ClassImp(AliTRDhit)
1232
1233//_____________________________________________________________________________
5c7f4665 1234AliTRDhit::AliTRDhit(Int_t shunt, Int_t track, Int_t *vol, Float_t *hits)
1235 :AliHit(shunt, track)
fe4da5cc 1236{
1237 //
1238 // Create a TRD hit
1239 //
1240
fe4da5cc 1241 // Store volume hierarchy
1242 fSector = vol[0];
1243 fChamber = vol[1];
1244 fPlane = vol[2];
82bbf98a 1245
fe4da5cc 1246 // Store position and charge
1247 fX = hits[0];
1248 fY = hits[1];
1249 fZ = hits[2];
1250 fQ = hits[3];
82bbf98a 1251
fe4da5cc 1252}
99d5402e 1253
1254ClassImp(AliTRDdigit)
1255
1256//_____________________________________________________________________________
1257AliTRDdigit::AliTRDdigit(Int_t *tracks, Int_t *digits)
1258 :AliDigit(tracks)
1259{
1260 //
1261 // Create a TRD digit
1262 //
1263
1264 // Store the volume hierarchy
1265 fSector = digits[0];
1266 fChamber = digits[1];
1267 fPlane = digits[2];
1268
1269 // Store the row, pad, and time bucket number
1270 fRow = digits[3];
1271 fCol = digits[4];
1272 fTime = digits[5];
1273
1274 // Store the signal amplitude
1275 fSignal = digits[6];
1276
1277}
5c7f4665 1278
1279ClassImp(AliTRDcluster)
1280
1281//_____________________________________________________________________________
1282AliTRDcluster::AliTRDcluster(Int_t *tracks, Int_t *cluster, Float_t* position)
1283 :TObject()
1284{
1285 //
1286 // Create a TRD cluster
1287 //
1288
1289 fSector = cluster[0];
1290 fChamber = cluster[1];
1291 fPlane = cluster[2];
1292
1293 fTimeSlice = cluster[3];
1294 fEnergy = cluster[4];
1295
1296 fX = position[0];
1297 fY = position[1];
1298 fZ = position[2];
1299
1300 fTracks[0] = tracks[0];
1301 fTracks[1] = tracks[1];
1302 fTracks[2] = tracks[2];
1303
1304}
1305