EffC++ warning corrected.
[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"
793ff80c 47#include "AliTRD.h"
793ff80c 48#include "AliTRDdigit.h"
851d3db9 49#include "AliTRDdigitizer.h"
88cb7938 50#include "AliTRDdigitsManager.h"
bd0f8685 51#include "AliTRDgeometry.h"
88cb7938 52#include "AliTRDhit.h"
53#include "AliTRDpoints.h"
b864d801 54#include "AliTRDrawData.h"
88cb7938 55#include "AliTrackReference.h"
793ff80c 56
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()
66{
67 //
68 // Default constructor
69 //
82bbf98a 70
6244debe 71 fIshunt = 0;
6244debe 72 fHits = 0;
73 fDigits = 0;
5c7f4665 74
6244debe 75 fGeometry = 0;
82bbf98a 76
6244debe 77 fGasDensity = 0;
78 fFoilDensity = 0;
793ff80c 79
6244debe 80 fDrawTR = 0;
332e9569 81 fDisplayType = 0;
82
fe4da5cc 83}
84
85//_____________________________________________________________________________
86AliTRD::AliTRD(const char *name, const char *title)
87 : AliDetector(name,title)
88{
89 //
90 // Standard constructor for the TRD
91 //
92
5c7f4665 93 // Check that FRAME is there otherwise we have no place where to
94 // put TRD
8230f242 95 AliModule* frame = gAlice->GetModule("FRAME");
96 if (!frame) {
5c7f4665 97 Error("Ctor","TRD needs FRAME to be present\n");
98 exit(1);
99 }
100
d37eec5e 101 // Define the TRD geometry
102 if ((frame->IsVersion() == 0) ||
103 (frame->IsVersion() == 1)) {
bd0f8685 104 fGeometry = new AliTRDgeometry();
851d3db9 105 }
106 else {
107 Error("Ctor","Could not find valid FRAME version\n");
108 exit(1);
109 }
5c7f4665 110
bdbb05bb 111 // Save the geometry
112 TDirectory* saveDir = gDirectory;
113 gAlice->GetRunLoader()->CdGAFile();
114 fGeometry->Write("TRDgeometry");
115 saveDir->cd();
116
fe4da5cc 117 // Allocate the hit array
3dac2b2d 118 fHits = new TClonesArray("AliTRDhit" ,405);
5d12ce38 119 gAlice->GetMCApp()->AddHitList(fHits);
99d5402e 120
121 // Allocate the digits array
3dac2b2d 122 fDigits = 0;
5c7f4665 123
6244debe 124 fIshunt = 0;
793ff80c 125
6244debe 126 fGasDensity = 0;
127 fFoilDensity = 0;
793ff80c 128
6244debe 129 fDrawTR = 0;
130 fDisplayType = 0;
131
fe4da5cc 132 SetMarkerColor(kWhite);
82bbf98a 133
fe4da5cc 134}
99d5402e 135
136//_____________________________________________________________________________
73ae7b59 137AliTRD::AliTRD(const AliTRD &trd):AliDetector(trd)
8230f242 138{
139 //
140 // Copy constructor
141 //
142
dd9a6ee3 143 ((AliTRD &) trd).Copy(*this);
8230f242 144
145}
146
147//_____________________________________________________________________________
99d5402e 148AliTRD::~AliTRD()
149{
150 //
151 // TRD destructor
152 //
153
154 fIshunt = 0;
155
abaf1f1d 156 if (fGeometry) {
157 delete fGeometry;
332e9569 158 fGeometry = 0;
abaf1f1d 159 }
160 if (fHits) {
161 delete fHits;
332e9569 162 fHits = 0;
abaf1f1d 163 }
bd0f8685 164
5c7f4665 165}
166
167//_____________________________________________________________________________
6244debe 168void AliTRD::Hits2Digits()
2ab0c725 169{
170 //
171 // Create digits
172 //
bd0f8685 173
be385a87 174 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
45160b1f 175 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
88cb7938 176
6244debe 177 // Initialization
be385a87 178 digitizer.InitDetector();
6244debe 179
85a5290f 180 if (!fLoader->TreeH()) fLoader->LoadHits("read");
181 fLoader->LoadDigits("recreate");
182 AliRunLoader* runLoader = fLoader->GetRunLoader();
6244debe 183
85a5290f 184 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
be385a87 185 digitizer.Open(runLoader->GetFileName().Data(), iEvent);
186 digitizer.MakeDigits();
187 digitizer.WriteDigits();
6244debe 188 }
189
85a5290f 190 fLoader->UnloadHits();
191 fLoader->UnloadDigits();
a328fff9 192
6244debe 193}
194
195//_____________________________________________________________________________
196void AliTRD::Hits2SDigits()
197{
198 //
199 // Create summable digits
200 //
a328fff9 201
be385a87 202 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
6244debe 203 // For the summable digits
be385a87 204 digitizer.SetSDigits(kTRUE);
45160b1f 205 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
6244debe 206
207 // Initialization
be385a87 208 digitizer.InitDetector();
2ab0c725 209
85a5290f 210 if (!fLoader->TreeH()) fLoader->LoadHits("read");
211 fLoader->LoadSDigits("recreate");
212 AliRunLoader* runLoader = fLoader->GetRunLoader();
6244debe 213
85a5290f 214 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
be385a87 215 digitizer.Open(runLoader->GetFileName().Data(), iEvent);
216 digitizer.MakeDigits();
217 digitizer.WriteDigits();
85a5290f 218 }
2ab0c725 219
85a5290f 220 fLoader->UnloadHits();
221 fLoader->UnloadSDigits();
a328fff9 222
223}
6244debe 224
85a5290f 225//_____________________________________________________________________________
c92eb8ad 226AliDigitizer* AliTRD::CreateDigitizer(AliRunDigitizer* manager) const
85a5290f 227{
a328fff9 228 //
229 // Creates a new digitizer object
230 //
231
85a5290f 232 return new AliTRDdigitizer(manager);
a328fff9 233
6244debe 234}
235
236//_____________________________________________________________________________
237void AliTRD::SDigits2Digits()
238{
239 //
240 // Create final digits from summable digits
241 //
242
bd0f8685 243 // Create the TRD digitizer
be385a87 244 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
45160b1f 245 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
99d5402e 246
abaf1f1d 247 // Set the parameter
be385a87 248 digitizer.SetEvent(gAlice->GetEvNumber());
abaf1f1d 249
250 // Initialization
be385a87 251 digitizer.InitDetector();
abaf1f1d 252
253 // Read the s-digits via digits manager
be385a87 254 AliTRDdigitsManager sdigitsManager;
88cb7938 255
45160b1f 256 AliLog::SetClassDebugLevel("TRDdigitisManager",AliDebugLevel());
be385a87 257 sdigitsManager.SetSDigits(kTRUE);
258 sdigitsManager.CreateArrays();
88cb7938 259
260 if (!fLoader->TreeS())
261 if (fLoader->LoadSDigits("read"))
262 {
263 Error("SDigits2Digits","Error while reading SDigits for event %d",gAlice->GetEvNumber());
264 return;
265 }
266 if (!fLoader->TreeS()) return;
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
88cb7938 277 if (!fLoader->TreeD()) fLoader->MakeTree("D");
be385a87 278 if (digitizer.MakeBranch(fLoader->TreeD())){
279 digitizer.WriteDigits();
abaf1f1d 280 }
99d5402e 281
282}
283
fe4da5cc 284//_____________________________________________________________________________
b864d801 285void AliTRD::Digits2Raw()
286{
287 //
288 // convert digits of the current event to raw data
289 //
290
291 fLoader->LoadDigits();
292 TTree* digits = fLoader->TreeD();
293 if (!digits) {
294 Error("Digits2Raw", "no digits tree");
295 return;
296 }
297
298 AliTRDrawData rawWriter;
bd0f8685 299 // rawWriter.SetDebug(2);
b864d801 300 if (!rawWriter.Digits2Raw(digits)) {
301 Error("AliTRD::Digits2Raw","The raw writer could not load the digits tree");
302 }
303
304 fLoader->UnloadDigits();
305
306}
307
308//_____________________________________________________________________________
332e9569 309void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
310 , Bool_t inDrift)
fe4da5cc 311{
312 //
313 // Add a hit for the TRD
332e9569 314 //
82bbf98a 315
a328fff9 316 TClonesArray &lhits = *fHits;
317 AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q);
318 if (inDrift) {
319 hit->SetDrift();
332e9569 320 }
a328fff9 321 else {
322 hit->SetAmplification();
323 }
324 if (q < 0) {
325 hit->SetTRphoton();
332e9569 326 }
82bbf98a 327
fe4da5cc 328}
329
330//_____________________________________________________________________________
331void AliTRD::BuildGeometry()
332{
333 //
334 // Create the ROOT TNode geometry for the TRD
335 //
82bbf98a 336
8230f242 337 TNode *node, *top;
fe4da5cc 338 TPGON *pgon;
793ff80c 339
340 Float_t rmin, rmax;
341 Float_t zmax1, zmax2;
db30bf0f 342
343 Int_t iPlan;
793ff80c 344
fe4da5cc 345 const Int_t kColorTRD = 46;
d3f347ff 346
fe4da5cc 347 // Find the top node alice
8230f242 348 top = gAlice->GetGeometry()->GetNode("alice");
d3f347ff 349
db30bf0f 350 if (fDisplayType == 0) {
793ff80c 351
352 pgon = new TPGON("S_TRD","TRD","void",0,360,AliTRDgeometry::Nsect(),4);
353 rmin = AliTRDgeometry::Rmin();
354 rmax = AliTRDgeometry::Rmax();
355 pgon->DefineSection(0,-AliTRDgeometry::Zmax1(),rmax,rmax);
356 pgon->DefineSection(1,-AliTRDgeometry::Zmax2(),rmin,rmax);
357 pgon->DefineSection(2, AliTRDgeometry::Zmax2(),rmin,rmax);
358 pgon->DefineSection(3, AliTRDgeometry::Zmax1(),rmax,rmax);
359 top->cd();
360 node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
361 node->SetLineColor(kColorTRD);
362 fNodes->Add(node);
363
db30bf0f 364 }
365 else if (fDisplayType == 1) {
793ff80c 366
f73816f5 367 Char_t name[7];
368
793ff80c 369 Float_t slope = (AliTRDgeometry::Zmax1() - AliTRDgeometry::Zmax2())
370 / (AliTRDgeometry::Rmax() - AliTRDgeometry::Rmin());
371
332e9569 372 rmin = AliTRDgeometry::Rmin() + AliTRDgeometry::CraHght();
373 rmax = rmin + AliTRDgeometry::CdrHght();
f73816f5 374
375 Float_t thickness = rmin - AliTRDgeometry::Rmin();
376 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
793ff80c 377 zmax1 = zmax2 + slope * AliTRDgeometry::DrThick();
793ff80c 378
db30bf0f 379 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
793ff80c 380
f73816f5 381 sprintf(name,"S_TR1%d",iPlan);
382 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
383 pgon->DefineSection(0,-zmax1,rmax,rmax);
384 pgon->DefineSection(1,-zmax2,rmin,rmax);
385 pgon->DefineSection(2, zmax2,rmin,rmax);
386 pgon->DefineSection(3, zmax1,rmax,rmax);
387 top->cd();
388 node = new TNode("TRD","TRD",name,0,0,0,"");
389 node->SetLineColor(kColorTRD);
390 fNodes->Add(node);
391
392 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
393 rmin = rmin + height;
394 rmax = rmax + height;
395 zmax1 = zmax1 + slope * height;
396 zmax2 = zmax2 + slope * height;
397
398 }
399
400 thickness += AliTRDgeometry::DrThick();
401 rmin = AliTRDgeometry::Rmin() + thickness;
402 rmax = rmin + AliTRDgeometry::AmThick();
403 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
404 zmax1 = zmax2 + slope * AliTRDgeometry::AmThick();
405
db30bf0f 406 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
f73816f5 407
408 sprintf(name,"S_TR2%d",iPlan);
793ff80c 409 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
410 pgon->DefineSection(0,-zmax1,rmax,rmax);
411 pgon->DefineSection(1,-zmax2,rmin,rmax);
412 pgon->DefineSection(2, zmax2,rmin,rmax);
413 pgon->DefineSection(3, zmax1,rmax,rmax);
414 top->cd();
415 node = new TNode("TRD","TRD",name,0,0,0,"");
416 node->SetLineColor(kColorTRD);
417 fNodes->Add(node);
418
419 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
420 rmin = rmin + height;
421 rmax = rmax + height;
422 zmax1 = zmax1 + slope * height;
423 zmax2 = zmax2 + slope * height;
424
425 }
426
db30bf0f 427 }
d3f347ff 428
fe4da5cc 429}
430
431//_____________________________________________________________________________
e0d47c25 432void AliTRD::Copy(TObject &trd) const
8230f242 433{
434 //
435 // Copy function
436 //
437
793ff80c 438 ((AliTRD &) trd).fGeometry = fGeometry;
793ff80c 439 ((AliTRD &) trd).fGasDensity = fGasDensity;
440 ((AliTRD &) trd).fFoilDensity = fFoilDensity;
441 ((AliTRD &) trd).fDrawTR = fDrawTR;
442 ((AliTRD &) trd).fDisplayType = fDisplayType;
8230f242 443
444 //AliDetector::Copy(trd);
445
446}
447
448//_____________________________________________________________________________
82bbf98a 449void AliTRD::CreateGeometry()
fe4da5cc 450{
82bbf98a 451 //
452 // Creates the volumes for the TRD chambers
453 //
82bbf98a 454
455 // Check that FRAME is there otherwise we have no place where to put the TRD
8230f242 456 AliModule* frame = gAlice->GetModule("FRAME");
457 if (!frame) {
45160b1f 458 AliFatal("The TRD needs the FRAME to be defined first");
82bbf98a 459 }
d3f347ff 460
851d3db9 461 fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
5c7f4665 462
82bbf98a 463}
464
465//_____________________________________________________________________________
466void AliTRD::CreateMaterials()
467{
fe4da5cc 468 //
469 // Create the materials for the TRD
fe4da5cc 470 //
471
8230f242 472 Int_t isxfld = gAlice->Field()->Integ();
473 Float_t sxmgmx = gAlice->Field()->Max();
fe4da5cc 474
d3f347ff 475 // For polyethilene (CH2)
3dac2b2d 476 Float_t ape[2] = { 12.011 , 1.0079 };
477 Float_t zpe[2] = { 6.0 , 1.0 };
478 Float_t wpe[2] = { 1.0 , 2.0 };
d3f347ff 479 Float_t dpe = 0.95;
480
481 // For mylar (C5H4O2)
3dac2b2d 482 Float_t amy[3] = { 12.011 , 1.0079, 15.9994 };
483 Float_t zmy[3] = { 6.0 , 1.0 , 8.0 };
484 Float_t wmy[3] = { 5.0 , 4.0 , 2.0 };
fe4da5cc 485 Float_t dmy = 1.39;
d3f347ff 486
487 // For CO2
3dac2b2d 488 Float_t aco[2] = { 12.011 , 15.9994 };
489 Float_t zco[2] = { 6.0 , 8.0 };
490 Float_t wco[2] = { 1.0 , 2.0 };
513bdaf8 491 Float_t dco = 0.00186;
d3f347ff 492
493 // For water
3dac2b2d 494 Float_t awa[2] = { 1.0079, 15.9994 };
495 Float_t zwa[2] = { 1.0 , 8.0 };
496 Float_t wwa[2] = { 2.0 , 1.0 };
d3f347ff 497 Float_t dwa = 1.0;
498
499 // For isobutane (C4H10)
3dac2b2d 500 Float_t ais[2] = { 12.011 , 1.0079 };
501 Float_t zis[2] = { 6.0 , 1.0 };
502 Float_t wis[2] = { 4.0 , 10.0 };
d3f347ff 503 Float_t dis = 0.00267;
504
db30bf0f 505 // For plexiglas (C5H8O2)
3dac2b2d 506 Float_t apg[3] = { 12.011 , 1.0079, 15.9994 };
507 Float_t zpg[3] = { 6.0 , 1.0 , 8.0 };
508 Float_t wpg[3] = { 5.0 , 8.0 , 2.0 };
db30bf0f 509 Float_t dpg = 1.18;
08ca3951 510
511 // For epoxy (C18H19O3)
3dac2b2d 512 Float_t aEpoxy[3] = { 15.9994, 1.0079, 12.011 };
513 Float_t zEpoxy[3] = { 8.0 , 1.0 , 6.0 };
514 Float_t wEpoxy[3] = { 3.0 , 19.0 , 18.0 };
08ca3951 515 Float_t dEpoxy = 1.8 ;
516
517 // For air
3dac2b2d 518 Float_t aAir[4] = { 12.011 , 14.0 , 15.9994 , 36.0 };
519 Float_t zAir[4] = { 6.0 , 7.0 , 8.0 , 18.0 };
520 Float_t wAir[4] = { 0.000124, 0.755267, 0.231781, 0.012827 };
08ca3951 521 Float_t dAir = 1.20479E-3;
522
523 // For G10
3dac2b2d 524 Float_t aG10[4] = { 1.0079 , 12.011 , 15.9994 , 28.086 };
525 Float_t zG10[4] = { 1.0 , 6.0 , 8.0 , 14.0 };
526 Float_t wG10[4] = { 0.15201 , 0.10641 , 0.49444 , 0.24714 };
08ca3951 527 Float_t dG10 = 1.7;
db30bf0f 528
d3f347ff 529 // For Xe/CO2-gas-mixture
3dac2b2d 530 Float_t aXeCO2[3] = { 131.29 , 12.0107 , 15.9994 };
531 Float_t zXeCO2[3] = { 54.0 , 6.0 , 8.0 };
330bfc2f 532 // Move to number of atoms
533 Float_t wXeCO2[3] = { 8.5 , 1.5 , 3.0 };
534 //Float_t wXeCO2[3] = { 0.85 , 0.0375 , 0.1125 };
db30bf0f 535 // Xe-content of the Xe/CO2-mixture (85% / 15%)
3dac2b2d 536 Float_t fxc = 0.85;
537 Float_t dxe = 0.00549;
538 Float_t dgm = fxc * dxe + (1.0 - fxc) * dco;
fe4da5cc 539
d3f347ff 540 // General tracking parameter
fe4da5cc 541 Float_t tmaxfd = -10.;
542 Float_t stemax = -1e10;
d3f347ff 543 Float_t deemax = -0.1;
544 Float_t epsil = 1e-4;
545 Float_t stmin = -0.001;
fe4da5cc 546
d3f347ff 547 //////////////////////////////////////////////////////////////////////////
fe4da5cc 548 // Define Materials
d3f347ff 549 //////////////////////////////////////////////////////////////////////////
550
16bf9884 551 AliMaterial( 1, "Al" , 26.98, 13.0, 2.7 , 8.9 , 37.2);
3dac2b2d 552 AliMaterial( 4, "Xe" , 131.29, 54.0, dxe , 1546.16, 0.0);
16bf9884 553 AliMaterial( 5, "Cu" , 63.54, 29.0, 8.96 , 1.43, 14.8);
554 AliMaterial( 6, "C" , 12.01, 6.0, 2.265 , 18.8 , 74.4);
16bf9884 555 AliMaterial(15, "Sn" , 118.71, 50.0, 7.31 , 1.21, 14.8);
556 AliMaterial(16, "Si" , 28.09, 14.0, 2.33 , 9.36, 37.2);
d3f347ff 557
558 // Mixtures
3dac2b2d 559 AliMixture(2, "Air" , aAir, zAir, dAir, 4, wAir );
560 AliMixture(3, "Polyethilene", ape, zpe, dpe, -2, wpe );
561 AliMixture(7, "Mylar", amy, zmy, dmy, -3, wmy );
562 AliMixture(8, "CO2", aco, zco, dco, -2, wco );
563 AliMixture(9, "Isobutane", ais, zis, dis, -2, wis );
330bfc2f 564 // Move to number of atoms
565 AliMixture(10,"Gas mixture", aXeCO2, zXeCO2, dgm, -3, wXeCO2);
566 //AliMixture(10,"Gas mixture", aXeCO2, zXeCO2, dgm, 3, wXeCO2);
3dac2b2d 567 AliMixture(12,"G10", aG10, zG10, dG10, 4, wG10 );
568 AliMixture(13,"Water", awa, zwa, dwa, -2, wwa );
569 AliMixture(14,"Plexiglas", apg, zpg, dpg, -3, wpg );
570 AliMixture(17,"Epoxy", aEpoxy, zEpoxy, dEpoxy, -3, wEpoxy);
571
d3f347ff 572 //////////////////////////////////////////////////////////////////////////
fe4da5cc 573 // Tracking Media Parameters
d3f347ff 574 //////////////////////////////////////////////////////////////////////////
575
576 // Al Frame
db30bf0f 577 AliMedium(1, "Al Frame", 1, 0, isxfld, sxmgmx
d3f347ff 578 , tmaxfd, stemax, deemax, epsil, stmin);
579 // Air
db30bf0f 580 AliMedium(2, "Air", 2, 0, isxfld, sxmgmx
d3f347ff 581 , tmaxfd, stemax, deemax, epsil, stmin);
582 // Polyethilene
db30bf0f 583 AliMedium(3, "Radiator", 3, 0, isxfld, sxmgmx
d3f347ff 584 , tmaxfd, stemax, deemax, epsil, stmin);
585 // Xe
db30bf0f 586 AliMedium(4, "Xe", 4, 1, isxfld, sxmgmx
d3f347ff 587 , tmaxfd, stemax, deemax, epsil, stmin);
588 // Cu pads
db30bf0f 589 AliMedium(5, "Padplane", 5, 1, isxfld, sxmgmx
d3f347ff 590 , tmaxfd, stemax, deemax, epsil, stmin);
591 // Fee + cables
330bfc2f 592 AliMedium(6, "Readout", 5, 0, isxfld, sxmgmx
d3f347ff 593 , tmaxfd, stemax, deemax, epsil, stmin);
594 // C frame
db30bf0f 595 AliMedium(7, "C Frame", 6, 0, isxfld, sxmgmx
d3f347ff 596 , tmaxfd, stemax, deemax, epsil, stmin);
597 // Mylar foils
db30bf0f 598 AliMedium(8, "Mylar", 7, 0, isxfld, sxmgmx
d3f347ff 599 , tmaxfd, stemax, deemax, epsil, stmin);
3dac2b2d 600 // Gas-mixture (Xe/CO2)
601 AliMedium(9, "Gas-mix", 10, 1, isxfld, sxmgmx
602 , tmaxfd, stemax, deemax, epsil, stmin);
d3f347ff 603 // Nomex-honeycomb (use carbon for the time being)
db30bf0f 604 AliMedium(10, "Nomex", 6, 0, isxfld, sxmgmx
d3f347ff 605 , tmaxfd, stemax, deemax, epsil, stmin);
606 // Kapton foils (use Mylar for the time being)
db30bf0f 607 AliMedium(11, "Kapton", 7, 0, isxfld, sxmgmx
d3f347ff 608 , tmaxfd, stemax, deemax, epsil, stmin);
609 // Gas-filling of the radiator
db30bf0f 610 AliMedium(12, "CO2", 8, 0, isxfld, sxmgmx
d3f347ff 611 , tmaxfd, stemax, deemax, epsil, stmin);
612 // G10-plates
db30bf0f 613 AliMedium(13, "G10-plates",12, 0, isxfld, sxmgmx
d3f347ff 614 , tmaxfd, stemax, deemax, epsil, stmin);
615 // Cooling water
db30bf0f 616 AliMedium(14, "Water", 13, 0, isxfld, sxmgmx
617 , tmaxfd, stemax, deemax, epsil, stmin);
618 // Rohacell (plexiglas) for the radiator
619 AliMedium(15, "Rohacell", 14, 0, isxfld, sxmgmx
d3f347ff 620 , tmaxfd, stemax, deemax, epsil, stmin);
16bf9884 621 // Al layer in MCMs
622 AliMedium(16, "MCM-Al" , 1, 0, isxfld, sxmgmx
623 , tmaxfd, stemax, deemax, epsil, stmin);
624 // Sn layer in MCMs
625 AliMedium(17, "MCM-Sn" , 15, 0, isxfld, sxmgmx
626 , tmaxfd, stemax, deemax, epsil, stmin);
627 // Cu layer in MCMs
628 AliMedium(18, "MCM-Cu" , 5, 0, isxfld, sxmgmx
629 , tmaxfd, stemax, deemax, epsil, stmin);
630 // G10 layer in MCMs
631 AliMedium(19, "MCM-G10" , 12, 0, isxfld, sxmgmx
632 , tmaxfd, stemax, deemax, epsil, stmin);
633 // Si in readout chips
634 AliMedium(20, "Chip-Si" , 16, 0, isxfld, sxmgmx
635 , tmaxfd, stemax, deemax, epsil, stmin);
636 // Epoxy in readout chips
637 AliMedium(21, "Chip-Ep" , 17, 0, isxfld, sxmgmx
638 , tmaxfd, stemax, deemax, epsil, stmin);
639 // PE in connectors
640 AliMedium(22, "Conn-PE" , 3, 0, isxfld, sxmgmx
641 , tmaxfd, stemax, deemax, epsil, stmin);
642 // Cu in connectors
643 AliMedium(23, "Chip-Cu" , 5, 0, isxfld, sxmgmx
644 , tmaxfd, stemax, deemax, epsil, stmin);
645 // Al of cooling pipes
646 AliMedium(24, "Cooling" , 1, 0, isxfld, sxmgmx
647 , tmaxfd, stemax, deemax, epsil, stmin);
73ae7b59 648 // Cu in services
649 AliMedium(25, "Serv-Cu" , 5, 0, isxfld, sxmgmx
650 , tmaxfd, stemax, deemax, epsil, stmin);
d3f347ff 651
793ff80c 652 // Save the density values for the TRD absorbtion
653 fFoilDensity = dmy;
3dac2b2d 654 fGasDensity = dgm;
793ff80c 655
fe4da5cc 656}
657
658//_____________________________________________________________________________
ba380e33 659void AliTRD::DrawModule() const
82bbf98a 660{
661 //
662 // Draw a shaded view of the Transition Radiation Detector version 0
663 //
664
665 // Set everything unseen
666 gMC->Gsatt("*" ,"SEEN",-1);
667
668 // Set ALIC mother transparent
669 gMC->Gsatt("ALIC","SEEN", 0);
670
671 // Set the volumes visible
851d3db9 672 if (fGeometry->IsVersion() == 0) {
5c7f4665 673 gMC->Gsatt("B071","SEEN", 0);
674 gMC->Gsatt("B074","SEEN", 0);
675 gMC->Gsatt("B075","SEEN", 0);
676 gMC->Gsatt("B077","SEEN", 0);
677 gMC->Gsatt("BTR1","SEEN", 0);
678 gMC->Gsatt("BTR2","SEEN", 0);
679 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 680 gMC->Gsatt("UTR1","SEEN", 0);
681 gMC->Gsatt("UTR2","SEEN", 0);
682 gMC->Gsatt("UTR3","SEEN", 0);
5c7f4665 683 }
684 else {
685 gMC->Gsatt("B071","SEEN", 0);
686 gMC->Gsatt("B074","SEEN", 0);
687 gMC->Gsatt("B075","SEEN", 0);
688 gMC->Gsatt("B077","SEEN", 0);
689 gMC->Gsatt("BTR1","SEEN", 0);
690 gMC->Gsatt("BTR2","SEEN", 0);
691 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 692 gMC->Gsatt("UTR1","SEEN", 0);
5c7f4665 693 }
82bbf98a 694
695 gMC->Gdopt("hide", "on");
696 gMC->Gdopt("shad", "on");
697 gMC->Gsatt("*", "fill", 7);
698 gMC->SetClipBox(".");
699 gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
700 gMC->DefaultRange();
701 gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
702 gMC->Gdhead(1111, "Transition Radiation Detector");
703 gMC->Gdman(18, 4, "MAN");
704
705}
706
707//_____________________________________________________________________________
e0d47c25 708Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
fe4da5cc 709{
710 //
711 // Distance between the mouse and the TRD detector on the screen
712 // Dummy routine
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
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
a328fff9 741 if (fHits == 0) return;
793ff80c 742
a328fff9 743 Int_t nhits = fHits->GetEntriesFast();
793ff80c 744 if (nhits == 0) return;
745
5d12ce38 746 Int_t tracks = gAlice->GetMCApp()->GetNtrack();
793ff80c 747 if (fPoints == 0) fPoints = new TObjArray(tracks);
748
749 AliTRDhit *ahit;
750
751 Int_t *ntrkE = new Int_t[tracks];
752 Int_t *ntrkT = new Int_t[tracks];
753 Int_t *limiE = new Int_t[tracks];
754 Int_t *limiT = new Int_t[tracks];
755 Float_t **coorE = new Float_t*[tracks];
756 Float_t **coorT = new Float_t*[tracks];
757 for(Int_t i = 0; i < tracks; i++) {
758 ntrkE[i] = 0;
759 ntrkT[i] = 0;
760 coorE[i] = 0;
761 coorT[i] = 0;
762 limiE[i] = 0;
763 limiT[i] = 0;
764 }
765
332e9569 766 AliTRDpoints *points = 0;
767 Float_t *fp = 0;
768 Int_t trk;
769 Int_t chunk = nhits / 4 + 1;
793ff80c 770
771 // Loop over all the hits and store their position
332e9569 772 ahit = (AliTRDhit *) FirstHit(-1);
773 while (ahit) {
793ff80c 774
775 // dEdx hits
332e9569 776 if (ahit->GetCharge() >= 0) {
793ff80c 777
778 trk = ahit->GetTrack();
779 if (ntrkE[trk] == limiE[trk]) {
780 // Initialise a new track
781 fp = new Float_t[3*(limiE[trk]+chunk)];
782 if (coorE[trk]) {
783 memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]);
784 delete [] coorE[trk];
785 }
786 limiE[trk] += chunk;
787 coorE[trk] = fp;
788 }
789 else {
790 fp = coorE[trk];
791 }
792 fp[3*ntrkE[trk] ] = ahit->X();
793 fp[3*ntrkE[trk]+1] = ahit->Y();
794 fp[3*ntrkE[trk]+2] = ahit->Z();
795 ntrkE[trk]++;
796
797 }
798 // TR photon hits
332e9569 799 else if ((ahit->GetCharge() < 0) && (fDrawTR)) {
793ff80c 800
801 trk = ahit->GetTrack();
802 if (ntrkT[trk] == limiT[trk]) {
803 // Initialise a new track
804 fp = new Float_t[3*(limiT[trk]+chunk)];
805 if (coorT[trk]) {
806 memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]);
807 delete [] coorT[trk];
808 }
809 limiT[trk] += chunk;
810 coorT[trk] = fp;
811 }
812 else {
813 fp = coorT[trk];
814 }
815 fp[3*ntrkT[trk] ] = ahit->X();
816 fp[3*ntrkT[trk]+1] = ahit->Y();
817 fp[3*ntrkT[trk]+2] = ahit->Z();
818 ntrkT[trk]++;
819
820 }
821
332e9569 822 ahit = (AliTRDhit *) NextHit();
823
793ff80c 824 }
825
826 for (trk = 0; trk < tracks; ++trk) {
827
828 if (ntrkE[trk] || ntrkT[trk]) {
829
830 points = new AliTRDpoints();
831 points->SetDetector(this);
832 points->SetParticle(trk);
833
834 // Set the dEdx points
835 if (ntrkE[trk]) {
836 points->SetMarkerColor(GetMarkerColor());
837 points->SetMarkerSize(GetMarkerSize());
838 points->SetPolyMarker(ntrkE[trk],coorE[trk],GetMarkerStyle());
839 delete [] coorE[trk];
840 coorE[trk] = 0;
841 }
842
843 // Set the TR photon points
844 if (ntrkT[trk]) {
845 points->SetTRpoints(ntrkT[trk],coorT[trk]);
846 delete [] coorT[trk];
847 coorT[trk] = 0;
848 }
849
850 fPoints->AddAt(points,trk);
851
852 }
853
854 }
855
856 delete [] coorE;
857 delete [] coorT;
858 delete [] ntrkE;
859 delete [] ntrkT;
860 delete [] limiE;
861 delete [] limiT;
862
863}
864
865//_____________________________________________________________________________
88cb7938 866void AliTRD::MakeBranch(Option_t* option)
5c7f4665 867{
868 //
abaf1f1d 869 // Create Tree branches for the TRD digits.
5c7f4665 870 //
871
abaf1f1d 872 Int_t buffersize = 4000;
873 Char_t branchname[15];
874 sprintf(branchname,"%s",GetName());
5c7f4665 875
aa9d00f0 876 const char *cD = strstr(option,"D");
877
88cb7938 878 AliDetector::MakeBranch(option);
5c7f4665 879
abaf1f1d 880 if (fDigits && gAlice->TreeD() && cD) {
88cb7938 881 MakeBranchInTree(gAlice->TreeD(),branchname,&fDigits,buffersize,0);
abaf1f1d 882 }
883
851d3db9 884}
885
886//_____________________________________________________________________________
6244debe 887void AliTRD::ResetDigits()
888{
889 //
abaf1f1d 890 // Reset number of digits and the digits array for this detector
6244debe 891 //
892
abaf1f1d 893 fNdigits = 0;
894 if (fDigits) fDigits->Clear();
6244debe 895
896}
897
898//_____________________________________________________________________________
5c7f4665 899void AliTRD::SetTreeAddress()
900{
901 //
902 // Set the branch addresses for the trees.
903 //
904
a328fff9 905 if ( fLoader->TreeH() && (fHits == 0x0)) {
906 fHits = new TClonesArray("AliTRDhit",405);
332e9569 907 }
a328fff9 908 AliDetector::SetTreeAddress();
332e9569 909
fe4da5cc 910}
911
d3f347ff 912//_____________________________________________________________________________
dd9a6ee3 913AliTRD &AliTRD::operator=(const AliTRD &trd)
914{
915 //
916 // Assignment operator
917 //
918
919 if (this != &trd) ((AliTRD &) trd).Copy(*this);
920 return *this;
921
f73816f5 922}
abaf1f1d 923
abaf1f1d 924
925
926
927
928
929
930
931
932
933
934
935
936
937
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