]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/AliTRD.cxx
Conversion of survey data into alignable objects implemented
[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
7ca4655f 29#include <TClonesArray.h>
88cb7938 30#include <TFile.h>
31#include <TGeometry.h>
32#include <TLorentzVector.h>
fe4da5cc 33#include <TMath.h>
fe4da5cc 34#include <TNode.h>
793ff80c 35#include <TPGON.h>
332e9569 36#include <TParticle.h>
88cb7938 37#include <TROOT.h>
38#include <TTree.h>
39#include <TVirtualMC.h>
40
d3f347ff 41#include "AliConst.h"
793ff80c 42#include "AliDigit.h"
88cb7938 43#include "AliLoader.h"
45160b1f 44#include "AliLog.h"
45#include "AliMC.h"
793ff80c 46#include "AliMagF.h"
88cb7938 47#include "AliRun.h"
030b4415 48#include "AliTrackReference.h"
49
793ff80c 50#include "AliTRD.h"
793ff80c 51#include "AliTRDdigit.h"
851d3db9 52#include "AliTRDdigitizer.h"
88cb7938 53#include "AliTRDdigitsManager.h"
bd0f8685 54#include "AliTRDgeometry.h"
88cb7938 55#include "AliTRDhit.h"
56#include "AliTRDpoints.h"
b864d801 57#include "AliTRDrawData.h"
3551db50 58#include "AliTRDSimParam.h"
59#include "AliTRDRecParam.h"
60#include "AliTRDCommonParam.h"
61#include "AliTRDcalibDB.h"
62
fe4da5cc 63ClassImp(AliTRD)
64
65//_____________________________________________________________________________
66AliTRD::AliTRD()
030b4415 67 :AliDetector()
68 ,fGeometry(0)
69 ,fGasDensity(0)
70 ,fFoilDensity(0)
71 ,fDrawTR(0)
72 ,fDisplayType(0)
fe4da5cc 73{
74 //
75 // Default constructor
76 //
332e9569 77
fe4da5cc 78}
79
80//_____________________________________________________________________________
81AliTRD::AliTRD(const char *name, const char *title)
030b4415 82 :AliDetector(name,title)
83 ,fGeometry(0)
84 ,fGasDensity(0)
85 ,fFoilDensity(0)
86 ,fDrawTR(0)
87 ,fDisplayType(0)
fe4da5cc 88{
89 //
90 // Standard constructor for the TRD
91 //
92
030b4415 93 // Check that FRAME is there otherwise we have no place where to put TRD
94 AliModule *frame = gAlice->GetModule("FRAME");
8230f242 95 if (!frame) {
030b4415 96 AliError("TRD needs FRAME to be present\n");
5c7f4665 97 exit(1);
98 }
99
d37eec5e 100 // Define the TRD geometry
101 if ((frame->IsVersion() == 0) ||
102 (frame->IsVersion() == 1)) {
bd0f8685 103 fGeometry = new AliTRDgeometry();
851d3db9 104 }
105 else {
030b4415 106 AliError("Could not find valid FRAME version\n");
851d3db9 107 exit(1);
108 }
5c7f4665 109
bdbb05bb 110 // Save the geometry
030b4415 111 TDirectory *saveDir = gDirectory;
bdbb05bb 112 gAlice->GetRunLoader()->CdGAFile();
113 fGeometry->Write("TRDgeometry");
114 saveDir->cd();
115
fe4da5cc 116 // Allocate the hit array
030b4415 117 fHits = new TClonesArray("AliTRDhit",405);
5d12ce38 118 gAlice->GetMCApp()->AddHitList(fHits);
99d5402e 119
e939a978 120 //PH SetMarkerColor(kWhite);
8230f242 121
8230f242 122}
123
99d5402e 124//_____________________________________________________________________________
125AliTRD::~AliTRD()
126{
127 //
128 // TRD destructor
129 //
130
abaf1f1d 131 if (fGeometry) {
132 delete fGeometry;
030b4415 133 fGeometry = 0;
abaf1f1d 134 }
030b4415 135
abaf1f1d 136 if (fHits) {
137 delete fHits;
030b4415 138 fHits = 0;
abaf1f1d 139 }
bd0f8685 140
5c7f4665 141}
142
6244debe 143//_____________________________________________________________________________
144void AliTRD::Hits2Digits()
2ab0c725 145{
146 //
147 // Create digits
148 //
bd0f8685 149
be385a87 150 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
45160b1f 151 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
88cb7938 152
6244debe 153 // Initialization
be385a87 154 digitizer.InitDetector();
6244debe 155
030b4415 156 if (!fLoader->TreeH()) {
157 fLoader->LoadHits("read");
158 }
85a5290f 159 fLoader->LoadDigits("recreate");
95867fd1 160
030b4415 161 AliRunLoader *runLoader = fLoader->GetRunLoader();
6244debe 162
85a5290f 163 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
95867fd1 164 runLoader->GetEvent(iEvent);
165 digitizer.Open(runLoader,iEvent);
be385a87 166 digitizer.MakeDigits();
167 digitizer.WriteDigits();
6244debe 168 }
169
85a5290f 170 fLoader->UnloadHits();
171 fLoader->UnloadDigits();
a328fff9 172
6244debe 173}
174
175//_____________________________________________________________________________
176void AliTRD::Hits2SDigits()
177{
178 //
179 // Create summable digits
180 //
a328fff9 181
be385a87 182 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
6244debe 183 // For the summable digits
be385a87 184 digitizer.SetSDigits(kTRUE);
45160b1f 185 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
6244debe 186
187 // Initialization
be385a87 188 digitizer.InitDetector();
2ab0c725 189
030b4415 190 if (!fLoader->TreeH()) {
191 fLoader->LoadHits("read");
192 }
85a5290f 193 fLoader->LoadSDigits("recreate");
95867fd1 194
195 AliRunLoader *runLoader = fLoader->GetRunLoader();
6244debe 196
85a5290f 197 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
95867fd1 198 runLoader->GetEvent(iEvent);
199 digitizer.Open(runLoader,iEvent);
be385a87 200 digitizer.MakeDigits();
201 digitizer.WriteDigits();
85a5290f 202 }
2ab0c725 203
85a5290f 204 fLoader->UnloadHits();
205 fLoader->UnloadSDigits();
a328fff9 206
207}
6244debe 208
85a5290f 209//_____________________________________________________________________________
95867fd1 210AliDigitizer *AliTRD::CreateDigitizer(AliRunDigitizer *manager) const
85a5290f 211{
a328fff9 212 //
213 // Creates a new digitizer object
214 //
215
85a5290f 216 return new AliTRDdigitizer(manager);
a328fff9 217
6244debe 218}
219
220//_____________________________________________________________________________
221void AliTRD::SDigits2Digits()
222{
223 //
224 // Create final digits from summable digits
225 //
226
bd0f8685 227 // Create the TRD digitizer
be385a87 228 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
45160b1f 229 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
99d5402e 230
abaf1f1d 231 // Set the parameter
be385a87 232 digitizer.SetEvent(gAlice->GetEvNumber());
abaf1f1d 233
234 // Initialization
be385a87 235 digitizer.InitDetector();
abaf1f1d 236
237 // Read the s-digits via digits manager
be385a87 238 AliTRDdigitsManager sdigitsManager;
88cb7938 239
45160b1f 240 AliLog::SetClassDebugLevel("TRDdigitisManager",AliDebugLevel());
be385a87 241 sdigitsManager.SetSDigits(kTRUE);
242 sdigitsManager.CreateArrays();
88cb7938 243
030b4415 244 if (!fLoader->TreeS()) {
245 if (fLoader->LoadSDigits("read")) {
246 return;
247 }
248 }
249 if (!fLoader->TreeS()) {
250 AliError(Form("Error while reading SDigits for event %d",gAlice->GetEvNumber()));
251 return;
252 }
88cb7938 253
be385a87 254 sdigitsManager.ReadDigits(fLoader->TreeS());
abaf1f1d 255
256 // Add the s-digits to the input list
be385a87 257 digitizer.AddSDigitsManager(&sdigitsManager);
99d5402e 258
abaf1f1d 259 // Convert the s-digits to normal digits
be385a87 260 digitizer.SDigits2Digits();
abaf1f1d 261
262 // Store the digits
030b4415 263 if (!fLoader->TreeD()) {
264 fLoader->MakeTree("D");
265 }
be385a87 266 if (digitizer.MakeBranch(fLoader->TreeD())){
267 digitizer.WriteDigits();
abaf1f1d 268 }
99d5402e 269
270}
271
b864d801 272//_____________________________________________________________________________
273void AliTRD::Digits2Raw()
274{
275 //
030b4415 276 // Convert digits of the current event to raw data
b864d801 277 //
278
279 fLoader->LoadDigits();
030b4415 280 TTree *digits = fLoader->TreeD();
b864d801 281 if (!digits) {
030b4415 282 AliError("No digits tree");
b864d801 283 return;
284 }
285
286 AliTRDrawData rawWriter;
b864d801 287 if (!rawWriter.Digits2Raw(digits)) {
030b4415 288 AliError("The raw writer could not load the digits tree");
b864d801 289 }
290
291 fLoader->UnloadDigits();
292
293}
294
fe4da5cc 295//_____________________________________________________________________________
332e9569 296void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
297 , Bool_t inDrift)
fe4da5cc 298{
299 //
300 // Add a hit for the TRD
332e9569 301 //
82bbf98a 302
a328fff9 303 TClonesArray &lhits = *fHits;
304 AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits,q);
030b4415 305
a328fff9 306 if (inDrift) {
307 hit->SetDrift();
332e9569 308 }
a328fff9 309 else {
310 hit->SetAmplification();
311 }
030b4415 312
a328fff9 313 if (q < 0) {
314 hit->SetTRphoton();
332e9569 315 }
82bbf98a 316
fe4da5cc 317}
318
319//_____________________________________________________________________________
320void AliTRD::BuildGeometry()
321{
322 //
323 // Create the ROOT TNode geometry for the TRD
324 //
82bbf98a 325
0c5a8090 326 TNode *node;
327 TNode *top;
fe4da5cc 328 TPGON *pgon;
793ff80c 329
0c5a8090 330 // The dimensions of the TRD super module
331 const Float_t kRmin = 291.0;
332 const Float_t kRmax = 369.0;
333 const Float_t kZmax1 = 378.35;
334 const Float_t kZmax2 = 302.0;
335
030b4415 336 Float_t rmin;
337 Float_t rmax;
338 Float_t zmax1;
339 Float_t zmax2;
db30bf0f 340
341 Int_t iPlan;
793ff80c 342
fe4da5cc 343 const Int_t kColorTRD = 46;
d3f347ff 344
fe4da5cc 345 // Find the top node alice
8230f242 346 top = gAlice->GetGeometry()->GetNode("alice");
d3f347ff 347
db30bf0f 348 if (fDisplayType == 0) {
793ff80c 349
350 pgon = new TPGON("S_TRD","TRD","void",0,360,AliTRDgeometry::Nsect(),4);
0c5a8090 351 rmin = kRmin;
352 rmax = kRmax;
353 pgon->DefineSection(0,-kZmax1,rmax,rmax);
354 pgon->DefineSection(1,-kZmax2,rmin,rmax);
355 pgon->DefineSection(2, kZmax2,rmin,rmax);
356 pgon->DefineSection(3, kZmax1,rmax,rmax);
793ff80c 357 top->cd();
358 node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
359 node->SetLineColor(kColorTRD);
360 fNodes->Add(node);
361
db30bf0f 362 }
363 else if (fDisplayType == 1) {
793ff80c 364
f73816f5 365 Char_t name[7];
366
0c5a8090 367 Float_t slope = (kZmax1 - kZmax2) / (kRmax - kRmin);
793ff80c 368
0c5a8090 369 rmin = kRmin + AliTRDgeometry::CraHght();
370 rmax = rmin + AliTRDgeometry::CdrHght();
f73816f5 371
0c5a8090 372 Float_t thickness = rmin - kRmin;
373 zmax2 = kZmax2 + slope * thickness;
793ff80c 374 zmax1 = zmax2 + slope * AliTRDgeometry::DrThick();
793ff80c 375
db30bf0f 376 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
793ff80c 377
f73816f5 378 sprintf(name,"S_TR1%d",iPlan);
379 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
380 pgon->DefineSection(0,-zmax1,rmax,rmax);
381 pgon->DefineSection(1,-zmax2,rmin,rmax);
382 pgon->DefineSection(2, zmax2,rmin,rmax);
383 pgon->DefineSection(3, zmax1,rmax,rmax);
384 top->cd();
385 node = new TNode("TRD","TRD",name,0,0,0,"");
386 node->SetLineColor(kColorTRD);
387 fNodes->Add(node);
388
389 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
390 rmin = rmin + height;
391 rmax = rmax + height;
392 zmax1 = zmax1 + slope * height;
393 zmax2 = zmax2 + slope * height;
394
395 }
396
397 thickness += AliTRDgeometry::DrThick();
0c5a8090 398 rmin = kRmin + thickness;
399 rmax = rmin + AliTRDgeometry::AmThick();
400 zmax2 = kZmax2 + slope * thickness;
401 zmax1 = zmax2 + slope * AliTRDgeometry::AmThick();
f73816f5 402
db30bf0f 403 for (iPlan = 0; iPlan < AliTRDgeometry::Nplan(); iPlan++) {
f73816f5 404
405 sprintf(name,"S_TR2%d",iPlan);
793ff80c 406 pgon = new TPGON(name,"TRD","void",0,360,AliTRDgeometry::Nsect(),4);
407 pgon->DefineSection(0,-zmax1,rmax,rmax);
408 pgon->DefineSection(1,-zmax2,rmin,rmax);
409 pgon->DefineSection(2, zmax2,rmin,rmax);
410 pgon->DefineSection(3, zmax1,rmax,rmax);
411 top->cd();
412 node = new TNode("TRD","TRD",name,0,0,0,"");
413 node->SetLineColor(kColorTRD);
414 fNodes->Add(node);
415
416 Float_t height = AliTRDgeometry::Cheight() + AliTRDgeometry::Cspace();
417 rmin = rmin + height;
418 rmax = rmax + height;
419 zmax1 = zmax1 + slope * height;
420 zmax2 = zmax2 + slope * height;
421
422 }
423
db30bf0f 424 }
d3f347ff 425
fe4da5cc 426}
427
428//_____________________________________________________________________________
82bbf98a 429void AliTRD::CreateGeometry()
fe4da5cc 430{
82bbf98a 431 //
432 // Creates the volumes for the TRD chambers
433 //
82bbf98a 434
435 // Check that FRAME is there otherwise we have no place where to put the TRD
030b4415 436 AliModule *frame = gAlice->GetModule("FRAME");
8230f242 437 if (!frame) {
45160b1f 438 AliFatal("The TRD needs the FRAME to be defined first");
82bbf98a 439 }
d3f347ff 440
851d3db9 441 fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
5c7f4665 442
82bbf98a 443}
444
445//_____________________________________________________________________________
446void AliTRD::CreateMaterials()
447{
fe4da5cc 448 //
449 // Create the materials for the TRD
fe4da5cc 450 //
451
8230f242 452 Int_t isxfld = gAlice->Field()->Integ();
453 Float_t sxmgmx = gAlice->Field()->Max();
fe4da5cc 454
d3f347ff 455 // For polyethilene (CH2)
030b4415 456 Float_t ape[2] = { 12.011 , 1.0079 };
457 Float_t zpe[2] = { 6.0 , 1.0 };
458 Float_t wpe[2] = { 1.0 , 2.0 };
459 Float_t dpe = 0.95;
d3f347ff 460
d3f347ff 461 // For CO2
030b4415 462 Float_t aco[2] = { 12.011 , 15.9994 };
463 Float_t zco[2] = { 6.0 , 8.0 };
464 Float_t wco[2] = { 1.0 , 2.0 };
465 Float_t dco = 0.00186;
d3f347ff 466
467 // For water
030b4415 468 Float_t awa[2] = { 1.0079, 15.9994 };
469 Float_t zwa[2] = { 1.0 , 8.0 };
470 Float_t wwa[2] = { 2.0 , 1.0 };
471 Float_t dwa = 1.0;
d3f347ff 472
473 // For isobutane (C4H10)
030b4415 474 Float_t ais[2] = { 12.011 , 1.0079 };
475 Float_t zis[2] = { 6.0 , 1.0 };
476 Float_t wis[2] = { 4.0 , 10.0 };
477 Float_t dis = 0.00267;
d3f347ff 478
db30bf0f 479 // For plexiglas (C5H8O2)
030b4415 480 Float_t apg[3] = { 12.011 , 1.0079, 15.9994 };
481 Float_t zpg[3] = { 6.0 , 1.0 , 8.0 };
482 Float_t wpg[3] = { 5.0 , 8.0 , 2.0 };
483 Float_t dpg = 1.18;
08ca3951 484
485 // For epoxy (C18H19O3)
3dac2b2d 486 Float_t aEpoxy[3] = { 15.9994, 1.0079, 12.011 };
487 Float_t zEpoxy[3] = { 8.0 , 1.0 , 6.0 };
488 Float_t wEpoxy[3] = { 3.0 , 19.0 , 18.0 };
08ca3951 489 Float_t dEpoxy = 1.8 ;
490
0c5a8090 491 // For Araldite, low density epoxy (C18H19O3)
492 Float_t aAral[3] = { 15.9994, 1.0079, 12.011 };
493 Float_t zAral[3] = { 8.0 , 1.0 , 6.0 };
494 Float_t wAral[3] = { 3.0 , 19.0 , 18.0 };
495 Float_t dAral = 1.05;
496
08ca3951 497 // For air
3dac2b2d 498 Float_t aAir[4] = { 12.011 , 14.0 , 15.9994 , 36.0 };
499 Float_t zAir[4] = { 6.0 , 7.0 , 8.0 , 18.0 };
500 Float_t wAir[4] = { 0.000124, 0.755267, 0.231781, 0.012827 };
0c5a8090 501 Float_t dAir = 1.20479e-03;
08ca3951 502
503 // For G10
3dac2b2d 504 Float_t aG10[4] = { 1.0079 , 12.011 , 15.9994 , 28.086 };
505 Float_t zG10[4] = { 1.0 , 6.0 , 8.0 , 14.0 };
506 Float_t wG10[4] = { 0.15201 , 0.10641 , 0.49444 , 0.24714 };
08ca3951 507 Float_t dG10 = 1.7;
db30bf0f 508
d3f347ff 509 // For Xe/CO2-gas-mixture
3dac2b2d 510 Float_t aXeCO2[3] = { 131.29 , 12.0107 , 15.9994 };
511 Float_t zXeCO2[3] = { 54.0 , 6.0 , 8.0 };
330bfc2f 512 Float_t wXeCO2[3] = { 8.5 , 1.5 , 3.0 };
db30bf0f 513 // Xe-content of the Xe/CO2-mixture (85% / 15%)
3dac2b2d 514 Float_t fxc = 0.85;
515 Float_t dxe = 0.00549;
516 Float_t dgm = fxc * dxe + (1.0 - fxc) * dco;
fe4da5cc 517
d3f347ff 518 // General tracking parameter
030b4415 519 Float_t tmaxfd = -10.0;
520 Float_t stemax = -1.0e10;
521 Float_t deemax = -0.1;
522 Float_t epsil = 1.0e-4;
523 Float_t stmin = -0.001;
fe4da5cc 524
d3f347ff 525 //////////////////////////////////////////////////////////////////////////
fe4da5cc 526 // Define Materials
d3f347ff 527 //////////////////////////////////////////////////////////////////////////
528
16bf9884 529 AliMaterial( 1, "Al" , 26.98, 13.0, 2.7 , 8.9 , 37.2);
3dac2b2d 530 AliMaterial( 4, "Xe" , 131.29, 54.0, dxe , 1546.16, 0.0);
16bf9884 531 AliMaterial( 5, "Cu" , 63.54, 29.0, 8.96 , 1.43, 14.8);
532 AliMaterial( 6, "C" , 12.01, 6.0, 2.265 , 18.8 , 74.4);
16bf9884 533 AliMaterial(15, "Sn" , 118.71, 50.0, 7.31 , 1.21, 14.8);
534 AliMaterial(16, "Si" , 28.09, 14.0, 2.33 , 9.36, 37.2);
0c5a8090 535 AliMaterial(18, "Fe" , 55.85, 26.0, 7.87 , 1.76, 14.8);
d3f347ff 536
537 // Mixtures
3dac2b2d 538 AliMixture(2, "Air" , aAir, zAir, dAir, 4, wAir );
539 AliMixture(3, "Polyethilene", ape, zpe, dpe, -2, wpe );
3dac2b2d 540 AliMixture(8, "CO2", aco, zco, dco, -2, wco );
541 AliMixture(9, "Isobutane", ais, zis, dis, -2, wis );
330bfc2f 542 AliMixture(10,"Gas mixture", aXeCO2, zXeCO2, dgm, -3, wXeCO2);
3dac2b2d 543 AliMixture(12,"G10", aG10, zG10, dG10, 4, wG10 );
544 AliMixture(13,"Water", awa, zwa, dwa, -2, wwa );
545 AliMixture(14,"Plexiglas", apg, zpg, dpg, -3, wpg );
546 AliMixture(17,"Epoxy", aEpoxy, zEpoxy, dEpoxy, -3, wEpoxy);
0c5a8090 547 AliMixture(19,"Araldite", aAral, zAral, dAral, -3, wAral );
3dac2b2d 548
d3f347ff 549 //////////////////////////////////////////////////////////////////////////
fe4da5cc 550 // Tracking Media Parameters
d3f347ff 551 //////////////////////////////////////////////////////////////////////////
552
553 // Al Frame
0c5a8090 554 AliMedium( 1,"Al Frame" , 1,0,isxfld,sxmgmx
555 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 556 // Air
0c5a8090 557 AliMedium( 2,"Air" , 2,0,isxfld,sxmgmx
558 ,tmaxfd,stemax,deemax,epsil,stmin);
559 // Wires
560 AliMedium( 3,"Wires" , 5,0,isxfld,sxmgmx
561 ,tmaxfd,stemax,deemax,epsil,stmin);
562 // All other ROB materials (caps, etc.)
563 AliMedium( 4,"ROB Other" , 5,0,isxfld,sxmgmx
564 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 565 // Cu pads
0c5a8090 566 AliMedium( 5,"Padplane" , 5,1,isxfld,sxmgmx
567 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 568 // Fee + cables
0c5a8090 569 AliMedium( 6,"Readout" , 5,0,isxfld,sxmgmx
570 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 571 // C frame
0c5a8090 572 AliMedium( 7,"C Frame" , 6,0,isxfld,sxmgmx
573 ,tmaxfd,stemax,deemax,epsil,stmin);
574 // INOX of cooling bus bars
575 AliMedium( 8,"Cooling bus",18,0,isxfld,sxmgmx
576 ,tmaxfd,stemax,deemax,epsil,stmin);
3dac2b2d 577 // Gas-mixture (Xe/CO2)
0c5a8090 578 AliMedium( 9,"Gas-mix" ,10,1,isxfld,sxmgmx
579 ,tmaxfd,stemax,deemax,epsil,stmin);
580 // Nomex-honeycomb
581 AliMedium(10,"Nomex" ,12,0,isxfld,sxmgmx
582 ,tmaxfd,stemax,deemax,epsil,stmin);
583 // Araldite glue
584 AliMedium(11,"Glue" ,19,0,isxfld,sxmgmx
585 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 586 // G10-plates
0c5a8090 587 AliMedium(13,"G10-plates" ,12,0,isxfld,sxmgmx
588 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 589 // Cooling water
0c5a8090 590 AliMedium(14,"Water" ,13,0,isxfld,sxmgmx
591 ,tmaxfd,stemax,deemax,epsil,stmin);
db30bf0f 592 // Rohacell (plexiglas) for the radiator
0c5a8090 593 AliMedium(15,"Rohacell" ,14,0,isxfld,sxmgmx
594 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 595 // Al layer in MCMs
0c5a8090 596 AliMedium(16,"MCM-Al" , 1,0,isxfld,sxmgmx
597 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 598 // Sn layer in MCMs
0c5a8090 599 AliMedium(17,"MCM-Sn" ,15,0,isxfld,sxmgmx
600 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 601 // Cu layer in MCMs
0c5a8090 602 AliMedium(18,"MCM-Cu" , 5,0,isxfld,sxmgmx
603 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 604 // G10 layer in MCMs
0c5a8090 605 AliMedium(19,"MCM-G10" ,12,0,isxfld,sxmgmx
606 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 607 // Si in readout chips
0c5a8090 608 AliMedium(20,"Chip-Si" ,16,0,isxfld,sxmgmx
609 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 610 // Epoxy in readout chips
0c5a8090 611 AliMedium(21,"Chip-Ep" ,17,0,isxfld,sxmgmx
612 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 613 // PE in connectors
0c5a8090 614 AliMedium(22,"Conn-PE" , 3,0,isxfld,sxmgmx
615 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 616 // Cu in connectors
0c5a8090 617 AliMedium(23,"Chip-Cu" , 5,0,isxfld,sxmgmx
618 ,tmaxfd,stemax,deemax,epsil,stmin);
16bf9884 619 // Al of cooling pipes
0c5a8090 620 AliMedium(24,"Cooling" , 1,0,isxfld,sxmgmx
621 ,tmaxfd,stemax,deemax,epsil,stmin);
73ae7b59 622 // Cu in services
0c5a8090 623 AliMedium(25,"Serv-Cu" , 5,0,isxfld,sxmgmx
624 ,tmaxfd,stemax,deemax,epsil,stmin);
d3f347ff 625
793ff80c 626 // Save the density values for the TRD absorbtion
0c5a8090 627 Float_t dmy = 1.39;
793ff80c 628 fFoilDensity = dmy;
3dac2b2d 629 fGasDensity = dgm;
793ff80c 630
fe4da5cc 631}
632
82bbf98a 633//_____________________________________________________________________________
ba380e33 634void AliTRD::DrawModule() const
82bbf98a 635{
636 //
637 // Draw a shaded view of the Transition Radiation Detector version 0
638 //
639
640 // Set everything unseen
641 gMC->Gsatt("*" ,"SEEN",-1);
642
643 // Set ALIC mother transparent
644 gMC->Gsatt("ALIC","SEEN", 0);
645
646 // Set the volumes visible
851d3db9 647 if (fGeometry->IsVersion() == 0) {
5c7f4665 648 gMC->Gsatt("B071","SEEN", 0);
649 gMC->Gsatt("B074","SEEN", 0);
650 gMC->Gsatt("B075","SEEN", 0);
651 gMC->Gsatt("B077","SEEN", 0);
652 gMC->Gsatt("BTR1","SEEN", 0);
653 gMC->Gsatt("BTR2","SEEN", 0);
654 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 655 gMC->Gsatt("UTR1","SEEN", 0);
656 gMC->Gsatt("UTR2","SEEN", 0);
657 gMC->Gsatt("UTR3","SEEN", 0);
5c7f4665 658 }
659 else {
660 gMC->Gsatt("B071","SEEN", 0);
661 gMC->Gsatt("B074","SEEN", 0);
662 gMC->Gsatt("B075","SEEN", 0);
663 gMC->Gsatt("B077","SEEN", 0);
664 gMC->Gsatt("BTR1","SEEN", 0);
665 gMC->Gsatt("BTR2","SEEN", 0);
666 gMC->Gsatt("BTR3","SEEN", 0);
332e9569 667 gMC->Gsatt("UTR1","SEEN", 0);
5c7f4665 668 }
82bbf98a 669
670 gMC->Gdopt("hide", "on");
671 gMC->Gdopt("shad", "on");
672 gMC->Gsatt("*", "fill", 7);
673 gMC->SetClipBox(".");
674 gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
675 gMC->DefaultRange();
676 gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
677 gMC->Gdhead(1111, "Transition Radiation Detector");
678 gMC->Gdman(18, 4, "MAN");
679
680}
681
fe4da5cc 682//_____________________________________________________________________________
e0d47c25 683Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
fe4da5cc 684{
685 //
686 // Distance between the mouse and the TRD detector on the screen
687 // Dummy routine
030b4415 688 //
82bbf98a 689
690 return 9999;
691
fe4da5cc 692}
693
694//_____________________________________________________________________________
695void AliTRD::Init()
696{
697 //
851d3db9 698 // Initialize the TRD detector after the geometry has been created
fe4da5cc 699 //
82bbf98a 700
45160b1f 701 AliDebug(1,"++++++++++++++++++++++++++++++++++++++++++++++");
5c7f4665 702
bd0f8685 703 if (fGeometry->IsVersion() != 1) {
45160b1f 704 AliError("Not a valid geometry");
d37eec5e 705 }
7235aed2 706 // Special tracking options for charged particles for XeCO2
707 gMC->Gstpar((* fIdtmed)[9],"DRAY",1.0);
708 gMC->Gstpar((* fIdtmed)[9],"STRA",1.0);
9e1a0ddb 709
5c7f4665 710}
711
793ff80c 712//_____________________________________________________________________________
73ae7b59 713void AliTRD::LoadPoints(Int_t )
793ff80c 714{
715 //
716 // Store x, y, z of all hits in memory.
717 // Hit originating from TR photons are given a different color
718 //
719
030b4415 720 if (fHits == 0) {
721 return;
722 }
793ff80c 723
030b4415 724 Int_t nhits = fHits->GetEntriesFast();
725 if (nhits == 0) {
726 return;
727 }
793ff80c 728
5d12ce38 729 Int_t tracks = gAlice->GetMCApp()->GetNtrack();
030b4415 730 if (fPoints == 0) {
731 fPoints = new TObjArray(tracks);
732 }
793ff80c 733
734 AliTRDhit *ahit;
735
736 Int_t *ntrkE = new Int_t[tracks];
737 Int_t *ntrkT = new Int_t[tracks];
738 Int_t *limiE = new Int_t[tracks];
739 Int_t *limiT = new Int_t[tracks];
740 Float_t **coorE = new Float_t*[tracks];
741 Float_t **coorT = new Float_t*[tracks];
742 for(Int_t i = 0; i < tracks; i++) {
743 ntrkE[i] = 0;
744 ntrkT[i] = 0;
745 coorE[i] = 0;
746 coorT[i] = 0;
747 limiE[i] = 0;
748 limiT[i] = 0;
749 }
750
332e9569 751 AliTRDpoints *points = 0;
752 Float_t *fp = 0;
753 Int_t trk;
754 Int_t chunk = nhits / 4 + 1;
793ff80c 755
756 // Loop over all the hits and store their position
332e9569 757 ahit = (AliTRDhit *) FirstHit(-1);
758 while (ahit) {
793ff80c 759
760 // dEdx hits
332e9569 761 if (ahit->GetCharge() >= 0) {
793ff80c 762
763 trk = ahit->GetTrack();
764 if (ntrkE[trk] == limiE[trk]) {
765 // Initialise a new track
766 fp = new Float_t[3*(limiE[trk]+chunk)];
767 if (coorE[trk]) {
768 memcpy(fp,coorE[trk],sizeof(Float_t)*3*limiE[trk]);
769 delete [] coorE[trk];
770 }
771 limiE[trk] += chunk;
772 coorE[trk] = fp;
773 }
774 else {
775 fp = coorE[trk];
776 }
777 fp[3*ntrkE[trk] ] = ahit->X();
778 fp[3*ntrkE[trk]+1] = ahit->Y();
779 fp[3*ntrkE[trk]+2] = ahit->Z();
780 ntrkE[trk]++;
781
782 }
783 // TR photon hits
030b4415 784 else if ((ahit->GetCharge() < 0) &&
785 (fDrawTR)) {
793ff80c 786
787 trk = ahit->GetTrack();
788 if (ntrkT[trk] == limiT[trk]) {
789 // Initialise a new track
790 fp = new Float_t[3*(limiT[trk]+chunk)];
791 if (coorT[trk]) {
792 memcpy(fp,coorT[trk],sizeof(Float_t)*3*limiT[trk]);
793 delete [] coorT[trk];
794 }
795 limiT[trk] += chunk;
796 coorT[trk] = fp;
797 }
798 else {
799 fp = coorT[trk];
800 }
801 fp[3*ntrkT[trk] ] = ahit->X();
802 fp[3*ntrkT[trk]+1] = ahit->Y();
803 fp[3*ntrkT[trk]+2] = ahit->Z();
804 ntrkT[trk]++;
805
806 }
807
332e9569 808 ahit = (AliTRDhit *) NextHit();
809
793ff80c 810 }
811
812 for (trk = 0; trk < tracks; ++trk) {
813
814 if (ntrkE[trk] || ntrkT[trk]) {
815
816 points = new AliTRDpoints();
817 points->SetDetector(this);
818 points->SetParticle(trk);
819
820 // Set the dEdx points
821 if (ntrkE[trk]) {
e939a978 822 points->SetMarkerColor(kWhite); //PH This is the default color in TRD
823 points->SetMarkerSize(1); //PH Default size=1
824 points->SetPolyMarker(ntrkE[trk],coorE[trk],1); //PH Default style=1
793ff80c 825 delete [] coorE[trk];
826 coorE[trk] = 0;
827 }
828
829 // Set the TR photon points
830 if (ntrkT[trk]) {
831 points->SetTRpoints(ntrkT[trk],coorT[trk]);
832 delete [] coorT[trk];
833 coorT[trk] = 0;
834 }
835
836 fPoints->AddAt(points,trk);
837
838 }
839
840 }
841
842 delete [] coorE;
843 delete [] coorT;
844 delete [] ntrkE;
845 delete [] ntrkT;
846 delete [] limiE;
847 delete [] limiT;
848
849}
850
5c7f4665 851//_____________________________________________________________________________
030b4415 852void AliTRD::MakeBranch(Option_t *option)
5c7f4665 853{
854 //
abaf1f1d 855 // Create Tree branches for the TRD digits.
5c7f4665 856 //
857
abaf1f1d 858 Int_t buffersize = 4000;
859 Char_t branchname[15];
860 sprintf(branchname,"%s",GetName());
5c7f4665 861
030b4415 862 const Char_t *cD = strstr(option,"D");
aa9d00f0 863
88cb7938 864 AliDetector::MakeBranch(option);
5c7f4665 865
030b4415 866 if (fDigits &&
867 gAlice->TreeD() &&
868 cD) {
88cb7938 869 MakeBranchInTree(gAlice->TreeD(),branchname,&fDigits,buffersize,0);
030b4415 870 }
abaf1f1d 871
851d3db9 872}
873
6244debe 874//_____________________________________________________________________________
875void AliTRD::ResetDigits()
876{
877 //
abaf1f1d 878 // Reset number of digits and the digits array for this detector
6244debe 879 //
880
abaf1f1d 881 fNdigits = 0;
030b4415 882
883 if (fDigits) {
884 fDigits->Clear();
885 }
6244debe 886
887}
888
5c7f4665 889//_____________________________________________________________________________
890void AliTRD::SetTreeAddress()
891{
892 //
893 // Set the branch addresses for the trees.
894 //
895
030b4415 896 if (fLoader->TreeH() &&
897 (fHits == 0x0)) {
a328fff9 898 fHits = new TClonesArray("AliTRDhit",405);
332e9569 899 }
a328fff9 900 AliDetector::SetTreeAddress();
332e9569 901
fe4da5cc 902}
903
dd9a6ee3 904//_____________________________________________________________________________
905AliTRD &AliTRD::operator=(const AliTRD &trd)
906{
907 //
908 // Assignment operator
909 //
910
0c5a8090 911 if (this != &trd) {
912 ((AliTRD &) trd).Copy(*this);
913 }
030b4415 914
dd9a6ee3 915 return *this;
916
f73816f5 917}
abaf1f1d 918
abaf1f1d 919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252