1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // Transition Radiation Detector //
21 // This class contains the basic functions for the Transition Radiation //
24 ///////////////////////////////////////////////////////////////////////////////
26 #include <TGeoGlobalMagField.h>
27 #include <TVirtualMC.h>
28 #include <TGeoManager.h>
35 #include "AliTRDdigitizer.h"
36 #include "AliTRDdigitsManager.h"
37 #include "AliTRDgeometry.h"
38 #include "AliTRDhit.h"
39 #include "AliTRDrawData.h"
40 #include "AliTRDCommonParam.h"
44 //_____________________________________________________________________________
51 ,fPrimaryIonisation(0)
54 // Default constructor
59 //_____________________________________________________________________________
60 AliTRD::AliTRD(const char *name, const char *title)
61 :AliDetector(name,title)
66 ,fPrimaryIonisation(0)
69 // Standard constructor for the TRD
72 // Check that FRAME is there otherwise we have no place where to put TRD
73 AliModule *frame = gAlice->GetModule("FRAME");
75 AliError("TRD needs FRAME to be present\n");
79 // Define the TRD geometry
80 if ((frame->IsVersion() == 0) ||
81 (frame->IsVersion() == 1)) {
82 fGeometry = new AliTRDgeometry();
85 AliError("Could not find valid FRAME version\n");
89 // Allocate the hit array
90 fHits = new TClonesArray("AliTRDhit",405);
91 gAlice->GetMCApp()->AddHitList(fHits);
95 //_____________________________________________________________________________
114 //_____________________________________________________________________________
115 void AliTRD::Hits2Digits()
121 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
122 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
125 digitizer.InitDetector();
127 if (!fLoader->TreeH()) {
128 fLoader->LoadHits("read");
130 fLoader->LoadDigits("recreate");
132 AliRunLoader *runLoader = fLoader->GetRunLoader();
134 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
135 runLoader->GetEvent(iEvent);
136 digitizer.Open(runLoader,iEvent);
137 digitizer.MakeDigits();
138 digitizer.WriteDigits();
141 fLoader->UnloadHits();
142 fLoader->UnloadDigits();
146 //_____________________________________________________________________________
147 void AliTRD::Hits2SDigits()
150 // Create summable digits
153 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
154 // For the summable digits
155 digitizer.SetSDigits(kTRUE);
156 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
159 digitizer.InitDetector();
161 if (!fLoader->TreeH()) {
162 fLoader->LoadHits("read");
164 fLoader->LoadSDigits("recreate");
166 AliRunLoader *runLoader = fLoader->GetRunLoader();
168 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
169 runLoader->GetEvent(iEvent);
170 digitizer.Open(runLoader,iEvent);
171 digitizer.MakeDigits();
172 digitizer.WriteDigits();
175 fLoader->UnloadHits();
176 fLoader->UnloadSDigits();
180 //_____________________________________________________________________________
181 AliDigitizer *AliTRD::CreateDigitizer(AliRunDigitizer *manager) const
184 // Creates a new digitizer object
187 return new AliTRDdigitizer(manager);
191 //_____________________________________________________________________________
192 void AliTRD::SDigits2Digits()
195 // Create final digits from summable digits
198 // Create the TRD digitizer
199 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
200 AliLog::SetClassDebugLevel("TRDdigitizer",AliDebugLevel());
203 digitizer.SetEvent(gAlice->GetEvNumber());
206 digitizer.InitDetector();
208 // Read the s-digits via digits manager
209 AliTRDdigitsManager sdigitsManager;
211 AliLog::SetClassDebugLevel("TRDdigitisManager",AliDebugLevel());
212 sdigitsManager.SetSDigits(kTRUE);
213 sdigitsManager.CreateArrays();
215 if (!fLoader->TreeS()) {
216 if (fLoader->LoadSDigits("read")) {
220 if (!fLoader->TreeS()) {
221 AliError(Form("Error while reading SDigits for event %d",gAlice->GetEvNumber()));
225 sdigitsManager.ReadDigits(fLoader->TreeS());
227 // Add the s-digits to the input list
228 digitizer.AddSDigitsManager(&sdigitsManager);
230 // Convert the s-digits to normal digits
231 digitizer.SDigits2Digits();
234 if (!fLoader->TreeD()) {
235 fLoader->MakeTree("D");
237 if (digitizer.MakeBranch(fLoader->TreeD())){
238 digitizer.WriteDigits();
243 //_____________________________________________________________________________
244 void AliTRD::Digits2Raw()
247 // Convert digits of the current event to raw data
250 fLoader->LoadDigits();
251 TTree *digits = fLoader->TreeD();
253 AliError("No digits tree");
257 AliTRDrawData rawWriter;
258 if (!rawWriter.Digits2Raw(digits)) {
259 AliError("The raw writer could not load the digits tree");
262 fLoader->UnloadDigits();
266 //_____________________________________________________________________________
267 void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits, Int_t q
268 , Float_t time, Bool_t inDrift)
271 // Add a hit for the TRD
274 TClonesArray &lhits = *fHits;
275 AliTRDhit *hit = new(lhits[fNhits++]) AliTRDhit(fIshunt
286 hit->SetAmplification();
295 //_____________________________________________________________________________
296 void AliTRD::CreateGeometry()
299 // Creates the volumes for the TRD chambers
302 // Check that FRAME is there otherwise we have no place where to put the TRD
303 AliModule *frame = gAlice->GetModule("FRAME");
305 AliFatal("The TRD needs the FRAME to be defined first");
308 fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
312 //_____________________________________________________________________________
313 void AliTRD::CreateMaterials()
316 // Create the materials for the TRD
319 Int_t isxfld = ((AliMagF *) TGeoGlobalMagField::Instance()->GetField())->Integ();
320 Float_t sxmgmx = ((AliMagF *) TGeoGlobalMagField::Instance()->GetField())->Max();
322 //////////////////////////////////////////////////////////////////////////
324 //////////////////////////////////////////////////////////////////////////
327 AliMaterial( 1,"Al", 26.98, 13.0, 2.7, 8.9, 37.2);
329 AliMaterial( 2,"Cu", 63.54, 29.0, 8.96, 1.43, 14.8);
331 AliMaterial( 3,"C" , 12.01, 6.0, 2.265, 18.8, 74.4);
332 // Carbon for fiber mats
333 AliMaterial( 4,"C2", 12.01, 6.0, 1.75, 18.8, 74.4);
335 AliMaterial( 5,"Sn", 118.71, 50.0, 7.31, 1.21, 14.8);
337 AliMaterial( 6,"Si", 28.09, 14.0, 2.33, 9.36, 37.2);
339 AliMaterial( 7,"Fe", 55.85, 26.0, 7.87, 1.76, 14.8);
342 Float_t aAir[4] = { 12.011 , 14.0 , 15.9994 , 36.0 };
343 Float_t zAir[4] = { 6.0 , 7.0 , 8.0 , 18.0 };
344 Float_t wAir[4] = { 0.000124, 0.755267, 0.231781, 0.012827 };
345 Float_t dAir = 1.20479e-03;
346 AliMixture(51,"Air", aAir, zAir, dAir, 4, wAir );
347 // Polyethilene (CH2)
348 Float_t ape[2] = { 12.011 , 1.0079 };
349 Float_t zpe[2] = { 6.0 , 1.0 };
350 Float_t wpe[2] = { 1.0 , 2.0 };
352 AliMixture(52,"Polyethilene", ape, zpe, dpe, -2, wpe );
354 // Xe/CO2-gas-mixture (85% / 15%)
355 Float_t aXeCO2[3] = { 131.29 , 12.0107 , 15.9994 };
356 Float_t zXeCO2[3] = { 54.0 , 6.0 , 8.0 };
357 Float_t wXeCO2[3] = { 8.5 , 1.5 , 3.0 };
359 Float_t dxe = 0.00549; // at 20C
360 Float_t dco = 0.00186; // at 20C
361 Float_t dgmXe = fxc * dxe + (1.0 - fxc) * dco;
362 // Ar/CO2-gas-mixture
363 Float_t aArCO2[3] = { 39.948 , 12.0107 , 15.9994 };
364 Float_t zArCO2[3] = { 18.0 , 6.0 , 8.0 };
365 Float_t wArCO2[3] = { 8.2 , 1.8 , 3.6 };
367 Float_t dar = 0.00166; // at 20C
368 Float_t dgmAr = fac * dar + (1.0 - fac) * dco;
369 if (AliTRDCommonParam::Instance()->IsXenon()) {
370 AliMixture(53,"XeCO2", aXeCO2, zXeCO2, dgmXe, -3, wXeCO2);
372 else if (AliTRDCommonParam::Instance()->IsArgon()) {
373 AliInfo("Gas mixture: Ar C02 (80/20)");
374 AliMixture(53,"ArCO2", aArCO2, zArCO2, dgmAr, -3, wArCO2);
377 AliFatal("Wrong gas mixture");
381 Float_t aG10[4] = { 1.0079, 12.011 , 15.9994, 28.086 };
382 Float_t zG10[4] = { 1.0 , 6.0 , 8.0 , 14.0 };
383 Float_t wG10[4] = { 0.023 , 0.194 , 0.443 , 0.340 };
385 AliMixture(54,"G10", aG10, zG10, dG10, 4,wG10 );
387 Float_t awa[2] = { 1.0079, 15.9994 };
388 Float_t zwa[2] = { 1.0 , 8.0 };
389 Float_t wwa[2] = { 2.0 , 1.0 };
391 AliMixture(55,"Water", awa, zwa, dwa, -2,wwa );
392 // Rohacell (C5H8O2), X0 = 535.005cm
393 Float_t arh[3] = { 12.011 , 1.0079, 15.9994 };
394 Float_t zrh[3] = { 6.0 , 1.0 , 8.0 };
395 Float_t wrh[3] = { 5.0 , 8.0 , 2.0 };
397 AliMixture(56,"Rohacell", arh, zrh, drh, -3,wrh );
399 Float_t aEpoxy[3] = { 15.9994, 1.0079, 12.011 };
400 Float_t zEpoxy[3] = { 8.0 , 1.0 , 6.0 };
401 Float_t wEpoxy[3] = { 3.0 , 19.0 , 18.0 };
402 Float_t dEpoxy = 1.8 ;
403 AliMixture(57,"Epoxy", aEpoxy,zEpoxy,dEpoxy,-3,wEpoxy);
404 // Araldite, low density epoxy (C18H19O3)
405 Float_t aAral[3] = { 15.9994, 1.0079, 12.011 };
406 Float_t zAral[3] = { 8.0 , 1.0 , 6.0 };
407 Float_t wAral[3] = { 3.0 , 19.0 , 18.0 };
408 Float_t dAral = 1.12; // Hardener: 1.15, epoxy: 1.1, mixture: 1/2
409 AliMixture(58,"Araldite", aAral, zAral, dAral, -3,wAral );
411 Float_t aMy[3] = { 12.011 , 1.0 , 15.9994 };
412 Float_t zMy[3] = { 6.0 , 1.0 , 8.0 };
413 Float_t wMy[3] = { 5.0 , 4.0 , 2.0 };
415 AliMixture(59,"Mylar", aMy, zMy, dMy, -3,wMy );
416 // Polypropylene (C3H6) for radiator fibers
417 Float_t app[2] = { 12.011 , 1.0079 };
418 Float_t zpp[2] = { 6.0 , 1.0 };
419 Float_t wpp[2] = { 3.0 , 6.0 };
421 AliMixture(60,"Polypropylene",app, zpp, dpp, -2,wpp );
422 // Aramide for honeycomb
423 Float_t aAra[4] = { 1.0079, 12.011 , 15.9994, 14.0067 };
424 Float_t zAra[4] = { 1.0 , 6.0 , 8.0 , 7.0 };
425 Float_t wAra[4] = { 3.0 , 1.0 , 1.0 , 1.0 };
426 Float_t dAra = 0.032;
427 AliMixture(61,"Aramide", aAra, zAra, dAra, -4,wAra );
428 // GFK for Wacosit (Epoxy + Si)
429 Float_t aGFK[4] = { 1.0079, 12.011 , 15.9994, 28.086 };
430 Float_t zGFK[4] = { 1.0 , 6.0 , 8.0 , 14.0 };
431 Float_t wGFK[4] = { 0.0445, 0.5031, 0.1118, 0.340 };
433 AliMixture(62,"GFK", aGFK, zGFK, dGFK, 4,wGFK );
435 //////////////////////////////////////////////////////////////////////////
436 // Tracking Media Parameters
437 //////////////////////////////////////////////////////////////////////////
439 // General tracking parameter
440 Float_t tmaxfd = -10.0;
441 Float_t stemax = -1.0e10;
442 Float_t deemax = -0.1;
443 Float_t epsil = 1.0e-4;
444 Float_t stmin = -0.001;
447 AliMedium( 1,"Al Frame" , 1,0,isxfld,sxmgmx
448 ,tmaxfd,stemax,deemax,epsil,stmin);
450 AliMedium( 2,"Air" ,51,0,isxfld,sxmgmx
451 ,tmaxfd,stemax,deemax,epsil,stmin);
453 AliMedium( 3,"Wires" , 2,0,isxfld,sxmgmx
454 ,tmaxfd,stemax,deemax,epsil,stmin);
455 // All other ROB materials (caps, etc.)
456 AliMedium( 4,"ROB Other" , 2,0,isxfld,sxmgmx
457 ,tmaxfd,stemax,deemax,epsil,stmin);
459 AliMedium( 5,"Padplane" , 2,1,isxfld,sxmgmx
460 ,tmaxfd,stemax,deemax,epsil,stmin);
462 AliMedium( 6,"Readout" , 2,0,isxfld,sxmgmx
463 ,tmaxfd,stemax,deemax,epsil,stmin);
465 AliMedium( 7,"Wacosit" ,62,0,isxfld,sxmgmx
466 ,tmaxfd,stemax,deemax,epsil,stmin);
467 // INOX of cooling bus bars
468 AliMedium( 8,"Cooling bus", 7,0,isxfld,sxmgmx
469 ,tmaxfd,stemax,deemax,epsil,stmin);
470 // Gas-mixture (Xe/CO2)
471 AliMedium( 9,"Gas-mix" ,53,1,isxfld,sxmgmx
472 ,tmaxfd,stemax,deemax,epsil,stmin);
474 AliMedium(10,"Honeycomb" ,61,0,isxfld,sxmgmx
475 ,tmaxfd,stemax,deemax,epsil,stmin);
477 AliMedium(11,"Glue" ,58,0,isxfld,sxmgmx
478 ,tmaxfd,stemax,deemax,epsil,stmin);
480 AliMedium(13,"G10-plates" ,54,0,isxfld,sxmgmx
481 ,tmaxfd,stemax,deemax,epsil,stmin);
483 AliMedium(14,"Water" ,55,0,isxfld,sxmgmx
484 ,tmaxfd,stemax,deemax,epsil,stmin);
485 // Rohacell for the radiator
486 AliMedium(15,"Rohacell" ,56,0,isxfld,sxmgmx
487 ,tmaxfd,stemax,deemax,epsil,stmin);
489 AliMedium(16,"MCM-Al" , 1,0,isxfld,sxmgmx
490 ,tmaxfd,stemax,deemax,epsil,stmin);
492 AliMedium(17,"MCM-Sn" , 5,0,isxfld,sxmgmx
493 ,tmaxfd,stemax,deemax,epsil,stmin);
495 AliMedium(18,"MCM-Cu" , 2,0,isxfld,sxmgmx
496 ,tmaxfd,stemax,deemax,epsil,stmin);
498 AliMedium(19,"MCM-G10" ,54,0,isxfld,sxmgmx
499 ,tmaxfd,stemax,deemax,epsil,stmin);
500 // Si in readout chips
501 AliMedium(20,"Chip-Si" , 6,0,isxfld,sxmgmx
502 ,tmaxfd,stemax,deemax,epsil,stmin);
503 // Epoxy in readout chips
504 AliMedium(21,"Chip-Ep" ,57,0,isxfld,sxmgmx
505 ,tmaxfd,stemax,deemax,epsil,stmin);
507 AliMedium(22,"Conn-PE" ,52,0,isxfld,sxmgmx
508 ,tmaxfd,stemax,deemax,epsil,stmin);
510 AliMedium(23,"Chip-Cu" , 2,0,isxfld,sxmgmx
511 ,tmaxfd,stemax,deemax,epsil,stmin);
512 // Al of cooling pipes
513 AliMedium(24,"Cooling" , 1,0,isxfld,sxmgmx
514 ,tmaxfd,stemax,deemax,epsil,stmin);
516 AliMedium(25,"Serv-Cu" , 2,0,isxfld,sxmgmx
517 ,tmaxfd,stemax,deemax,epsil,stmin);
519 AliMedium(26,"Carbon" , 4,0,isxfld,sxmgmx
520 ,tmaxfd,stemax,deemax,epsil,stmin);
522 AliMedium(27,"Mylar" ,59,0,isxfld,sxmgmx
523 ,tmaxfd,stemax,deemax,epsil,stmin);
524 // Polypropylene fibers
525 AliMedium(28,"Fiber" ,60,0,isxfld,sxmgmx
526 ,tmaxfd,stemax,deemax,epsil,stmin);
528 // Save the density values for the TRD absorbtion
531 if (AliTRDCommonParam::Instance()->IsXenon()) {
533 fGasNobleFraction = fxc;
535 else if (AliTRDCommonParam::Instance()->IsArgon()) {
537 fGasNobleFraction = fac;
542 //_____________________________________________________________________________
546 // Initialize the TRD detector after the geometry has been created
549 AliDebug(1,"++++++++++++++++++++++++++++++++++++++++++++++");
551 if (fGeometry->IsVersion() != 1) {
552 AliError("Not a valid geometry");
555 // Special tracking options for charged particles for XeCO2
556 gMC->Gstpar((* fIdtmed)[9],"DRAY" , 1.0);
557 gMC->Gstpar((* fIdtmed)[9],"STRA" , 1.0);
558 gMC->Gstpar((* fIdtmed)[9],"LOSS" ,13.0); // Specific energy loss
559 // Parameters specific to Fluka
560 //gMC->Gstpar((* fIdtmed)[9],"PRIMIO_E",23.53); // 1st ionisation potential
561 //gMC->Gstpar((* fIdtmed)[9],"PRIMIO_N",19.344431); // Number of primaries
565 //_____________________________________________________________________________
566 void AliTRD::ResetDigits()
569 // Reset number of digits and the digits array for this detector
580 //_____________________________________________________________________________
581 void AliTRD::SetTreeAddress()
584 // Set the branch addresses for the trees.
587 if (fLoader->TreeH() &&
589 fHits = new TClonesArray("AliTRDhit",405);
591 AliDetector::SetTreeAddress();
595 //_____________________________________________________________________________
596 Bool_t AliTRD::Raw2SDigits(AliRawReader *rawReader)
599 // Converts RAW data to SDigits
602 AliLoader *loader = fRunLoader->GetLoader("TRDLoader");
604 AliError("Can not get TRD loader from Run Loader");
609 tree = loader->TreeS();
611 loader->MakeTree("S");
612 tree = loader->TreeS();
615 AliTRDdigitizer digitizer("TRDdigitizer","TRD digitizer class");
617 AliTRDrawData *rawdata = new AliTRDrawData();
618 AliTRDdigitsManager *digitsManager = rawdata->Raw2Digits(rawReader);
620 // Create the s-digits manager
621 AliTRDdigitsManager *sdigitsManager = new AliTRDdigitsManager();
623 if (sdigitsManager) {
625 sdigitsManager->SetSDigits(kTRUE);
626 sdigitsManager->CreateArrays();
628 // Convert the digits into s-digits
629 digitizer.Digits2SDigits(digitsManager,sdigitsManager);
631 sdigitsManager->MakeBranch(tree);
632 sdigitsManager->WriteDigits();
634 delete digitsManager;
647 //_____________________________________________________________________________
648 AliLoader *AliTRD::MakeLoader(const Char_t *topfoldername)
651 // Create a loader for the TRD tracklets
654 fLoader = new AliLoader(GetName(),topfoldername);
656 AliInfo("Adding Tracklets-loader");
658 AliDataLoader *dl = new AliDataLoader("TRD.Tracklets.root"
661 fLoader->AddDataLoader(dl);
663 dl = new AliDataLoader("TRD.GtuTracks.root"
666 fLoader->AddDataLoader(dl);
672 //_____________________________________________________________________________
673 AliTRD &AliTRD::operator=(const AliTRD &trd)
676 // Assignment operator
680 ((AliTRD &) trd).Copy(*this);