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