]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRD.cxx
Semicolon removed
[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
88cb7938 16/* $Id$ */
4c039060 17
fe4da5cc 18///////////////////////////////////////////////////////////////////////////////
19// //
20// Transition Radiation Detector //
21// This class contains the basic functions for the Transition Radiation //
6f1e466d 22// Detector. //
fe4da5cc 23// //
24///////////////////////////////////////////////////////////////////////////////
25
5c7f4665 26#include <stdlib.h>
a2cb5b3d 27#include <Riostream.h>
5c7f4665 28
88cb7938 29#include <TFile.h>
30#include <TGeometry.h>
31#include <TLorentzVector.h>
fe4da5cc 32#include <TMath.h>
fe4da5cc 33#include <TNode.h>
793ff80c 34#include <TPGON.h>
332e9569 35#include <TParticle.h>
88cb7938 36#include <TROOT.h>
37#include <TTree.h>
38#include <TVirtualMC.h>
39
d3f347ff 40#include "AliConst.h"
793ff80c 41#include "AliDigit.h"
88cb7938 42#include "AliLoader.h"
45160b1f 43#include "AliLog.h"
44#include "AliMC.h"
793ff80c 45#include "AliMagF.h"
88cb7938 46#include "AliRun.h"
030b4415 47#include "AliTrackReference.h"
48
793ff80c 49#include "AliTRD.h"
793ff80c 50#include "AliTRDdigit.h"
851d3db9 51#include "AliTRDdigitizer.h"
88cb7938 52#include "AliTRDdigitsManager.h"
bd0f8685 53#include "AliTRDgeometry.h"
88cb7938 54#include "AliTRDhit.h"
55#include "AliTRDpoints.h"
b864d801 56#include "AliTRDrawData.h"
3551db50 57#include "AliTRDSimParam.h"
58#include "AliTRDRecParam.h"
59#include "AliTRDCommonParam.h"
60#include "AliTRDcalibDB.h"
61
fe4da5cc 62ClassImp(AliTRD)
63
64//_____________________________________________________________________________
65AliTRD::AliTRD()
030b4415 66 :AliDetector()
67 ,fGeometry(0)
68 ,fGasDensity(0)
69 ,fFoilDensity(0)
70 ,fDrawTR(0)
71 ,fDisplayType(0)
fe4da5cc 72{
73 //
74 // Default constructor
75 //
332e9569 76
fe4da5cc 77}
78
79//_____________________________________________________________________________
80AliTRD::AliTRD(const char *name, const char *title)
030b4415 81 :AliDetector(name,title)
82 ,fGeometry(0)
83 ,fGasDensity(0)
84 ,fFoilDensity(0)
85 ,fDrawTR(0)
86 ,fDisplayType(0)
fe4da5cc 87{
88 //
89 // Standard constructor for the TRD
90 //
91
030b4415 92 // Check that FRAME is there otherwise we have no place where to put TRD
93 AliModule *frame = gAlice->GetModule("FRAME");
8230f242 94 if (!frame) {
030b4415 95 AliError("TRD needs FRAME to be present\n");
5c7f4665 96 exit(1);
97 }
98
d37eec5e 99 // Define the TRD geometry
100 if ((frame->IsVersion() == 0) ||
101 (frame->IsVersion() == 1)) {
bd0f8685 102 fGeometry = new AliTRDgeometry();
851d3db9 103 }
104 else {
030b4415 105 AliError("Could not find valid FRAME version\n");
851d3db9 106 exit(1);
107 }
5c7f4665 108
bdbb05bb 109 // Save the geometry
030b4415 110 TDirectory *saveDir = gDirectory;
bdbb05bb 111 gAlice->GetRunLoader()->CdGAFile();
112 fGeometry->Write("TRDgeometry");
113 saveDir->cd();
114
fe4da5cc 115 // Allocate the hit array
030b4415 116 fHits = new TClonesArray("AliTRDhit",405);
5d12ce38 117 gAlice->GetMCApp()->AddHitList(fHits);
99d5402e 118
fe4da5cc 119 SetMarkerColor(kWhite);
82bbf98a 120
fe4da5cc 121}
99d5402e 122
8230f242 123//_____________________________________________________________________________
030b4415 124AliTRD::AliTRD(const AliTRD &trd)
125 :AliDetector(trd)
126 ,fGeometry(trd.fGeometry)
127 ,fGasDensity(trd.fGasDensity)
128 ,fFoilDensity(trd.fFoilDensity)
129 ,fDrawTR(trd.fDrawTR)
130 ,fDisplayType(trd.fDisplayType)
8230f242 131{
132 //
133 // Copy constructor
134 //
135
8230f242 136}
137
99d5402e 138//_____________________________________________________________________________
139AliTRD::~AliTRD()
140{
141 //
142 // TRD destructor
143 //
144
abaf1f1d 145 if (fGeometry) {
146 delete fGeometry;
030b4415 147 fGeometry = 0;
abaf1f1d 148 }
030b4415 149
abaf1f1d 150 if (fHits) {
151 delete fHits;
030b4415 152 fHits = 0;
abaf1f1d 153 }
bd0f8685 154
5c7f4665 155}
156
6244debe 157//_____________________________________________________________________________
158void AliTRD::Hits2Digits()
2ab0c725 159{
160 //
161 // Create digits
162 //
bd0f8685 163
be385a87 164 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
45160b1f 165 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
88cb7938 166
6244debe 167 // Initialization
be385a87 168 digitizer.InitDetector();
6244debe 169
030b4415 170 if (!fLoader->TreeH()) {
171 fLoader->LoadHits("read");
172 }
85a5290f 173 fLoader->LoadDigits("recreate");
95867fd1 174
030b4415 175 AliRunLoader *runLoader = fLoader->GetRunLoader();
6244debe 176
85a5290f 177 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
95867fd1 178 runLoader->GetEvent(iEvent);
179 digitizer.Open(runLoader,iEvent);
be385a87 180 digitizer.MakeDigits();
181 digitizer.WriteDigits();
6244debe 182 }
183
85a5290f 184 fLoader->UnloadHits();
185 fLoader->UnloadDigits();
a328fff9 186
6244debe 187}
188
189//_____________________________________________________________________________
190void AliTRD::Hits2SDigits()
191{
192 //
193 // Create summable digits
194 //
a328fff9 195
be385a87 196 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
6244debe 197 // For the summable digits
be385a87 198 digitizer.SetSDigits(kTRUE);
45160b1f 199 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
6244debe 200
201 // Initialization
be385a87 202 digitizer.InitDetector();
2ab0c725 203
030b4415 204 if (!fLoader->TreeH()) {
205 fLoader->LoadHits("read");
206 }
85a5290f 207 fLoader->LoadSDigits("recreate");
95867fd1 208
209 AliRunLoader *runLoader = fLoader->GetRunLoader();
6244debe 210
85a5290f 211 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
95867fd1 212 runLoader->GetEvent(iEvent);
213 digitizer.Open(runLoader,iEvent);
be385a87 214 digitizer.MakeDigits();
215 digitizer.WriteDigits();
85a5290f 216 }
2ab0c725 217
85a5290f 218 fLoader->UnloadHits();
219 fLoader->UnloadSDigits();
a328fff9 220
221}
6244debe 222
85a5290f 223//_____________________________________________________________________________
95867fd1 224AliDigitizer *AliTRD::CreateDigitizer(AliRunDigitizer *manager) const
85a5290f 225{
a328fff9 226 //
227 // Creates a new digitizer object
228 //
229
85a5290f 230 return new AliTRDdigitizer(manager);
a328fff9 231
6244debe 232}
233
234//_____________________________________________________________________________
235void AliTRD::SDigits2Digits()
236{
237 //
238 // Create final digits from summable digits
239 //
240
bd0f8685 241 // Create the TRD digitizer
be385a87 242 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
45160b1f 243 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
99d5402e 244
abaf1f1d 245 // Set the parameter
be385a87 246 digitizer.SetEvent(gAlice->GetEvNumber());
abaf1f1d 247
248 // Initialization
be385a87 249 digitizer.InitDetector();
abaf1f1d 250
251 // Read the s-digits via digits manager
be385a87 252 AliTRDdigitsManager sdigitsManager;
88cb7938 253
45160b1f 254 AliLog::SetClassDebugLevel("TRDdigitisManager",AliDebugLevel());
be385a87 255 sdigitsManager.SetSDigits(kTRUE);
256 sdigitsManager.CreateArrays();
88cb7938 257
030b4415 258 if (!fLoader->TreeS()) {
259 if (fLoader->LoadSDigits("read")) {
260 return;
261 }
262 }
263 if (!fLoader->TreeS()) {
264 AliError(Form("Error while reading SDigits for event %d",gAlice->GetEvNumber()));
265 return;
266 }
88cb7938 267
be385a87 268 sdigitsManager.ReadDigits(fLoader->TreeS());
abaf1f1d 269
270 // Add the s-digits to the input list
be385a87 271 digitizer.AddSDigitsManager(&sdigitsManager);
99d5402e 272
abaf1f1d 273 // Convert the s-digits to normal digits
be385a87 274 digitizer.SDigits2Digits();
abaf1f1d 275
276 // Store the digits
030b4415 277 if (!fLoader->TreeD()) {
278 fLoader->MakeTree("D");
279 }
be385a87 280 if (digitizer.MakeBranch(fLoader->TreeD())){
281 digitizer.WriteDigits();
abaf1f1d 282 }
99d5402e 283
284}
285
b864d801 286//_____________________________________________________________________________
287void AliTRD::Digits2Raw()
288{
289 //
030b4415 290 // Convert digits of the current event to raw data
b864d801 291 //
292
293 fLoader->LoadDigits();
030b4415 294 TTree *digits = fLoader->TreeD();
b864d801 295 if (!digits) {
030b4415 296 AliError("No digits tree");
b864d801 297 return;
298 }
299
300 AliTRDrawData rawWriter;
b864d801 301 if (!rawWriter.Digits2Raw(digits)) {
030b4415 302 AliError("The raw writer could not load the digits tree");
b864d801 303 }
304
305 fLoader->UnloadDigits();
306
307}
308
fe4da5cc 309//_____________________________________________________________________________
332e9569 310void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
311 , Bool_t inDrift)
fe4da5cc 312{
313 //
314 // Add a hit for the TRD
332e9569 315 //
82bbf98a 316
a328fff9 317 TClonesArray &lhits = *fHits;
318 AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q);
030b4415 319
a328fff9 320 if (inDrift) {
321 hit->SetDrift();
332e9569 322 }
a328fff9 323 else {
324 hit->SetAmplification();
325 }
030b4415 326
a328fff9 327 if (q < 0) {
328 hit->SetTRphoton();
332e9569 329 }
82bbf98a 330
fe4da5cc 331}
332
333//_____________________________________________________________________________
334void AliTRD::BuildGeometry()
335{
336 //
337 // Create the ROOT TNode geometry for the TRD
338 //
82bbf98a 339
8230f242 340 TNode *node, *top;
fe4da5cc 341 TPGON *pgon;
793ff80c 342
030b4415 343 Float_t rmin;
344 Float_t rmax;
345 Float_t zmax1;
346 Float_t zmax2;
db30bf0f 347
348 Int_t iPlan;
793ff80c 349
fe4da5cc 350 const Int_t kColorTRD = 46;
d3f347ff 351
fe4da5cc 352 // Find the top node alice
8230f242 353 top = gAlice->GetGeometry()->GetNode("alice");
d3f347ff 354
db30bf0f 355 if (fDisplayType == 0) {
793ff80c 356
357 pgon = new TPGON("S_TRD","TRD","void",0,360,AliTRDgeometry::Nsect(),4);
358 rmin = AliTRDgeometry::Rmin();
359 rmax = AliTRDgeometry::Rmax();
360 pgon->DefineSection(0,-AliTRDgeometry::Zmax1(),rmax,rmax);
361 pgon->DefineSection(1,-AliTRDgeometry::Zmax2(),rmin,rmax);
362 pgon->DefineSection(2, AliTRDgeometry::Zmax2(),rmin,rmax);
363 pgon->DefineSection(3, AliTRDgeometry::Zmax1(),rmax,rmax);
364 top->cd();
365 node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
366 node->SetLineColor(kColorTRD);
367 fNodes->Add(node);
368
db30bf0f 369 }
370 else if (fDisplayType == 1) {
793ff80c 371
f73816f5 372 Char_t name[7];
373
793ff80c 374 Float_t slope = (AliTRDgeometry::Zmax1() - AliTRDgeometry::Zmax2())
375 / (AliTRDgeometry::Rmax() - AliTRDgeometry::Rmin());
376
332e9569 377 rmin = AliTRDgeometry::Rmin() + AliTRDgeometry::CraHght();
378 rmax = rmin + AliTRDgeometry::CdrHght();
f73816f5 379
380 Float_t thickness = rmin - AliTRDgeometry::Rmin();
381 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
793ff80c 382 zmax1 = zmax2 + slope * AliTRDgeometry::DrThick();
793ff80c 383
db30bf0f 384 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
793ff80c 385
f73816f5 386 sprintf(name,"S_TR1%d",iPlan);
387 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
388 pgon->DefineSection(0,-zmax1,rmax,rmax);
389 pgon->DefineSection(1,-zmax2,rmin,rmax);
390 pgon->DefineSection(2, zmax2,rmin,rmax);
391 pgon->DefineSection(3, zmax1,rmax,rmax);
392 top->cd();
393 node = new TNode("TRD","TRD",name,0,0,0,"");
394 node->SetLineColor(kColorTRD);
395 fNodes->Add(node);
396
397 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
398 rmin = rmin + height;
399 rmax = rmax + height;
400 zmax1 = zmax1 + slope * height;
401 zmax2 = zmax2 + slope * height;
402
403 }
404
405 thickness += AliTRDgeometry::DrThick();
030b4415 406 rmin = AliTRDgeometry::Rmin() + thickness;
407 rmax = rmin + AliTRDgeometry::AmThick();
408 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
409 zmax1 = zmax2 + slope * AliTRDgeometry::AmThick();
f73816f5 410
db30bf0f 411 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
f73816f5 412
413 sprintf(name,"S_TR2%d",iPlan);
793ff80c 414 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
415 pgon->DefineSection(0,-zmax1,rmax,rmax);
416 pgon->DefineSection(1,-zmax2,rmin,rmax);
417 pgon->DefineSection(2, zmax2,rmin,rmax);
418 pgon->DefineSection(3, zmax1,rmax,rmax);
419 top->cd();
420 node = new TNode("TRD","TRD",name,0,0,0,"");
421 node->SetLineColor(kColorTRD);
422 fNodes->Add(node);
423
424 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
425 rmin = rmin + height;
426 rmax = rmax + height;
427 zmax1 = zmax1 + slope * height;
428 zmax2 = zmax2 + slope * height;
429
430 }
431
db30bf0f 432 }
d3f347ff 433
fe4da5cc 434}
435
8230f242 436//_____________________________________________________________________________
e0d47c25 437void AliTRD::Copy(TObject &trd) const
8230f242 438{
439 //
440 // Copy function
441 //
442
793ff80c 443 ((AliTRD &) trd).fGeometry = fGeometry;
793ff80c 444 ((AliTRD &) trd).fGasDensity = fGasDensity;
445 ((AliTRD &) trd).fFoilDensity = fFoilDensity;
446 ((AliTRD &) trd).fDrawTR = fDrawTR;
447 ((AliTRD &) trd).fDisplayType = fDisplayType;
8230f242 448
8230f242 449}
450
fe4da5cc 451//_____________________________________________________________________________
82bbf98a 452void AliTRD::CreateGeometry()
fe4da5cc 453{
82bbf98a 454 //
455 // Creates the volumes for the TRD chambers
456 //
82bbf98a 457
458 // Check that FRAME is there otherwise we have no place where to put the TRD
030b4415 459 AliModule *frame = gAlice->GetModule("FRAME");
8230f242 460 if (!frame) {
45160b1f 461 AliFatal("The TRD needs the FRAME to be defined first");
82bbf98a 462 }
d3f347ff 463
851d3db9 464 fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
5c7f4665 465
82bbf98a 466}
467
468//_____________________________________________________________________________
469void AliTRD::CreateMaterials()
470{
fe4da5cc 471 //
472 // Create the materials for the TRD
fe4da5cc 473 //
474
8230f242 475 Int_t isxfld = gAlice->Field()->Integ();
476 Float_t sxmgmx = gAlice->Field()->Max();
fe4da5cc 477
d3f347ff 478 // For polyethilene (CH2)
030b4415 479 Float_t ape[2] = { 12.011 , 1.0079 };
480 Float_t zpe[2] = { 6.0 , 1.0 };
481 Float_t wpe[2] = { 1.0 , 2.0 };
482 Float_t dpe = 0.95;
d3f347ff 483
484 // For mylar (C5H4O2)
030b4415 485 Float_t amy[3] = { 12.011 , 1.0079, 15.9994 };
486 Float_t zmy[3] = { 6.0 , 1.0 , 8.0 };
487 Float_t wmy[3] = { 5.0 , 4.0 , 2.0 };
488 Float_t dmy = 1.39;
d3f347ff 489
490 // For CO2
030b4415 491 Float_t aco[2] = { 12.011 , 15.9994 };
492 Float_t zco[2] = { 6.0 , 8.0 };
493 Float_t wco[2] = { 1.0 , 2.0 };
494 Float_t dco = 0.00186;
d3f347ff 495
496 // For water
030b4415 497 Float_t awa[2] = { 1.0079, 15.9994 };
498 Float_t zwa[2] = { 1.0 , 8.0 };
499 Float_t wwa[2] = { 2.0 , 1.0 };
500 Float_t dwa = 1.0;
d3f347ff 501
502 // For isobutane (C4H10)
030b4415 503 Float_t ais[2] = { 12.011 , 1.0079 };
504 Float_t zis[2] = { 6.0 , 1.0 };
505 Float_t wis[2] = { 4.0 , 10.0 };
506 Float_t dis = 0.00267;
d3f347ff 507
db30bf0f 508 // For plexiglas (C5H8O2)
030b4415 509 Float_t apg[3] = { 12.011 , 1.0079, 15.9994 };
510 Float_t zpg[3] = { 6.0 , 1.0 , 8.0 };
511 Float_t wpg[3] = { 5.0 , 8.0 , 2.0 };
512 Float_t dpg = 1.18;
08ca3951 513
514 // For epoxy (C18H19O3)
3dac2b2d 515 Float_t aEpoxy[3] = { 15.9994, 1.0079, 12.011 };
516 Float_t zEpoxy[3] = { 8.0 , 1.0 , 6.0 };
517 Float_t wEpoxy[3] = { 3.0 , 19.0 , 18.0 };
08ca3951 518 Float_t dEpoxy = 1.8 ;
519
520 // For air
3dac2b2d 521 Float_t aAir[4] = { 12.011 , 14.0 , 15.9994 , 36.0 };
522 Float_t zAir[4] = { 6.0 , 7.0 , 8.0 , 18.0 };
523 Float_t wAir[4] = { 0.000124, 0.755267, 0.231781, 0.012827 };
08ca3951 524 Float_t dAir = 1.20479E-3;
525
526 // For G10
3dac2b2d 527 Float_t aG10[4] = { 1.0079 , 12.011 , 15.9994 , 28.086 };
528 Float_t zG10[4] = { 1.0 , 6.0 , 8.0 , 14.0 };
529 Float_t wG10[4] = { 0.15201 , 0.10641 , 0.49444 , 0.24714 };
08ca3951 530 Float_t dG10 = 1.7;
db30bf0f 531
d3f347ff 532 // For Xe/CO2-gas-mixture
3dac2b2d 533 Float_t aXeCO2[3] = { 131.29 , 12.0107 , 15.9994 };
534 Float_t zXeCO2[3] = { 54.0 , 6.0 , 8.0 };
330bfc2f 535 Float_t wXeCO2[3] = { 8.5 , 1.5 , 3.0 };
db30bf0f 536 // Xe-content of the Xe/CO2-mixture (85% / 15%)
3dac2b2d 537 Float_t fxc = 0.85;
538 Float_t dxe = 0.00549;
539 Float_t dgm = fxc * dxe + (1.0 - fxc) * dco;
fe4da5cc 540
d3f347ff 541 // General tracking parameter
030b4415 542 Float_t tmaxfd = -10.0;
543 Float_t stemax = -1.0e10;
544 Float_t deemax = -0.1;
545 Float_t epsil = 1.0e-4;
546 Float_t stmin = -0.001;
fe4da5cc 547
d3f347ff 548 //////////////////////////////////////////////////////////////////////////
fe4da5cc 549 // Define Materials
d3f347ff 550 //////////////////////////////////////////////////////////////////////////
551
16bf9884 552 AliMaterial( 1, "Al" , 26.98, 13.0, 2.7 , 8.9 , 37.2);
3dac2b2d 553 AliMaterial( 4, "Xe" , 131.29, 54.0, dxe , 1546.16, 0.0);
16bf9884 554 AliMaterial( 5, "Cu" , 63.54, 29.0, 8.96 , 1.43, 14.8);
555 AliMaterial( 6, "C" , 12.01, 6.0, 2.265 , 18.8 , 74.4);
16bf9884 556 AliMaterial(15, "Sn" , 118.71, 50.0, 7.31 , 1.21, 14.8);
557 AliMaterial(16, "Si" , 28.09, 14.0, 2.33 , 9.36, 37.2);
d3f347ff 558
559 // Mixtures
3dac2b2d 560 AliMixture(2, "Air" , aAir, zAir, dAir, 4, wAir );
561 AliMixture(3, "Polyethilene", ape, zpe, dpe, -2, wpe );
562 AliMixture(7, "Mylar", amy, zmy, dmy, -3, wmy );
563 AliMixture(8, "CO2", aco, zco, dco, -2, wco );
564 AliMixture(9, "Isobutane", ais, zis, dis, -2, wis );
330bfc2f 565 AliMixture(10,"Gas mixture", aXeCO2, zXeCO2, dgm, -3, wXeCO2);
3dac2b2d 566 AliMixture(12,"G10", aG10, zG10, dG10, 4, wG10 );
567 AliMixture(13,"Water", awa, zwa, dwa, -2, wwa );
568 AliMixture(14,"Plexiglas", apg, zpg, dpg, -3, wpg );
569 AliMixture(17,"Epoxy", aEpoxy, zEpoxy, dEpoxy, -3, wEpoxy);
570
d3f347ff 571 //////////////////////////////////////////////////////////////////////////
fe4da5cc 572 // Tracking Media Parameters
d3f347ff 573 //////////////////////////////////////////////////////////////////////////
574
575 // Al Frame
db30bf0f 576 AliMedium(1, "Al Frame", 1, 0, isxfld, sxmgmx
d3f347ff 577 , tmaxfd, stemax, deemax, epsil, stmin);
578 // Air
db30bf0f 579 AliMedium(2, "Air", 2, 0, isxfld, sxmgmx
d3f347ff 580 , tmaxfd, stemax, deemax, epsil, stmin);
581 // Polyethilene
db30bf0f 582 AliMedium(3, "Radiator", 3, 0, isxfld, sxmgmx
d3f347ff 583 , tmaxfd, stemax, deemax, epsil, stmin);
584 // Xe
db30bf0f 585 AliMedium(4, "Xe", 4, 1, isxfld, sxmgmx
d3f347ff 586 , tmaxfd, stemax, deemax, epsil, stmin);
587 // Cu pads
db30bf0f 588 AliMedium(5, "Padplane", 5, 1, isxfld, sxmgmx
d3f347ff 589 , tmaxfd, stemax, deemax, epsil, stmin);
590 // Fee + cables
330bfc2f 591 AliMedium(6, "Readout", 5, 0, isxfld, sxmgmx
d3f347ff 592 , tmaxfd, stemax, deemax, epsil, stmin);
593 // C frame
db30bf0f 594 AliMedium(7, "C Frame", 6, 0, isxfld, sxmgmx
d3f347ff 595 , tmaxfd, stemax, deemax, epsil, stmin);
596 // Mylar foils
db30bf0f 597 AliMedium(8, "Mylar", 7, 0, isxfld, sxmgmx
d3f347ff 598 , tmaxfd, stemax, deemax, epsil, stmin);
3dac2b2d 599 // Gas-mixture (Xe/CO2)
600 AliMedium(9, "Gas-mix", 10, 1, isxfld, sxmgmx
601 , tmaxfd, stemax, deemax, epsil, stmin);
d3f347ff 602 // Nomex-honeycomb (use carbon for the time being)
db30bf0f 603 AliMedium(10, "Nomex", 6, 0, isxfld, sxmgmx
d3f347ff 604 , tmaxfd, stemax, deemax, epsil, stmin);
605 // Kapton foils (use Mylar for the time being)
db30bf0f 606 AliMedium(11, "Kapton", 7, 0, isxfld, sxmgmx
d3f347ff 607 , tmaxfd, stemax, deemax, epsil, stmin);
608 // Gas-filling of the radiator
db30bf0f 609 AliMedium(12, "CO2", 8, 0, isxfld, sxmgmx
d3f347ff 610 , tmaxfd, stemax, deemax, epsil, stmin);
611 // G10-plates
db30bf0f 612 AliMedium(13, "G10-plates",12, 0, isxfld, sxmgmx
d3f347ff 613 , tmaxfd, stemax, deemax, epsil, stmin);
614 // Cooling water
db30bf0f 615 AliMedium(14, "Water", 13, 0, isxfld, sxmgmx
616 , tmaxfd, stemax, deemax, epsil, stmin);
617 // Rohacell (plexiglas) for the radiator
618 AliMedium(15, "Rohacell", 14, 0, isxfld, sxmgmx
d3f347ff 619 , tmaxfd, stemax, deemax, epsil, stmin);
16bf9884 620 // Al layer in MCMs
621 AliMedium(16, "MCM-Al" , 1, 0, isxfld, sxmgmx
622 , tmaxfd, stemax, deemax, epsil, stmin);
623 // Sn layer in MCMs
624 AliMedium(17, "MCM-Sn" , 15, 0, isxfld, sxmgmx
625 , tmaxfd, stemax, deemax, epsil, stmin);
626 // Cu layer in MCMs
627 AliMedium(18, "MCM-Cu" , 5, 0, isxfld, sxmgmx
628 , tmaxfd, stemax, deemax, epsil, stmin);
629 // G10 layer in MCMs
630 AliMedium(19, "MCM-G10" , 12, 0, isxfld, sxmgmx
631 , tmaxfd, stemax, deemax, epsil, stmin);
632 // Si in readout chips
633 AliMedium(20, "Chip-Si" , 16, 0, isxfld, sxmgmx
634 , tmaxfd, stemax, deemax, epsil, stmin);
635 // Epoxy in readout chips
636 AliMedium(21, "Chip-Ep" , 17, 0, isxfld, sxmgmx
637 , tmaxfd, stemax, deemax, epsil, stmin);
638 // PE in connectors
639 AliMedium(22, "Conn-PE" , 3, 0, isxfld, sxmgmx
640 , tmaxfd, stemax, deemax, epsil, stmin);
641 // Cu in connectors
642 AliMedium(23, "Chip-Cu" , 5, 0, isxfld, sxmgmx
643 , tmaxfd, stemax, deemax, epsil, stmin);
644 // Al of cooling pipes
645 AliMedium(24, "Cooling" , 1, 0, isxfld, sxmgmx
646 , tmaxfd, stemax, deemax, epsil, stmin);
73ae7b59 647 // Cu in services
648 AliMedium(25, "Serv-Cu" , 5, 0, isxfld, sxmgmx
649 , tmaxfd, stemax, deemax, epsil, stmin);
d3f347ff 650
793ff80c 651 // Save the density values for the TRD absorbtion
652 fFoilDensity = dmy;
3dac2b2d 653 fGasDensity = dgm;
793ff80c 654
fe4da5cc 655}
656
82bbf98a 657//_____________________________________________________________________________
ba380e33 658void AliTRD::DrawModule() const
82bbf98a 659{
660 //
661 // Draw a shaded view of the Transition Radiation Detector version 0
662 //
663
664 // Set everything unseen
665 gMC->Gsatt("*" ,"SEEN",-1);
666
667 // Set ALIC mother transparent
668 gMC->Gsatt("ALIC","SEEN", 0);
669
670 // Set the volumes visible
851d3db9 671 if (fGeometry->IsVersion() == 0) {
5c7f4665 672 gMC->Gsatt("B071","SEEN", 0);
673 gMC->Gsatt("B074","SEEN", 0);
674 gMC->Gsatt("B075","SEEN", 0);
675 gMC->Gsatt("B077","SEEN", 0);
676 gMC->Gsatt("BTR1","SEEN", 0);
677 gMC->Gsatt("BTR2","SEEN", 0);
678 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 679 gMC->Gsatt("UTR1","SEEN", 0);
680 gMC->Gsatt("UTR2","SEEN", 0);
681 gMC->Gsatt("UTR3","SEEN", 0);
5c7f4665 682 }
683 else {
684 gMC->Gsatt("B071","SEEN", 0);
685 gMC->Gsatt("B074","SEEN", 0);
686 gMC->Gsatt("B075","SEEN", 0);
687 gMC->Gsatt("B077","SEEN", 0);
688 gMC->Gsatt("BTR1","SEEN", 0);
689 gMC->Gsatt("BTR2","SEEN", 0);
690 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 691 gMC->Gsatt("UTR1","SEEN", 0);
5c7f4665 692 }
82bbf98a 693
694 gMC->Gdopt("hide", "on");
695 gMC->Gdopt("shad", "on");
696 gMC->Gsatt("*", "fill", 7);
697 gMC->SetClipBox(".");
698 gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
699 gMC->DefaultRange();
700 gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
701 gMC->Gdhead(1111, "Transition Radiation Detector");
702 gMC->Gdman(18, 4, "MAN");
703
704}
705
fe4da5cc 706//_____________________________________________________________________________
e0d47c25 707Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
fe4da5cc 708{
709 //
710 // Distance between the mouse and the TRD detector on the screen
711 // Dummy routine
030b4415 712 //
82bbf98a 713
714 return 9999;
715
fe4da5cc 716}
717
718//_____________________________________________________________________________
719void AliTRD::Init()
720{
721 //
851d3db9 722 // Initialize the TRD detector after the geometry has been created
fe4da5cc 723 //
82bbf98a 724
45160b1f 725 AliDebug(1,"++++++++++++++++++++++++++++++++++++++++++++++");
5c7f4665 726
bd0f8685 727 if (fGeometry->IsVersion() != 1) {
45160b1f 728 AliError("Not a valid geometry");
d37eec5e 729 }
9e1a0ddb 730
5c7f4665 731}
732
793ff80c 733//_____________________________________________________________________________
73ae7b59 734void AliTRD::LoadPoints(Int_t )
793ff80c 735{
736 //
737 // Store x, y, z of all hits in memory.
738 // Hit originating from TR photons are given a different color
739 //
740
030b4415 741 if (fHits == 0) {
742 return;
743 }
793ff80c 744
030b4415 745 Int_t nhits = fHits->GetEntriesFast();
746 if (nhits == 0) {
747 return;
748 }
793ff80c 749
5d12ce38 750 Int_t tracks = gAlice->GetMCApp()->GetNtrack();
030b4415 751 if (fPoints == 0) {
752 fPoints = new TObjArray(tracks);
753 }
793ff80c 754
755 AliTRDhit *ahit;
756
757 Int_t *ntrkE = new Int_t[tracks];
758 Int_t *ntrkT = new Int_t[tracks];
759 Int_t *limiE = new Int_t[tracks];
760 Int_t *limiT = new Int_t[tracks];
761 Float_t **coorE = new Float_t*[tracks];
762 Float_t **coorT = new Float_t*[tracks];
763 for(Int_t i = 0; i < tracks; i++) {
764 ntrkE[i] = 0;
765 ntrkT[i] = 0;
766 coorE[i] = 0;
767 coorT[i] = 0;
768 limiE[i] = 0;
769 limiT[i] = 0;
770 }
771
332e9569 772 AliTRDpoints *points = 0;
773 Float_t *fp = 0;
774 Int_t trk;
775 Int_t chunk = nhits / 4 + 1;
793ff80c 776
777 // Loop over all the hits and store their position
332e9569 778 ahit = (AliTRDhit *) FirstHit(-1);
779 while (ahit) {
793ff80c 780
781 // dEdx hits
332e9569 782 if (ahit->GetCharge() >= 0) {
793ff80c 783
784 trk = ahit->GetTrack();
785 if (ntrkE[trk] == limiE[trk]) {
786 // Initialise a new track
787 fp = new Float_t[3*(limiE[trk]+chunk)];
788 if (coorE[trk]) {
789 memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]);
790 delete [] coorE[trk];
791 }
792 limiE[trk] += chunk;
793 coorE[trk] = fp;
794 }
795 else {
796 fp = coorE[trk];
797 }
798 fp[3*ntrkE[trk] ] = ahit->X();
799 fp[3*ntrkE[trk]+1] = ahit->Y();
800 fp[3*ntrkE[trk]+2] = ahit->Z();
801 ntrkE[trk]++;
802
803 }
804 // TR photon hits
030b4415 805 else if ((ahit->GetCharge() < 0) &&
806 (fDrawTR)) {
793ff80c 807
808 trk = ahit->GetTrack();
809 if (ntrkT[trk] == limiT[trk]) {
810 // Initialise a new track
811 fp = new Float_t[3*(limiT[trk]+chunk)];
812 if (coorT[trk]) {
813 memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]);
814 delete [] coorT[trk];
815 }
816 limiT[trk] += chunk;
817 coorT[trk] = fp;
818 }
819 else {
820 fp = coorT[trk];
821 }
822 fp[3*ntrkT[trk] ] = ahit->X();
823 fp[3*ntrkT[trk]+1] = ahit->Y();
824 fp[3*ntrkT[trk]+2] = ahit->Z();
825 ntrkT[trk]++;
826
827 }
828
332e9569 829 ahit = (AliTRDhit *) NextHit();
830
793ff80c 831 }
832
833 for (trk = 0; trk < tracks; ++trk) {
834
835 if (ntrkE[trk] || ntrkT[trk]) {
836
837 points = new AliTRDpoints();
838 points->SetDetector(this);
839 points->SetParticle(trk);
840
841 // Set the dEdx points
842 if (ntrkE[trk]) {
843 points->SetMarkerColor(GetMarkerColor());
844 points->SetMarkerSize(GetMarkerSize());
845 points->SetPolyMarker(ntrkE[trk],coorE[trk],GetMarkerStyle());
846 delete [] coorE[trk];
847 coorE[trk] = 0;
848 }
849
850 // Set the TR photon points
851 if (ntrkT[trk]) {
852 points->SetTRpoints(ntrkT[trk],coorT[trk]);
853 delete [] coorT[trk];
854 coorT[trk] = 0;
855 }
856
857 fPoints->AddAt(points,trk);
858
859 }
860
861 }
862
863 delete [] coorE;
864 delete [] coorT;
865 delete [] ntrkE;
866 delete [] ntrkT;
867 delete [] limiE;
868 delete [] limiT;
869
870}
871
5c7f4665 872//_____________________________________________________________________________
030b4415 873void AliTRD::MakeBranch(Option_t *option)
5c7f4665 874{
875 //
abaf1f1d 876 // Create Tree branches for the TRD digits.
5c7f4665 877 //
878
abaf1f1d 879 Int_t buffersize = 4000;
880 Char_t branchname[15];
881 sprintf(branchname,"%s",GetName());
5c7f4665 882
030b4415 883 const Char_t *cD = strstr(option,"D");
aa9d00f0 884
88cb7938 885 AliDetector::MakeBranch(option);
5c7f4665 886
030b4415 887 if (fDigits &&
888 gAlice->TreeD() &&
889 cD) {
88cb7938 890 MakeBranchInTree(gAlice->TreeD(),branchname,&fDigits,buffersize,0);
030b4415 891 }
abaf1f1d 892
851d3db9 893}
894
6244debe 895//_____________________________________________________________________________
896void AliTRD::ResetDigits()
897{
898 //
abaf1f1d 899 // Reset number of digits and the digits array for this detector
6244debe 900 //
901
abaf1f1d 902 fNdigits = 0;
030b4415 903
904 if (fDigits) {
905 fDigits->Clear();
906 }
6244debe 907
908}
909
5c7f4665 910//_____________________________________________________________________________
911void AliTRD::SetTreeAddress()
912{
913 //
914 // Set the branch addresses for the trees.
915 //
916
030b4415 917 if (fLoader->TreeH() &&
918 (fHits == 0x0)) {
a328fff9 919 fHits = new TClonesArray("AliTRDhit",405);
332e9569 920 }
a328fff9 921 AliDetector::SetTreeAddress();
332e9569 922
fe4da5cc 923}
924
dd9a6ee3 925//_____________________________________________________________________________
926AliTRD &AliTRD::operator=(const AliTRD &trd)
927{
928 //
929 // Assignment operator
930 //
931
932 if (this != &trd) ((AliTRD &) trd).Copy(*this);
030b4415 933
dd9a6ee3 934 return *this;
935
f73816f5 936}
abaf1f1d 937
abaf1f1d 938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271