Always output at least one line
[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 "AliTRDhit.h"
51#include "AliTRDpoints.h"
b864d801 52#include "AliTRDrawData.h"
88cb7938 53#include "AliTrackReference.h"
5d12ce38 54#include "AliMC.h"
793ff80c 55
fe4da5cc 56ClassImp(AliTRD)
57
58//_____________________________________________________________________________
59AliTRD::AliTRD()
60{
61 //
62 // Default constructor
63 //
82bbf98a 64
6244debe 65 fIshunt = 0;
6244debe 66 fHits = 0;
67 fDigits = 0;
5c7f4665 68
6244debe 69 fGeometry = 0;
82bbf98a 70
6244debe 71 fGasDensity = 0;
72 fFoilDensity = 0;
793ff80c 73
6244debe 74 fDrawTR = 0;
332e9569 75 fDisplayType = 0;
76
fe4da5cc 77}
78
79//_____________________________________________________________________________
80AliTRD::AliTRD(const char *name, const char *title)
81 : AliDetector(name,title)
82{
83 //
84 // Standard constructor for the TRD
85 //
86
5c7f4665 87 // Check that FRAME is there otherwise we have no place where to
88 // put TRD
8230f242 89 AliModule* frame = gAlice->GetModule("FRAME");
90 if (!frame) {
5c7f4665 91 Error("Ctor","TRD needs FRAME to be present\n");
92 exit(1);
93 }
94
d37eec5e 95 // Define the TRD geometry
96 if ((frame->IsVersion() == 0) ||
97 (frame->IsVersion() == 1)) {
851d3db9 98 fGeometry = new AliTRDgeometryFull();
99 }
100 else {
101 Error("Ctor","Could not find valid FRAME version\n");
102 exit(1);
103 }
5c7f4665 104
bdbb05bb 105 // Save the geometry
106 TDirectory* saveDir = gDirectory;
107 gAlice->GetRunLoader()->CdGAFile();
108 fGeometry->Write("TRDgeometry");
109 saveDir->cd();
110
fe4da5cc 111 // Allocate the hit array
3dac2b2d 112 fHits = new TClonesArray("AliTRDhit" ,405);
5d12ce38 113 gAlice->GetMCApp()->AddHitList(fHits);
99d5402e 114
115 // Allocate the digits array
3dac2b2d 116 fDigits = 0;
5c7f4665 117
6244debe 118 fIshunt = 0;
793ff80c 119
6244debe 120 fGasDensity = 0;
121 fFoilDensity = 0;
793ff80c 122
6244debe 123 fDrawTR = 0;
124 fDisplayType = 0;
125
fe4da5cc 126 SetMarkerColor(kWhite);
82bbf98a 127
fe4da5cc 128}
99d5402e 129
130//_____________________________________________________________________________
73ae7b59 131AliTRD::AliTRD(const AliTRD &trd):AliDetector(trd)
8230f242 132{
133 //
134 // Copy constructor
135 //
136
dd9a6ee3 137 ((AliTRD &) trd).Copy(*this);
8230f242 138
139}
140
141//_____________________________________________________________________________
99d5402e 142AliTRD::~AliTRD()
143{
144 //
145 // TRD destructor
146 //
147
148 fIshunt = 0;
149
abaf1f1d 150 if (fGeometry) {
151 delete fGeometry;
332e9569 152 fGeometry = 0;
abaf1f1d 153 }
154 if (fHits) {
155 delete fHits;
332e9569 156 fHits = 0;
abaf1f1d 157 }
5c7f4665 158
159}
160
161//_____________________________________________________________________________
6244debe 162void AliTRD::Hits2Digits()
2ab0c725 163{
164 //
165 // Create digits
166 //
be385a87 167 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
168 digitizer.SetDebug(GetDebug());
88cb7938 169
6244debe 170 // Initialization
be385a87 171 digitizer.InitDetector();
6244debe 172
85a5290f 173 if (!fLoader->TreeH()) fLoader->LoadHits("read");
174 fLoader->LoadDigits("recreate");
175 AliRunLoader* runLoader = fLoader->GetRunLoader();
6244debe 176
85a5290f 177 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
be385a87 178 digitizer.Open(runLoader->GetFileName().Data(), iEvent);
179 digitizer.MakeDigits();
180 digitizer.WriteDigits();
6244debe 181 }
182
85a5290f 183 fLoader->UnloadHits();
184 fLoader->UnloadDigits();
a328fff9 185
6244debe 186}
187
188//_____________________________________________________________________________
189void AliTRD::Hits2SDigits()
190{
191 //
192 // Create summable digits
193 //
a328fff9 194
be385a87 195 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
6244debe 196 // For the summable digits
be385a87 197 digitizer.SetSDigits(kTRUE);
198 digitizer.SetDebug(GetDebug());
6244debe 199
200 // Initialization
be385a87 201 digitizer.InitDetector();
2ab0c725 202
85a5290f 203 if (!fLoader->TreeH()) fLoader->LoadHits("read");
204 fLoader->LoadSDigits("recreate");
205 AliRunLoader* runLoader = fLoader->GetRunLoader();
6244debe 206
85a5290f 207 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
be385a87 208 digitizer.Open(runLoader->GetFileName().Data(), iEvent);
209 digitizer.MakeDigits();
210 digitizer.WriteDigits();
85a5290f 211 }
2ab0c725 212
85a5290f 213 fLoader->UnloadHits();
214 fLoader->UnloadSDigits();
a328fff9 215
216}
6244debe 217
85a5290f 218//_____________________________________________________________________________
c92eb8ad 219AliDigitizer* AliTRD::CreateDigitizer(AliRunDigitizer* manager) const
85a5290f 220{
a328fff9 221 //
222 // Creates a new digitizer object
223 //
224
85a5290f 225 return new AliTRDdigitizer(manager);
a328fff9 226
6244debe 227}
228
229//_____________________________________________________________________________
230void AliTRD::SDigits2Digits()
231{
232 //
233 // Create final digits from summable digits
234 //
235
abaf1f1d 236 // Create the TRD digitizer
be385a87 237 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
238 digitizer.SetDebug(GetDebug());
99d5402e 239
abaf1f1d 240 // Set the parameter
be385a87 241 digitizer.SetEvent(gAlice->GetEvNumber());
abaf1f1d 242
243 // Initialization
be385a87 244 digitizer.InitDetector();
abaf1f1d 245
246 // Read the s-digits via digits manager
be385a87 247 AliTRDdigitsManager sdigitsManager;
88cb7938 248
be385a87 249 sdigitsManager.SetDebug(GetDebug());
250 sdigitsManager.SetSDigits(kTRUE);
251 sdigitsManager.CreateArrays();
88cb7938 252
253 if (!fLoader->TreeS())
254 if (fLoader->LoadSDigits("read"))
255 {
256 Error("SDigits2Digits","Error while reading SDigits for event %d",gAlice->GetEvNumber());
257 return;
258 }
259 if (!fLoader->TreeS()) return;
260
be385a87 261 sdigitsManager.ReadDigits(fLoader->TreeS());
abaf1f1d 262
263 // Add the s-digits to the input list
be385a87 264 digitizer.AddSDigitsManager(&sdigitsManager);
99d5402e 265
abaf1f1d 266 // Convert the s-digits to normal digits
be385a87 267 digitizer.SDigits2Digits();
abaf1f1d 268
269 // Store the digits
88cb7938 270 if (!fLoader->TreeD()) fLoader->MakeTree("D");
be385a87 271 if (digitizer.MakeBranch(fLoader->TreeD())){
272 digitizer.WriteDigits();
abaf1f1d 273 }
99d5402e 274
275}
276
fe4da5cc 277//_____________________________________________________________________________
b864d801 278void AliTRD::Digits2Raw()
279{
280 //
281 // convert digits of the current event to raw data
282 //
283
284 fLoader->LoadDigits();
285 TTree* digits = fLoader->TreeD();
286 if (!digits) {
287 Error("Digits2Raw", "no digits tree");
288 return;
289 }
290
291 AliTRDrawData rawWriter;
292// rawWriter.SetDebug(2);
293 if (!rawWriter.Digits2Raw(digits)) {
294 Error("AliTRD::Digits2Raw","The raw writer could not load the digits tree");
295 }
296
297 fLoader->UnloadDigits();
298
299}
300
301//_____________________________________________________________________________
332e9569 302void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
303 , Bool_t inDrift)
fe4da5cc 304{
305 //
306 // Add a hit for the TRD
332e9569 307 //
82bbf98a 308
a328fff9 309 TClonesArray &lhits = *fHits;
310 AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q);
311 if (inDrift) {
312 hit->SetDrift();
332e9569 313 }
a328fff9 314 else {
315 hit->SetAmplification();
316 }
317 if (q < 0) {
318 hit->SetTRphoton();
332e9569 319 }
82bbf98a 320
fe4da5cc 321}
322
323//_____________________________________________________________________________
324void AliTRD::BuildGeometry()
325{
326 //
327 // Create the ROOT TNode geometry for the TRD
328 //
82bbf98a 329
8230f242 330 TNode *node, *top;
fe4da5cc 331 TPGON *pgon;
793ff80c 332
333 Float_t rmin, rmax;
334 Float_t zmax1, zmax2;
db30bf0f 335
336 Int_t iPlan;
793ff80c 337
fe4da5cc 338 const Int_t kColorTRD = 46;
d3f347ff 339
fe4da5cc 340 // Find the top node alice
8230f242 341 top = gAlice->GetGeometry()->GetNode("alice");
d3f347ff 342
db30bf0f 343 if (fDisplayType == 0) {
793ff80c 344
345 pgon = new TPGON("S_TRD","TRD","void",0,360,AliTRDgeometry::Nsect(),4);
346 rmin = AliTRDgeometry::Rmin();
347 rmax = AliTRDgeometry::Rmax();
348 pgon->DefineSection(0,-AliTRDgeometry::Zmax1(),rmax,rmax);
349 pgon->DefineSection(1,-AliTRDgeometry::Zmax2(),rmin,rmax);
350 pgon->DefineSection(2, AliTRDgeometry::Zmax2(),rmin,rmax);
351 pgon->DefineSection(3, AliTRDgeometry::Zmax1(),rmax,rmax);
352 top->cd();
353 node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
354 node->SetLineColor(kColorTRD);
355 fNodes->Add(node);
356
db30bf0f 357 }
358 else if (fDisplayType == 1) {
793ff80c 359
f73816f5 360 Char_t name[7];
361
793ff80c 362 Float_t slope = (AliTRDgeometry::Zmax1() - AliTRDgeometry::Zmax2())
363 / (AliTRDgeometry::Rmax() - AliTRDgeometry::Rmin());
364
332e9569 365 rmin = AliTRDgeometry::Rmin() + AliTRDgeometry::CraHght();
366 rmax = rmin + AliTRDgeometry::CdrHght();
f73816f5 367
368 Float_t thickness = rmin - AliTRDgeometry::Rmin();
369 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
793ff80c 370 zmax1 = zmax2 + slope * AliTRDgeometry::DrThick();
793ff80c 371
db30bf0f 372 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
793ff80c 373
f73816f5 374 sprintf(name,"S_TR1%d",iPlan);
375 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
376 pgon->DefineSection(0,-zmax1,rmax,rmax);
377 pgon->DefineSection(1,-zmax2,rmin,rmax);
378 pgon->DefineSection(2, zmax2,rmin,rmax);
379 pgon->DefineSection(3, zmax1,rmax,rmax);
380 top->cd();
381 node = new TNode("TRD","TRD",name,0,0,0,"");
382 node->SetLineColor(kColorTRD);
383 fNodes->Add(node);
384
385 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
386 rmin = rmin + height;
387 rmax = rmax + height;
388 zmax1 = zmax1 + slope * height;
389 zmax2 = zmax2 + slope * height;
390
391 }
392
393 thickness += AliTRDgeometry::DrThick();
394 rmin = AliTRDgeometry::Rmin() + thickness;
395 rmax = rmin + AliTRDgeometry::AmThick();
396 zmax2 = AliTRDgeometry::Zmax2() + slope * thickness;
397 zmax1 = zmax2 + slope * AliTRDgeometry::AmThick();
398
db30bf0f 399 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
f73816f5 400
401 sprintf(name,"S_TR2%d",iPlan);
793ff80c 402 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
403 pgon->DefineSection(0,-zmax1,rmax,rmax);
404 pgon->DefineSection(1,-zmax2,rmin,rmax);
405 pgon->DefineSection(2, zmax2,rmin,rmax);
406 pgon->DefineSection(3, zmax1,rmax,rmax);
407 top->cd();
408 node = new TNode("TRD","TRD",name,0,0,0,"");
409 node->SetLineColor(kColorTRD);
410 fNodes->Add(node);
411
412 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
413 rmin = rmin + height;
414 rmax = rmax + height;
415 zmax1 = zmax1 + slope * height;
416 zmax2 = zmax2 + slope * height;
417
418 }
419
db30bf0f 420 }
d3f347ff 421
fe4da5cc 422}
423
424//_____________________________________________________________________________
e0d47c25 425void AliTRD::Copy(TObject &trd) const
8230f242 426{
427 //
428 // Copy function
429 //
430
793ff80c 431 ((AliTRD &) trd).fGeometry = fGeometry;
793ff80c 432 ((AliTRD &) trd).fGasDensity = fGasDensity;
433 ((AliTRD &) trd).fFoilDensity = fFoilDensity;
434 ((AliTRD &) trd).fDrawTR = fDrawTR;
435 ((AliTRD &) trd).fDisplayType = fDisplayType;
8230f242 436
437 //AliDetector::Copy(trd);
438
439}
440
441//_____________________________________________________________________________
82bbf98a 442void AliTRD::CreateGeometry()
fe4da5cc 443{
82bbf98a 444 //
445 // Creates the volumes for the TRD chambers
446 //
82bbf98a 447
448 // Check that FRAME is there otherwise we have no place where to put the TRD
8230f242 449 AliModule* frame = gAlice->GetModule("FRAME");
450 if (!frame) {
851d3db9 451 printf(" The TRD needs the FRAME to be defined first\n");
452 return;
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
5c7f4665 725 Int_t i;
851d3db9 726
abaf1f1d 727 if (fDebug) {
9e1a0ddb 728 printf("\n%s: ",ClassName());
729 for (i = 0; i < 35; i++) printf("*");
730 printf(" TRD_INIT ");
731 for (i = 0; i < 35; i++) printf("*");
732 printf("\n");
733 }
5c7f4665 734
d37eec5e 735 if (fGeometry->IsVersion() == 1) {
736 printf("%s: Full geometry version initialized\n",ClassName());
6f1e466d 737 if (fGeometry->GetPHOShole())
9e1a0ddb 738 printf("%s: Leave space in front of PHOS free\n",ClassName());
6f1e466d 739 if (fGeometry->GetRICHhole())
9e1a0ddb 740 printf("%s: Leave space in front of RICH free\n",ClassName());
5c7f4665 741 }
d37eec5e 742 else {
743 printf("%s: Not a valid geometry\n",ClassName());
744 }
9e1a0ddb 745
5c7f4665 746}
747
748//_____________________________________________________________________________
73ae7b59 749void AliTRD::LoadPoints(Int_t )
793ff80c 750{
751 //
752 // Store x, y, z of all hits in memory.
753 // Hit originating from TR photons are given a different color
754 //
755
332e9569 756 //if (!fDrawTR) {
757 // AliDetector::LoadPoints(track);
758 // return;
759 //}
793ff80c 760
a328fff9 761 if (fHits == 0) return;
793ff80c 762
a328fff9 763 Int_t nhits = fHits->GetEntriesFast();
793ff80c 764 if (nhits == 0) return;
765
5d12ce38 766 Int_t tracks = gAlice->GetMCApp()->GetNtrack();
793ff80c 767 if (fPoints == 0) fPoints = new TObjArray(tracks);
768
769 AliTRDhit *ahit;
770
771 Int_t *ntrkE = new Int_t[tracks];
772 Int_t *ntrkT = new Int_t[tracks];
773 Int_t *limiE = new Int_t[tracks];
774 Int_t *limiT = new Int_t[tracks];
775 Float_t **coorE = new Float_t*[tracks];
776 Float_t **coorT = new Float_t*[tracks];
777 for(Int_t i = 0; i < tracks; i++) {
778 ntrkE[i] = 0;
779 ntrkT[i] = 0;
780 coorE[i] = 0;
781 coorT[i] = 0;
782 limiE[i] = 0;
783 limiT[i] = 0;
784 }
785
332e9569 786 AliTRDpoints *points = 0;
787 Float_t *fp = 0;
788 Int_t trk;
789 Int_t chunk = nhits / 4 + 1;
793ff80c 790
791 // Loop over all the hits and store their position
332e9569 792 ahit = (AliTRDhit *) FirstHit(-1);
793 while (ahit) {
793ff80c 794
795 // dEdx hits
332e9569 796 if (ahit->GetCharge() >= 0) {
793ff80c 797
798 trk = ahit->GetTrack();
799 if (ntrkE[trk] == limiE[trk]) {
800 // Initialise a new track
801 fp = new Float_t[3*(limiE[trk]+chunk)];
802 if (coorE[trk]) {
803 memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]);
804 delete [] coorE[trk];
805 }
806 limiE[trk] += chunk;
807 coorE[trk] = fp;
808 }
809 else {
810 fp = coorE[trk];
811 }
812 fp[3*ntrkE[trk] ] = ahit->X();
813 fp[3*ntrkE[trk]+1] = ahit->Y();
814 fp[3*ntrkE[trk]+2] = ahit->Z();
815 ntrkE[trk]++;
816
817 }
818 // TR photon hits
332e9569 819 else if ((ahit->GetCharge() < 0) && (fDrawTR)) {
793ff80c 820
821 trk = ahit->GetTrack();
822 if (ntrkT[trk] == limiT[trk]) {
823 // Initialise a new track
824 fp = new Float_t[3*(limiT[trk]+chunk)];
825 if (coorT[trk]) {
826 memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]);
827 delete [] coorT[trk];
828 }
829 limiT[trk] += chunk;
830 coorT[trk] = fp;
831 }
832 else {
833 fp = coorT[trk];
834 }
835 fp[3*ntrkT[trk] ] = ahit->X();
836 fp[3*ntrkT[trk]+1] = ahit->Y();
837 fp[3*ntrkT[trk]+2] = ahit->Z();
838 ntrkT[trk]++;
839
840 }
841
332e9569 842 ahit = (AliTRDhit *) NextHit();
843
793ff80c 844 }
845
846 for (trk = 0; trk < tracks; ++trk) {
847
848 if (ntrkE[trk] || ntrkT[trk]) {
849
850 points = new AliTRDpoints();
851 points->SetDetector(this);
852 points->SetParticle(trk);
853
854 // Set the dEdx points
855 if (ntrkE[trk]) {
856 points->SetMarkerColor(GetMarkerColor());
857 points->SetMarkerSize(GetMarkerSize());
858 points->SetPolyMarker(ntrkE[trk],coorE[trk],GetMarkerStyle());
859 delete [] coorE[trk];
860 coorE[trk] = 0;
861 }
862
863 // Set the TR photon points
864 if (ntrkT[trk]) {
865 points->SetTRpoints(ntrkT[trk],coorT[trk]);
866 delete [] coorT[trk];
867 coorT[trk] = 0;
868 }
869
870 fPoints->AddAt(points,trk);
871
872 }
873
874 }
875
876 delete [] coorE;
877 delete [] coorT;
878 delete [] ntrkE;
879 delete [] ntrkT;
880 delete [] limiE;
881 delete [] limiT;
882
883}
884
885//_____________________________________________________________________________
88cb7938 886void AliTRD::MakeBranch(Option_t* option)
5c7f4665 887{
888 //
abaf1f1d 889 // Create Tree branches for the TRD digits.
5c7f4665 890 //
891
abaf1f1d 892 Int_t buffersize = 4000;
893 Char_t branchname[15];
894 sprintf(branchname,"%s",GetName());
5c7f4665 895
aa9d00f0 896 const char *cD = strstr(option,"D");
897
88cb7938 898 AliDetector::MakeBranch(option);
5c7f4665 899
abaf1f1d 900 if (fDigits && gAlice->TreeD() && cD) {
88cb7938 901 MakeBranchInTree(gAlice->TreeD(),branchname,&fDigits,buffersize,0);
abaf1f1d 902 }
903
851d3db9 904}
905
906//_____________________________________________________________________________
6244debe 907void AliTRD::ResetDigits()
908{
909 //
abaf1f1d 910 // Reset number of digits and the digits array for this detector
6244debe 911 //
912
abaf1f1d 913 fNdigits = 0;
914 if (fDigits) fDigits->Clear();
6244debe 915
916}
917
918//_____________________________________________________________________________
5c7f4665 919void AliTRD::SetTreeAddress()
920{
921 //
922 // Set the branch addresses for the trees.
923 //
924
a328fff9 925 if ( fLoader->TreeH() && (fHits == 0x0)) {
926 fHits = new TClonesArray("AliTRDhit",405);
332e9569 927 }
a328fff9 928 AliDetector::SetTreeAddress();
332e9569 929
fe4da5cc 930}
931
d3f347ff 932//_____________________________________________________________________________
793ff80c 933void AliTRD::SetPHOShole()
934{
935 //
936 // Selects a geometry with a hole in front of the PHOS
937 //
938
939 fGeometry->SetPHOShole();
940
941}
942
943//_____________________________________________________________________________
944void AliTRD::SetRICHhole()
945{
946 //
947 // Selects a geometry with a hole in front of the RICH
948 //
949
950 fGeometry->SetRICHhole();
951
952}
953
954//_____________________________________________________________________________
dd9a6ee3 955AliTRD &AliTRD::operator=(const AliTRD &trd)
956{
957 //
958 // Assignment operator
959 //
960
961 if (this != &trd) ((AliTRD &) trd).Copy(*this);
962 return *this;
963
f73816f5 964}
abaf1f1d 965
abaf1f1d 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
1292
1293
1294
1295
1296
1297
1298
1299