Important comment added.
[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"
793ff80c 43#include "AliMagF.h"
88cb7938 44#include "AliRun.h"
793ff80c 45#include "AliTRD.h"
793ff80c 46#include "AliTRDdigit.h"
851d3db9 47#include "AliTRDdigitizer.h"
88cb7938 48#include "AliTRDdigitsManager.h"
851d3db9 49#include "AliTRDgeometryFull.h"
88cb7938 50#include "AliTRDgeometryHole.h"
51#include "AliTRDhit.h"
52#include "AliTRDpoints.h"
b864d801 53#include "AliTRDrawData.h"
88cb7938 54#include "AliTrackReference.h"
5d12ce38 55#include "AliMC.h"
793ff80c 56
fe4da5cc 57ClassImp(AliTRD)
58
59//_____________________________________________________________________________
60AliTRD::AliTRD()
61{
62 //
63 // Default constructor
64 //
82bbf98a 65
6244debe 66 fIshunt = 0;
67 fGasMix = 0;
68 fHits = 0;
69 fDigits = 0;
5c7f4665 70
6244debe 71 fGeometry = 0;
82bbf98a 72
6244debe 73 fGasDensity = 0;
74 fFoilDensity = 0;
793ff80c 75
6244debe 76 fDrawTR = 0;
332e9569 77 fDisplayType = 0;
78
fe4da5cc 79}
80
81//_____________________________________________________________________________
82AliTRD::AliTRD(const char *name, const char *title)
83 : AliDetector(name,title)
84{
85 //
86 // Standard constructor for the TRD
87 //
88
5c7f4665 89 // Check that FRAME is there otherwise we have no place where to
90 // put TRD
8230f242 91 AliModule* frame = gAlice->GetModule("FRAME");
92 if (!frame) {
5c7f4665 93 Error("Ctor","TRD needs FRAME to be present\n");
94 exit(1);
95 }
96
d37eec5e 97 // Define the TRD geometry
98 if ((frame->IsVersion() == 0) ||
99 (frame->IsVersion() == 1)) {
851d3db9 100 fGeometry = new AliTRDgeometryFull();
101 }
102 else {
103 Error("Ctor","Could not find valid FRAME version\n");
104 exit(1);
105 }
5c7f4665 106
bdbb05bb 107 // Save the geometry
108 TDirectory* saveDir = gDirectory;
109 gAlice->GetRunLoader()->CdGAFile();
110 fGeometry->Write("TRDgeometry");
111 saveDir->cd();
112
fe4da5cc 113 // Allocate the hit array
f73816f5 114 fHits = new TClonesArray("AliTRDhit" ,405);
5d12ce38 115 gAlice->GetMCApp()->AddHitList(fHits);
99d5402e 116
117 // Allocate the digits array
f73816f5 118 fDigits = 0;
5c7f4665 119
6244debe 120 fIshunt = 0;
121 fGasMix = 1;
793ff80c 122
6244debe 123 fGasDensity = 0;
124 fFoilDensity = 0;
793ff80c 125
6244debe 126 fDrawTR = 0;
127 fDisplayType = 0;
128
fe4da5cc 129 SetMarkerColor(kWhite);
82bbf98a 130
fe4da5cc 131}
99d5402e 132
133//_____________________________________________________________________________
73ae7b59 134AliTRD::AliTRD(const AliTRD &trd):AliDetector(trd)
8230f242 135{
136 //
137 // Copy constructor
138 //
139
dd9a6ee3 140 ((AliTRD &) trd).Copy(*this);
8230f242 141
142}
143
144//_____________________________________________________________________________
99d5402e 145AliTRD::~AliTRD()
146{
147 //
148 // TRD destructor
149 //
150
151 fIshunt = 0;
152
abaf1f1d 153 if (fGeometry) {
154 delete fGeometry;
332e9569 155 fGeometry = 0;
abaf1f1d 156 }
157 if (fHits) {
158 delete fHits;
332e9569 159 fHits = 0;
abaf1f1d 160 }
5c7f4665 161
162}
163
164//_____________________________________________________________________________
6244debe 165void AliTRD::Hits2Digits()
2ab0c725 166{
167 //
168 // Create digits
169 //
be385a87 170 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
171 digitizer.SetDebug(GetDebug());
88cb7938 172
6244debe 173 // Initialization
be385a87 174 digitizer.InitDetector();
6244debe 175
85a5290f 176 if (!fLoader->TreeH()) fLoader->LoadHits("read");
177 fLoader->LoadDigits("recreate");
178 AliRunLoader* runLoader = fLoader->GetRunLoader();
6244debe 179
85a5290f 180 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
be385a87 181 digitizer.Open(runLoader->GetFileName().Data(), iEvent);
182 digitizer.MakeDigits();
183 digitizer.WriteDigits();
6244debe 184 }
185
85a5290f 186 fLoader->UnloadHits();
187 fLoader->UnloadDigits();
a328fff9 188
6244debe 189}
190
191//_____________________________________________________________________________
192void AliTRD::Hits2SDigits()
193{
194 //
195 // Create summable digits
196 //
a328fff9 197
be385a87 198 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
6244debe 199 // For the summable digits
be385a87 200 digitizer.SetSDigits(kTRUE);
201 digitizer.SetDebug(GetDebug());
6244debe 202
203 // Initialization
be385a87 204 digitizer.InitDetector();
2ab0c725 205
85a5290f 206 if (!fLoader->TreeH()) fLoader->LoadHits("read");
207 fLoader->LoadSDigits("recreate");
208 AliRunLoader* runLoader = fLoader->GetRunLoader();
6244debe 209
85a5290f 210 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
be385a87 211 digitizer.Open(runLoader->GetFileName().Data(), iEvent);
212 digitizer.MakeDigits();
213 digitizer.WriteDigits();
85a5290f 214 }
2ab0c725 215
85a5290f 216 fLoader->UnloadHits();
217 fLoader->UnloadSDigits();
a328fff9 218
219}
6244debe 220
85a5290f 221//_____________________________________________________________________________
c92eb8ad 222AliDigitizer* AliTRD::CreateDigitizer(AliRunDigitizer* manager) const
85a5290f 223{
a328fff9 224 //
225 // Creates a new digitizer object
226 //
227
85a5290f 228 return new AliTRDdigitizer(manager);
a328fff9 229
6244debe 230}
231
232//_____________________________________________________________________________
233void AliTRD::SDigits2Digits()
234{
235 //
236 // Create final digits from summable digits
237 //
238
abaf1f1d 239 // Create the TRD digitizer
be385a87 240 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
241 digitizer.SetDebug(GetDebug());
99d5402e 242
abaf1f1d 243 // Set the parameter
be385a87 244 digitizer.SetEvent(gAlice->GetEvNumber());
abaf1f1d 245
246 // Initialization
be385a87 247 digitizer.InitDetector();
abaf1f1d 248
249 // Read the s-digits via digits manager
be385a87 250 AliTRDdigitsManager sdigitsManager;
88cb7938 251
be385a87 252 sdigitsManager.SetDebug(GetDebug());
253 sdigitsManager.SetSDigits(kTRUE);
254 sdigitsManager.CreateArrays();
88cb7938 255
256 if (!fLoader->TreeS())
257 if (fLoader->LoadSDigits("read"))
258 {
259 Error("SDigits2Digits","Error while reading SDigits for event %d",gAlice->GetEvNumber());
260 return;
261 }
262 if (!fLoader->TreeS()) return;
263
be385a87 264 sdigitsManager.ReadDigits(fLoader->TreeS());
abaf1f1d 265
266 // Add the s-digits to the input list
be385a87 267 digitizer.AddSDigitsManager(&sdigitsManager);
99d5402e 268
abaf1f1d 269 // Convert the s-digits to normal digits
be385a87 270 digitizer.SDigits2Digits();
abaf1f1d 271
272 // Store the digits
88cb7938 273 if (!fLoader->TreeD()) fLoader->MakeTree("D");
be385a87 274 if (digitizer.MakeBranch(fLoader->TreeD())){
275 digitizer.WriteDigits();
abaf1f1d 276 }
99d5402e 277
278}
279
fe4da5cc 280//_____________________________________________________________________________
b864d801 281void AliTRD::Digits2Raw()
282{
283 //
284 // convert digits of the current event to raw data
285 //
286
287 fLoader->LoadDigits();
288 TTree* digits = fLoader->TreeD();
289 if (!digits) {
290 Error("Digits2Raw", "no digits tree");
291 return;
292 }
293
294 AliTRDrawData rawWriter;
295// rawWriter.SetDebug(2);
296 if (!rawWriter.Digits2Raw(digits)) {
297 Error("AliTRD::Digits2Raw","The raw writer could not load the digits tree");
298 }
299
300 fLoader->UnloadDigits();
301
302}
303
304//_____________________________________________________________________________
332e9569 305void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
306 , Bool_t inDrift)
fe4da5cc 307{
308 //
309 // Add a hit for the TRD
332e9569 310 //
82bbf98a 311
a328fff9 312 TClonesArray &lhits = *fHits;
313 AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q);
314 if (inDrift) {
315 hit->SetDrift();
332e9569 316 }
a328fff9 317 else {
318 hit->SetAmplification();
319 }
320 if (q < 0) {
321 hit->SetTRphoton();
332e9569 322 }
82bbf98a 323
fe4da5cc 324}
325
326//_____________________________________________________________________________
327void AliTRD::BuildGeometry()
328{
329 //
330 // Create the ROOT TNode geometry for the TRD
331 //
82bbf98a 332
8230f242 333 TNode *node, *top;
fe4da5cc 334 TPGON *pgon;
793ff80c 335
336 Float_t rmin, rmax;
337 Float_t zmax1, zmax2;
db30bf0f 338
339 Int_t iPlan;
793ff80c 340
fe4da5cc 341 const Int_t kColorTRD = 46;
d3f347ff 342
fe4da5cc 343 // Find the top node alice
8230f242 344 top = gAlice->GetGeometry()->GetNode("alice");
d3f347ff 345
db30bf0f 346 if (fDisplayType == 0) {
793ff80c 347
348 pgon = new TPGON("S_TRD","TRD","void",0,360,AliTRDgeometry::Nsect(),4);
349 rmin = AliTRDgeometry::Rmin();
350 rmax = AliTRDgeometry::Rmax();
351 pgon->DefineSection(0,-AliTRDgeometry::Zmax1(),rmax,rmax);
352 pgon->DefineSection(1,-AliTRDgeometry::Zmax2(),rmin,rmax);
353 pgon->DefineSection(2, AliTRDgeometry::Zmax2(),rmin,rmax);
354 pgon->DefineSection(3, AliTRDgeometry::Zmax1(),rmax,rmax);
355 top->cd();
356 node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
357 node->SetLineColor(kColorTRD);
358 fNodes->Add(node);
359
db30bf0f 360 }
361 else if (fDisplayType == 1) {
793ff80c 362
f73816f5 363 Char_t name[7];
364
793ff80c 365 Float_t slope = (AliTRDgeometry::Zmax1() - AliTRDgeometry::Zmax2())
366 / (AliTRDgeometry::Rmax() - AliTRDgeometry::Rmin());
367
332e9569 368 rmin = AliTRDgeometry::Rmin() + AliTRDgeometry::CraHght();
369 rmax = rmin + AliTRDgeometry::CdrHght();
f73816f5 370
371 Float_t thickness = rmin - AliTRDgeometry::Rmin();
372 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
793ff80c 373 zmax1 = zmax2 + slope * AliTRDgeometry::DrThick();
793ff80c 374
db30bf0f 375 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
793ff80c 376
f73816f5 377 sprintf(name,"S_TR1%d",iPlan);
378 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
379 pgon->DefineSection(0,-zmax1,rmax,rmax);
380 pgon->DefineSection(1,-zmax2,rmin,rmax);
381 pgon->DefineSection(2, zmax2,rmin,rmax);
382 pgon->DefineSection(3, zmax1,rmax,rmax);
383 top->cd();
384 node = new TNode("TRD","TRD",name,0,0,0,"");
385 node->SetLineColor(kColorTRD);
386 fNodes->Add(node);
387
388 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
389 rmin = rmin + height;
390 rmax = rmax + height;
391 zmax1 = zmax1 + slope * height;
392 zmax2 = zmax2 + slope * height;
393
394 }
395
396 thickness += AliTRDgeometry::DrThick();
397 rmin = AliTRDgeometry::Rmin() + thickness;
398 rmax = rmin + AliTRDgeometry::AmThick();
399 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
400 zmax1 = zmax2 + slope * AliTRDgeometry::AmThick();
401
db30bf0f 402 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
f73816f5 403
404 sprintf(name,"S_TR2%d",iPlan);
793ff80c 405 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
406 pgon->DefineSection(0,-zmax1,rmax,rmax);
407 pgon->DefineSection(1,-zmax2,rmin,rmax);
408 pgon->DefineSection(2, zmax2,rmin,rmax);
409 pgon->DefineSection(3, zmax1,rmax,rmax);
410 top->cd();
411 node = new TNode("TRD","TRD",name,0,0,0,"");
412 node->SetLineColor(kColorTRD);
413 fNodes->Add(node);
414
415 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
416 rmin = rmin + height;
417 rmax = rmax + height;
418 zmax1 = zmax1 + slope * height;
419 zmax2 = zmax2 + slope * height;
420
421 }
422
db30bf0f 423 }
d3f347ff 424
fe4da5cc 425}
426
427//_____________________________________________________________________________
dd9a6ee3 428void AliTRD::Copy(TObject &trd)
8230f242 429{
430 //
431 // Copy function
432 //
433
793ff80c 434 ((AliTRD &) trd).fGasMix = fGasMix;
435 ((AliTRD &) trd).fGeometry = fGeometry;
793ff80c 436 ((AliTRD &) trd).fGasDensity = fGasDensity;
437 ((AliTRD &) trd).fFoilDensity = fFoilDensity;
438 ((AliTRD &) trd).fDrawTR = fDrawTR;
439 ((AliTRD &) trd).fDisplayType = fDisplayType;
8230f242 440
441 //AliDetector::Copy(trd);
442
443}
444
445//_____________________________________________________________________________
82bbf98a 446void AliTRD::CreateGeometry()
fe4da5cc 447{
82bbf98a 448 //
449 // Creates the volumes for the TRD chambers
450 //
82bbf98a 451
452 // Check that FRAME is there otherwise we have no place where to put the TRD
8230f242 453 AliModule* frame = gAlice->GetModule("FRAME");
454 if (!frame) {
851d3db9 455 printf(" The TRD needs the FRAME to be defined first\n");
456 return;
82bbf98a 457 }
d3f347ff 458
851d3db9 459 fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
5c7f4665 460
82bbf98a 461}
462
463//_____________________________________________________________________________
464void AliTRD::CreateMaterials()
465{
fe4da5cc 466 //
467 // Create the materials for the TRD
468 // Origin Y.Foka
469 //
470
8230f242 471 Int_t isxfld = gAlice->Field()->Integ();
472 Float_t sxmgmx = gAlice->Field()->Max();
fe4da5cc 473
d3f347ff 474 // For polyethilene (CH2)
475 Float_t ape[2] = { 12., 1. };
476 Float_t zpe[2] = { 6., 1. };
477 Float_t wpe[2] = { 1., 2. };
478 Float_t dpe = 0.95;
479
480 // For mylar (C5H4O2)
481 Float_t amy[3] = { 12., 1., 16. };
482 Float_t zmy[3] = { 6., 1., 8. };
483 Float_t wmy[3] = { 5., 4., 2. };
fe4da5cc 484 Float_t dmy = 1.39;
d3f347ff 485
486 // For CO2
487 Float_t aco[2] = { 12., 16. };
488 Float_t zco[2] = { 6., 8. };
489 Float_t wco[2] = { 1., 2. };
490 Float_t dco = 0.001977;
491
492 // For water
493 Float_t awa[2] = { 1., 16. };
494 Float_t zwa[2] = { 1., 8. };
495 Float_t wwa[2] = { 2., 1. };
496 Float_t dwa = 1.0;
497
498 // For isobutane (C4H10)
499 Float_t ais[2] = { 12., 1. };
500 Float_t zis[2] = { 6., 1. };
501 Float_t wis[2] = { 4., 10. };
502 Float_t dis = 0.00267;
503
db30bf0f 504 // For plexiglas (C5H8O2)
505 Float_t apg[3] = { 12.011 , 1.0 , 15.9994 };
506 Float_t zpg[3] = { 6.0 , 1.0 , 8.0 };
507 Float_t wpg[3] = { 5.0 , 8.0 , 2.0 };
508 Float_t dpg = 1.18;
509
d3f347ff 510 // For Xe/CO2-gas-mixture
db30bf0f 511 // Xe-content of the Xe/CO2-mixture (85% / 15%)
512 Float_t fxc = .85;
d3f347ff 513 // Xe-content of the Xe/Isobutane-mixture (97% / 3%)
514 Float_t fxi = .97;
fe4da5cc 515 Float_t dxe = .005858;
516
d3f347ff 517 // General tracking parameter
fe4da5cc 518 Float_t tmaxfd = -10.;
519 Float_t stemax = -1e10;
d3f347ff 520 Float_t deemax = -0.1;
521 Float_t epsil = 1e-4;
522 Float_t stmin = -0.001;
fe4da5cc 523
524 Float_t absl, radl, d, buf[1];
793ff80c 525 Float_t agm[2], zgm[2], wgm[2];
526 Float_t dgm1, dgm2;
d3f347ff 527 Int_t nbuf;
fe4da5cc 528
d3f347ff 529 //////////////////////////////////////////////////////////////////////////
fe4da5cc 530 // Define Materials
d3f347ff 531 //////////////////////////////////////////////////////////////////////////
532
16bf9884 533 AliMaterial( 1, "Al" , 26.98, 13.0, 2.7 , 8.9 , 37.2);
534 AliMaterial( 2, "Air" , 14.61, 7.3, 0.001205, 30420.0 , 67500.0);
535 AliMaterial( 4, "Xe" , 131.29, 54.0, dxe , 1447.59, 0.0);
536 AliMaterial( 5, "Cu" , 63.54, 29.0, 8.96 , 1.43, 14.8);
537 AliMaterial( 6, "C" , 12.01, 6.0, 2.265 , 18.8 , 74.4);
538 AliMaterial(12, "G10" , 20.00, 10.0, 1.7 , 19.4 , 999.0);
539 AliMaterial(15, "Sn" , 118.71, 50.0, 7.31 , 1.21, 14.8);
540 AliMaterial(16, "Si" , 28.09, 14.0, 2.33 , 9.36, 37.2);
541 AliMaterial(17, "Epoxy", 17.75, 8.9, 1.8 , 21.82, 999.0);
d3f347ff 542
543 // Mixtures
db30bf0f 544 AliMixture(3, "Polyethilene", ape, zpe, dpe, -2, wpe);
545 AliMixture(7, "Mylar", amy, zmy, dmy, -3, wmy);
546 AliMixture(8, "CO2", aco, zco, dco, -2, wco);
547 AliMixture(9, "Isobutane", ais, zis, dis, -2, wis);
548 AliMixture(13,"Water", awa, zwa, dwa, -2, wwa);
549 AliMixture(14,"Plexiglas", apg, zpg, dpg, -3, wpg);
d3f347ff 550
551 // Gas mixtures
00d6d986 552 Char_t namate[21]="";
d3f347ff 553 // Xe/CO2-mixture
554 // Get properties of Xe
cfce8870 555 gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
d3f347ff 556 // Get properties of CO2
cfce8870 557 gMC->Gfmate((*fIdmate)[8], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
d3f347ff 558 // Create gas mixture
559 wgm[0] = fxc;
560 wgm[1] = 1. - fxc;
793ff80c 561 dgm1 = wgm[0] * dxe + wgm[1] * dco;
db30bf0f 562 AliMixture(10, "Gas mixture 1", agm, zgm, dgm1, 2, wgm);
d3f347ff 563 // Xe/Isobutane-mixture
564 // Get properties of Xe
cfce8870 565 gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
d3f347ff 566 // Get properties of Isobutane
cfce8870 567 gMC->Gfmate((*fIdmate)[9], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
d3f347ff 568 // Create gas mixture
569 wgm[0] = fxi;
570 wgm[1] = 1. - fxi;
793ff80c 571 dgm2 = wgm[0] * dxe + wgm[1] * dis;
db30bf0f 572 AliMixture(11, "Gas mixture 2", agm, zgm, dgm2, 2, wgm);
d3f347ff 573
574 //////////////////////////////////////////////////////////////////////////
fe4da5cc 575 // Tracking Media Parameters
d3f347ff 576 //////////////////////////////////////////////////////////////////////////
577
578 // Al Frame
db30bf0f 579 AliMedium(1, "Al Frame", 1, 0, isxfld, sxmgmx
d3f347ff 580 , tmaxfd, stemax, deemax, epsil, stmin);
581 // Air
db30bf0f 582 AliMedium(2, "Air", 2, 0, isxfld, sxmgmx
d3f347ff 583 , tmaxfd, stemax, deemax, epsil, stmin);
584 // Polyethilene
db30bf0f 585 AliMedium(3, "Radiator", 3, 0, isxfld, sxmgmx
d3f347ff 586 , tmaxfd, stemax, deemax, epsil, stmin);
587 // Xe
db30bf0f 588 AliMedium(4, "Xe", 4, 1, isxfld, sxmgmx
d3f347ff 589 , tmaxfd, stemax, deemax, epsil, stmin);
590 // Cu pads
db30bf0f 591 AliMedium(5, "Padplane", 5, 1, isxfld, sxmgmx
d3f347ff 592 , tmaxfd, stemax, deemax, epsil, stmin);
593 // Fee + cables
db30bf0f 594 AliMedium(6, "Readout", 1, 0, isxfld, sxmgmx
d3f347ff 595 , tmaxfd, stemax, deemax, epsil, stmin);
596 // C frame
db30bf0f 597 AliMedium(7, "C Frame", 6, 0, isxfld, sxmgmx
d3f347ff 598 , tmaxfd, stemax, deemax, epsil, stmin);
599 // Mylar foils
db30bf0f 600 AliMedium(8, "Mylar", 7, 0, isxfld, sxmgmx
d3f347ff 601 , tmaxfd, stemax, deemax, epsil, stmin);
602 if (fGasMix == 1) {
603 // Gas-mixture (Xe/CO2)
db30bf0f 604 AliMedium(9, "Gas-mix", 10, 1, isxfld, sxmgmx
d3f347ff 605 , tmaxfd, stemax, deemax, epsil, stmin);
606 }
607 else {
608 // Gas-mixture (Xe/Isobutane)
db30bf0f 609 AliMedium(9, "Gas-mix", 11, 1, isxfld, sxmgmx
d3f347ff 610 , tmaxfd, stemax, deemax, epsil, stmin);
611 }
612 // Nomex-honeycomb (use carbon for the time being)
db30bf0f 613 AliMedium(10, "Nomex", 6, 0, isxfld, sxmgmx
d3f347ff 614 , tmaxfd, stemax, deemax, epsil, stmin);
615 // Kapton foils (use Mylar for the time being)
db30bf0f 616 AliMedium(11, "Kapton", 7, 0, isxfld, sxmgmx
d3f347ff 617 , tmaxfd, stemax, deemax, epsil, stmin);
618 // Gas-filling of the radiator
db30bf0f 619 AliMedium(12, "CO2", 8, 0, isxfld, sxmgmx
d3f347ff 620 , tmaxfd, stemax, deemax, epsil, stmin);
621 // G10-plates
db30bf0f 622 AliMedium(13, "G10-plates",12, 0, isxfld, sxmgmx
d3f347ff 623 , tmaxfd, stemax, deemax, epsil, stmin);
624 // Cooling water
db30bf0f 625 AliMedium(14, "Water", 13, 0, isxfld, sxmgmx
626 , tmaxfd, stemax, deemax, epsil, stmin);
627 // Rohacell (plexiglas) for the radiator
628 AliMedium(15, "Rohacell", 14, 0, isxfld, sxmgmx
d3f347ff 629 , tmaxfd, stemax, deemax, epsil, stmin);
16bf9884 630 // Al layer in MCMs
631 AliMedium(16, "MCM-Al" , 1, 0, isxfld, sxmgmx
632 , tmaxfd, stemax, deemax, epsil, stmin);
633 // Sn layer in MCMs
634 AliMedium(17, "MCM-Sn" , 15, 0, isxfld, sxmgmx
635 , tmaxfd, stemax, deemax, epsil, stmin);
636 // Cu layer in MCMs
637 AliMedium(18, "MCM-Cu" , 5, 0, isxfld, sxmgmx
638 , tmaxfd, stemax, deemax, epsil, stmin);
639 // G10 layer in MCMs
640 AliMedium(19, "MCM-G10" , 12, 0, isxfld, sxmgmx
641 , tmaxfd, stemax, deemax, epsil, stmin);
642 // Si in readout chips
643 AliMedium(20, "Chip-Si" , 16, 0, isxfld, sxmgmx
644 , tmaxfd, stemax, deemax, epsil, stmin);
645 // Epoxy in readout chips
646 AliMedium(21, "Chip-Ep" , 17, 0, isxfld, sxmgmx
647 , tmaxfd, stemax, deemax, epsil, stmin);
648 // PE in connectors
649 AliMedium(22, "Conn-PE" , 3, 0, isxfld, sxmgmx
650 , tmaxfd, stemax, deemax, epsil, stmin);
651 // Cu in connectors
652 AliMedium(23, "Chip-Cu" , 5, 0, isxfld, sxmgmx
653 , tmaxfd, stemax, deemax, epsil, stmin);
654 // Al of cooling pipes
655 AliMedium(24, "Cooling" , 1, 0, isxfld, sxmgmx
656 , tmaxfd, stemax, deemax, epsil, stmin);
73ae7b59 657 // Cu in services
658 AliMedium(25, "Serv-Cu" , 5, 0, isxfld, sxmgmx
659 , tmaxfd, stemax, deemax, epsil, stmin);
d3f347ff 660
793ff80c 661 // Save the density values for the TRD absorbtion
662 fFoilDensity = dmy;
663 if (fGasMix == 1)
664 fGasDensity = dgm1;
665 else
666 fGasDensity = dgm2;
667
fe4da5cc 668}
669
670//_____________________________________________________________________________
0a29d0f1 671void AliTRD::DrawModule() const
82bbf98a 672{
673 //
674 // Draw a shaded view of the Transition Radiation Detector version 0
675 //
676
677 // Set everything unseen
678 gMC->Gsatt("*" ,"SEEN",-1);
679
680 // Set ALIC mother transparent
681 gMC->Gsatt("ALIC","SEEN", 0);
682
683 // Set the volumes visible
851d3db9 684 if (fGeometry->IsVersion() == 0) {
5c7f4665 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);
693 gMC->Gsatt("UTR2","SEEN", 0);
694 gMC->Gsatt("UTR3","SEEN", 0);
5c7f4665 695 }
696 else {
697 gMC->Gsatt("B071","SEEN", 0);
698 gMC->Gsatt("B074","SEEN", 0);
699 gMC->Gsatt("B075","SEEN", 0);
700 gMC->Gsatt("B077","SEEN", 0);
701 gMC->Gsatt("BTR1","SEEN", 0);
702 gMC->Gsatt("BTR2","SEEN", 0);
703 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 704 gMC->Gsatt("UTR1","SEEN", 0);
6f1e466d 705 if (fGeometry->GetPHOShole())
332e9569 706 gMC->Gsatt("UTR2","SEEN", 0);
6f1e466d 707 if (fGeometry->GetRICHhole())
332e9569 708 gMC->Gsatt("UTR3","SEEN", 0);
5c7f4665 709 }
332e9569 710// gMC->Gsatt("UCII","SEEN", 0);
711// gMC->Gsatt("UCIM","SEEN", 0);
712// gMC->Gsatt("UCIO","SEEN", 0);
713// gMC->Gsatt("UL02","SEEN", 1);
714// gMC->Gsatt("UL05","SEEN", 1);
715// gMC->Gsatt("UL06","SEEN", 1);
82bbf98a 716
717 gMC->Gdopt("hide", "on");
718 gMC->Gdopt("shad", "on");
719 gMC->Gsatt("*", "fill", 7);
720 gMC->SetClipBox(".");
721 gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
722 gMC->DefaultRange();
723 gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
724 gMC->Gdhead(1111, "Transition Radiation Detector");
725 gMC->Gdman(18, 4, "MAN");
726
727}
728
729//_____________________________________________________________________________
0a29d0f1 730Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t ) const
fe4da5cc 731{
732 //
733 // Distance between the mouse and the TRD detector on the screen
734 // Dummy routine
82bbf98a 735
736 return 9999;
737
fe4da5cc 738}
739
740//_____________________________________________________________________________
741void AliTRD::Init()
742{
743 //
851d3db9 744 // Initialize the TRD detector after the geometry has been created
fe4da5cc 745 //
82bbf98a 746
5c7f4665 747 Int_t i;
851d3db9 748
abaf1f1d 749 if (fDebug) {
9e1a0ddb 750 printf("\n%s: ",ClassName());
751 for (i = 0; i < 35; i++) printf("*");
752 printf(" TRD_INIT ");
753 for (i = 0; i < 35; i++) printf("*");
754 printf("\n");
755 }
5c7f4665 756
d37eec5e 757 if (fGeometry->IsVersion() == 1) {
758 printf("%s: Full geometry version initialized\n",ClassName());
6f1e466d 759 if (fGeometry->GetPHOShole())
9e1a0ddb 760 printf("%s: Leave space in front of PHOS free\n",ClassName());
6f1e466d 761 if (fGeometry->GetRICHhole())
9e1a0ddb 762 printf("%s: Leave space in front of RICH free\n",ClassName());
5c7f4665 763 }
d37eec5e 764 else {
765 printf("%s: Not a valid geometry\n",ClassName());
766 }
9e1a0ddb 767
abaf1f1d 768 if (fGasMix == 1) {
db30bf0f 769 printf("%s: Gas Mixture: 85%% Xe + 15%% CO2\n",ClassName());
abaf1f1d 770 }
771 else {
9e1a0ddb 772 printf("%s: Gas Mixture: 97%% Xe + 3%% Isobutane\n",ClassName());
abaf1f1d 773 }
5c7f4665 774
775}
776
777//_____________________________________________________________________________
73ae7b59 778void AliTRD::LoadPoints(Int_t )
793ff80c 779{
780 //
781 // Store x, y, z of all hits in memory.
782 // Hit originating from TR photons are given a different color
783 //
784
332e9569 785 //if (!fDrawTR) {
786 // AliDetector::LoadPoints(track);
787 // return;
788 //}
793ff80c 789
a328fff9 790 if (fHits == 0) return;
793ff80c 791
a328fff9 792 Int_t nhits = fHits->GetEntriesFast();
793ff80c 793 if (nhits == 0) return;
794
5d12ce38 795 Int_t tracks = gAlice->GetMCApp()->GetNtrack();
793ff80c 796 if (fPoints == 0) fPoints = new TObjArray(tracks);
797
798 AliTRDhit *ahit;
799
800 Int_t *ntrkE = new Int_t[tracks];
801 Int_t *ntrkT = new Int_t[tracks];
802 Int_t *limiE = new Int_t[tracks];
803 Int_t *limiT = new Int_t[tracks];
804 Float_t **coorE = new Float_t*[tracks];
805 Float_t **coorT = new Float_t*[tracks];
806 for(Int_t i = 0; i < tracks; i++) {
807 ntrkE[i] = 0;
808 ntrkT[i] = 0;
809 coorE[i] = 0;
810 coorT[i] = 0;
811 limiE[i] = 0;
812 limiT[i] = 0;
813 }
814
332e9569 815 AliTRDpoints *points = 0;
816 Float_t *fp = 0;
817 Int_t trk;
818 Int_t chunk = nhits / 4 + 1;
793ff80c 819
820 // Loop over all the hits and store their position
332e9569 821 ahit = (AliTRDhit *) FirstHit(-1);
822 while (ahit) {
793ff80c 823
824 // dEdx hits
332e9569 825 if (ahit->GetCharge() >= 0) {
793ff80c 826
827 trk = ahit->GetTrack();
828 if (ntrkE[trk] == limiE[trk]) {
829 // Initialise a new track
830 fp = new Float_t[3*(limiE[trk]+chunk)];
831 if (coorE[trk]) {
832 memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]);
833 delete [] coorE[trk];
834 }
835 limiE[trk] += chunk;
836 coorE[trk] = fp;
837 }
838 else {
839 fp = coorE[trk];
840 }
841 fp[3*ntrkE[trk] ] = ahit->X();
842 fp[3*ntrkE[trk]+1] = ahit->Y();
843 fp[3*ntrkE[trk]+2] = ahit->Z();
844 ntrkE[trk]++;
845
846 }
847 // TR photon hits
332e9569 848 else if ((ahit->GetCharge() < 0) && (fDrawTR)) {
793ff80c 849
850 trk = ahit->GetTrack();
851 if (ntrkT[trk] == limiT[trk]) {
852 // Initialise a new track
853 fp = new Float_t[3*(limiT[trk]+chunk)];
854 if (coorT[trk]) {
855 memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]);
856 delete [] coorT[trk];
857 }
858 limiT[trk] += chunk;
859 coorT[trk] = fp;
860 }
861 else {
862 fp = coorT[trk];
863 }
864 fp[3*ntrkT[trk] ] = ahit->X();
865 fp[3*ntrkT[trk]+1] = ahit->Y();
866 fp[3*ntrkT[trk]+2] = ahit->Z();
867 ntrkT[trk]++;
868
869 }
870
332e9569 871 ahit = (AliTRDhit *) NextHit();
872
793ff80c 873 }
874
875 for (trk = 0; trk < tracks; ++trk) {
876
877 if (ntrkE[trk] || ntrkT[trk]) {
878
879 points = new AliTRDpoints();
880 points->SetDetector(this);
881 points->SetParticle(trk);
882
883 // Set the dEdx points
884 if (ntrkE[trk]) {
885 points->SetMarkerColor(GetMarkerColor());
886 points->SetMarkerSize(GetMarkerSize());
887 points->SetPolyMarker(ntrkE[trk],coorE[trk],GetMarkerStyle());
888 delete [] coorE[trk];
889 coorE[trk] = 0;
890 }
891
892 // Set the TR photon points
893 if (ntrkT[trk]) {
894 points->SetTRpoints(ntrkT[trk],coorT[trk]);
895 delete [] coorT[trk];
896 coorT[trk] = 0;
897 }
898
899 fPoints->AddAt(points,trk);
900
901 }
902
903 }
904
905 delete [] coorE;
906 delete [] coorT;
907 delete [] ntrkE;
908 delete [] ntrkT;
909 delete [] limiE;
910 delete [] limiT;
911
912}
913
914//_____________________________________________________________________________
88cb7938 915void AliTRD::MakeBranch(Option_t* option)
5c7f4665 916{
917 //
abaf1f1d 918 // Create Tree branches for the TRD digits.
5c7f4665 919 //
920
abaf1f1d 921 Int_t buffersize = 4000;
922 Char_t branchname[15];
923 sprintf(branchname,"%s",GetName());
5c7f4665 924
aa9d00f0 925 const char *cD = strstr(option,"D");
926
88cb7938 927 AliDetector::MakeBranch(option);
5c7f4665 928
abaf1f1d 929 if (fDigits && gAlice->TreeD() && cD) {
88cb7938 930 MakeBranchInTree(gAlice->TreeD(),branchname,&fDigits,buffersize,0);
abaf1f1d 931 }
932
851d3db9 933}
934
935//_____________________________________________________________________________
6244debe 936void AliTRD::ResetDigits()
937{
938 //
abaf1f1d 939 // Reset number of digits and the digits array for this detector
6244debe 940 //
941
abaf1f1d 942 fNdigits = 0;
943 if (fDigits) fDigits->Clear();
6244debe 944
945}
946
947//_____________________________________________________________________________
5c7f4665 948void AliTRD::SetTreeAddress()
949{
950 //
951 // Set the branch addresses for the trees.
952 //
953
a328fff9 954 if ( fLoader->TreeH() && (fHits == 0x0)) {
955 fHits = new TClonesArray("AliTRDhit",405);
332e9569 956 }
a328fff9 957 AliDetector::SetTreeAddress();
332e9569 958
fe4da5cc 959}
960
d3f347ff 961//_____________________________________________________________________________
b060c36f 962void AliTRD::SetGasMix(Int_t imix)
d3f347ff 963{
82bbf98a 964 //
965 // Defines the gas mixture (imix=0: Xe/Isobutane imix=1: Xe/CO2)
966 //
967
d3f347ff 968 if ((imix < 0) || (imix > 1)) {
969 printf("Wrong input value: %d\n",imix);
970 printf("Use standard setting\n");
6244debe 971 fGasMix = 1;
d3f347ff 972 return;
973 }
974
975 fGasMix = imix;
976
977}
978
dd9a6ee3 979//_____________________________________________________________________________
793ff80c 980void AliTRD::SetPHOShole()
981{
982 //
983 // Selects a geometry with a hole in front of the PHOS
984 //
985
986 fGeometry->SetPHOShole();
987
988}
989
990//_____________________________________________________________________________
991void AliTRD::SetRICHhole()
992{
993 //
994 // Selects a geometry with a hole in front of the RICH
995 //
996
997 fGeometry->SetRICHhole();
998
999}
1000
1001//_____________________________________________________________________________
dd9a6ee3 1002AliTRD &AliTRD::operator=(const AliTRD &trd)
1003{
1004 //
1005 // Assignment operator
1006 //
1007
1008 if (this != &trd) ((AliTRD &) trd).Copy(*this);
1009 return *this;
1010
f73816f5 1011}
abaf1f1d 1012
abaf1f1d 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
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346