Typo
[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
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
138//_____________________________________________________________________________
99d5402e 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
157//_____________________________________________________________________________
6244debe 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
fe4da5cc 286//_____________________________________________________________________________
b864d801 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
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
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
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
14d71e14 651 // Special tracking options for charged particles for XeCO2
652 gMC->Gstpar((* fIdtmed)[9],"DRAY",1.0);
653 gMC->Gstpar((* fIdtmed)[9],"STRA",1.0);
654
793ff80c 655 // Save the density values for the TRD absorbtion
656 fFoilDensity = dmy;
3dac2b2d 657 fGasDensity = dgm;
793ff80c 658
fe4da5cc 659}
660
661//_____________________________________________________________________________
ba380e33 662void AliTRD::DrawModule() const
82bbf98a 663{
664 //
665 // Draw a shaded view of the Transition Radiation Detector version 0
666 //
667
668 // Set everything unseen
669 gMC->Gsatt("*" ,"SEEN",-1);
670
671 // Set ALIC mother transparent
672 gMC->Gsatt("ALIC","SEEN", 0);
673
674 // Set the volumes visible
851d3db9 675 if (fGeometry->IsVersion() == 0) {
5c7f4665 676 gMC->Gsatt("B071","SEEN", 0);
677 gMC->Gsatt("B074","SEEN", 0);
678 gMC->Gsatt("B075","SEEN", 0);
679 gMC->Gsatt("B077","SEEN", 0);
680 gMC->Gsatt("BTR1","SEEN", 0);
681 gMC->Gsatt("BTR2","SEEN", 0);
682 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 683 gMC->Gsatt("UTR1","SEEN", 0);
684 gMC->Gsatt("UTR2","SEEN", 0);
685 gMC->Gsatt("UTR3","SEEN", 0);
5c7f4665 686 }
687 else {
688 gMC->Gsatt("B071","SEEN", 0);
689 gMC->Gsatt("B074","SEEN", 0);
690 gMC->Gsatt("B075","SEEN", 0);
691 gMC->Gsatt("B077","SEEN", 0);
692 gMC->Gsatt("BTR1","SEEN", 0);
693 gMC->Gsatt("BTR2","SEEN", 0);
694 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 695 gMC->Gsatt("UTR1","SEEN", 0);
5c7f4665 696 }
82bbf98a 697
698 gMC->Gdopt("hide", "on");
699 gMC->Gdopt("shad", "on");
700 gMC->Gsatt("*", "fill", 7);
701 gMC->SetClipBox(".");
702 gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
703 gMC->DefaultRange();
704 gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
705 gMC->Gdhead(1111, "Transition Radiation Detector");
706 gMC->Gdman(18, 4, "MAN");
707
708}
709
710//_____________________________________________________________________________
e0d47c25 711Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
fe4da5cc 712{
713 //
714 // Distance between the mouse and the TRD detector on the screen
715 // Dummy routine
030b4415 716 //
82bbf98a 717
718 return 9999;
719
fe4da5cc 720}
721
722//_____________________________________________________________________________
723void AliTRD::Init()
724{
725 //
851d3db9 726 // Initialize the TRD detector after the geometry has been created
fe4da5cc 727 //
82bbf98a 728
45160b1f 729 AliDebug(1,"++++++++++++++++++++++++++++++++++++++++++++++");
5c7f4665 730
bd0f8685 731 if (fGeometry->IsVersion() != 1) {
45160b1f 732 AliError("Not a valid geometry");
d37eec5e 733 }
9e1a0ddb 734
5c7f4665 735}
736
737//_____________________________________________________________________________
73ae7b59 738void AliTRD::LoadPoints(Int_t )
793ff80c 739{
740 //
741 // Store x, y, z of all hits in memory.
742 // Hit originating from TR photons are given a different color
743 //
744
030b4415 745 if (fHits == 0) {
746 return;
747 }
793ff80c 748
030b4415 749 Int_t nhits = fHits->GetEntriesFast();
750 if (nhits == 0) {
751 return;
752 }
793ff80c 753
5d12ce38 754 Int_t tracks = gAlice->GetMCApp()->GetNtrack();
030b4415 755 if (fPoints == 0) {
756 fPoints = new TObjArray(tracks);
757 }
793ff80c 758
759 AliTRDhit *ahit;
760
761 Int_t *ntrkE = new Int_t[tracks];
762 Int_t *ntrkT = new Int_t[tracks];
763 Int_t *limiE = new Int_t[tracks];
764 Int_t *limiT = new Int_t[tracks];
765 Float_t **coorE = new Float_t*[tracks];
766 Float_t **coorT = new Float_t*[tracks];
767 for(Int_t i = 0; i < tracks; i++) {
768 ntrkE[i] = 0;
769 ntrkT[i] = 0;
770 coorE[i] = 0;
771 coorT[i] = 0;
772 limiE[i] = 0;
773 limiT[i] = 0;
774 }
775
332e9569 776 AliTRDpoints *points = 0;
777 Float_t *fp = 0;
778 Int_t trk;
779 Int_t chunk = nhits / 4 + 1;
793ff80c 780
781 // Loop over all the hits and store their position
332e9569 782 ahit = (AliTRDhit *) FirstHit(-1);
783 while (ahit) {
793ff80c 784
785 // dEdx hits
332e9569 786 if (ahit->GetCharge() >= 0) {
793ff80c 787
788 trk = ahit->GetTrack();
789 if (ntrkE[trk] == limiE[trk]) {
790 // Initialise a new track
791 fp = new Float_t[3*(limiE[trk]+chunk)];
792 if (coorE[trk]) {
793 memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]);
794 delete [] coorE[trk];
795 }
796 limiE[trk] += chunk;
797 coorE[trk] = fp;
798 }
799 else {
800 fp = coorE[trk];
801 }
802 fp[3*ntrkE[trk] ] = ahit->X();
803 fp[3*ntrkE[trk]+1] = ahit->Y();
804 fp[3*ntrkE[trk]+2] = ahit->Z();
805 ntrkE[trk]++;
806
807 }
808 // TR photon hits
030b4415 809 else if ((ahit->GetCharge() < 0) &&
810 (fDrawTR)) {
793ff80c 811
812 trk = ahit->GetTrack();
813 if (ntrkT[trk] == limiT[trk]) {
814 // Initialise a new track
815 fp = new Float_t[3*(limiT[trk]+chunk)];
816 if (coorT[trk]) {
817 memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]);
818 delete [] coorT[trk];
819 }
820 limiT[trk] += chunk;
821 coorT[trk] = fp;
822 }
823 else {
824 fp = coorT[trk];
825 }
826 fp[3*ntrkT[trk] ] = ahit->X();
827 fp[3*ntrkT[trk]+1] = ahit->Y();
828 fp[3*ntrkT[trk]+2] = ahit->Z();
829 ntrkT[trk]++;
830
831 }
832
332e9569 833 ahit = (AliTRDhit *) NextHit();
834
793ff80c 835 }
836
837 for (trk = 0; trk < tracks; ++trk) {
838
839 if (ntrkE[trk] || ntrkT[trk]) {
840
841 points = new AliTRDpoints();
842 points->SetDetector(this);
843 points->SetParticle(trk);
844
845 // Set the dEdx points
846 if (ntrkE[trk]) {
847 points->SetMarkerColor(GetMarkerColor());
848 points->SetMarkerSize(GetMarkerSize());
849 points->SetPolyMarker(ntrkE[trk],coorE[trk],GetMarkerStyle());
850 delete [] coorE[trk];
851 coorE[trk] = 0;
852 }
853
854 // Set the TR photon points
855 if (ntrkT[trk]) {
856 points->SetTRpoints(ntrkT[trk],coorT[trk]);
857 delete [] coorT[trk];
858 coorT[trk] = 0;
859 }
860
861 fPoints->AddAt(points,trk);
862
863 }
864
865 }
866
867 delete [] coorE;
868 delete [] coorT;
869 delete [] ntrkE;
870 delete [] ntrkT;
871 delete [] limiE;
872 delete [] limiT;
873
874}
875
876//_____________________________________________________________________________
030b4415 877void AliTRD::MakeBranch(Option_t *option)
5c7f4665 878{
879 //
abaf1f1d 880 // Create Tree branches for the TRD digits.
5c7f4665 881 //
882
abaf1f1d 883 Int_t buffersize = 4000;
884 Char_t branchname[15];
885 sprintf(branchname,"%s",GetName());
5c7f4665 886
030b4415 887 const Char_t *cD = strstr(option,"D");
aa9d00f0 888
88cb7938 889 AliDetector::MakeBranch(option);
5c7f4665 890
030b4415 891 if (fDigits &&
892 gAlice->TreeD() &&
893 cD) {
88cb7938 894 MakeBranchInTree(gAlice->TreeD(),branchname,&fDigits,buffersize,0);
030b4415 895 }
abaf1f1d 896
851d3db9 897}
898
899//_____________________________________________________________________________
6244debe 900void AliTRD::ResetDigits()
901{
902 //
abaf1f1d 903 // Reset number of digits and the digits array for this detector
6244debe 904 //
905
abaf1f1d 906 fNdigits = 0;
030b4415 907
908 if (fDigits) {
909 fDigits->Clear();
910 }
6244debe 911
912}
913
914//_____________________________________________________________________________
5c7f4665 915void AliTRD::SetTreeAddress()
916{
917 //
918 // Set the branch addresses for the trees.
919 //
920
030b4415 921 if (fLoader->TreeH() &&
922 (fHits == 0x0)) {
a328fff9 923 fHits = new TClonesArray("AliTRDhit",405);
332e9569 924 }
a328fff9 925 AliDetector::SetTreeAddress();
332e9569 926
fe4da5cc 927}
928
d3f347ff 929//_____________________________________________________________________________
dd9a6ee3 930AliTRD &AliTRD::operator=(const AliTRD &trd)
931{
932 //
933 // Assignment operator
934 //
935
936 if (this != &trd) ((AliTRD &) trd).Copy(*this);
030b4415 937
dd9a6ee3 938 return *this;
939
f73816f5 940}
abaf1f1d 941
abaf1f1d 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
1272
1273
1274
1275