fcc367568ae39c690f6e9144baaa1c2c9735d18c
[u/mrichter/AliRoot.git] / TRD / AliTRD.cxx
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
16 /*
17 $Log$
18 Revision 1.17.2.1  2000/05/08 14:28:59  cblume
19 Introduced SetPHOShole() and SetRICHhole(). AliTRDrecPoint container is now a TObjArray
20
21 Revision 1.17  2000/02/28 19:10:26  cblume
22 Include the new TRD classes
23
24 Revision 1.16.2.2  2000/02/28 17:53:24  cblume
25 Introduce TRD geometry classes
26
27 Revision 1.16.2.1  2000/02/28 17:04:19  cblume
28 Include functions and data members for AliTRDrecPoint
29
30 Revision 1.16  2000/01/19 17:17:35  fca
31 Introducing a list of lists of hits -- more hits allowed for detector now
32
33 Revision 1.15  1999/11/02 17:04:25  fca
34 Small syntax change for HP compiler
35
36 Revision 1.14  1999/11/02 16:57:02  fca
37 Avoid non ansi warnings on HP compilers
38
39 Revision 1.13  1999/11/02 16:35:56  fca
40 New version of TRD introduced
41
42 Revision 1.12  1999/11/01 20:41:51  fca
43 Added protections against using the wrong version of FRAME
44
45 Revision 1.11  1999/09/29 09:24:34  fca
46 Introduction of the Copyright and cvs Log
47
48 */
49
50 ///////////////////////////////////////////////////////////////////////////////
51 //                                                                           //
52 //  Transition Radiation Detector                                            //
53 //  This class contains the basic functions for the Transition Radiation     //
54 //  Detector.                                                                //
55 //                                                                           //
56 ///////////////////////////////////////////////////////////////////////////////
57
58 #include <stdlib.h>
59
60 #include <TMath.h>
61 #include <TNode.h>
62 #include <TPGON.h> 
63
64 #include "AliTRD.h"
65 #include "AliRun.h"
66 #include "AliConst.h"
67 #include "AliTRDdigitizer.h"
68 #include "AliTRDclusterizer.h"
69 #include "AliTRDgeometryHole.h"
70 #include "AliTRDgeometryFull.h"
71 #include "AliTRDrecPoint.h"
72  
73 ClassImp(AliTRD)
74  
75 //_____________________________________________________________________________
76 AliTRD::AliTRD()
77 {
78   //
79   // Default constructor
80   //
81
82   fIshunt      = 0;
83   fGasMix      = 0;
84   fHits        = 0;
85   fDigits      = 0;
86
87   fRecPoints   = 0;
88   fNRecPoints  = 0;
89
90   fGeometry    = 0;
91
92 }
93  
94 //_____________________________________________________________________________
95 AliTRD::AliTRD(const char *name, const char *title)
96        : AliDetector(name,title)
97 {
98   //
99   // Standard constructor for the TRD
100   //
101
102   // Check that FRAME is there otherwise we have no place where to
103   // put TRD
104   AliModule* FRAME=gAlice->GetModule("FRAME");
105   if (!FRAME) {
106     Error("Ctor","TRD needs FRAME to be present\n");
107     exit(1);
108   } 
109
110   // Define the TRD geometry according to the FRAME geometry
111   if      (FRAME->IsVersion() == 0) {
112     // Geometry with hole
113     fGeometry = new AliTRDgeometryHole();
114   }
115   else if (FRAME->IsVersion() == 1) {
116     // Geometry without hole
117     fGeometry = new AliTRDgeometryFull();
118   }
119   else {
120     Error("Ctor","Could not find valid FRAME version\n");
121     exit(1);
122   }
123
124   // Allocate the hit array
125   fHits       = new TClonesArray("AliTRDhit"     ,405);
126   gAlice->AddHitList(fHits);
127
128   // Allocate the digits array
129   fDigits     = 0;
130
131   // Allocate the rec point array
132   fRecPoints  = new TObjArray(400);
133   fNRecPoints = 0;
134    
135   fIshunt = 0;
136   fGasMix = 0;
137
138   SetMarkerColor(kWhite);   
139
140 }
141
142 //_____________________________________________________________________________
143 AliTRD::~AliTRD()
144 {
145   //
146   // TRD destructor
147   //
148
149   fIshunt = 0;
150
151   delete fGeometry;
152   delete fHits;
153   delete fRecPoints;
154
155 }
156
157 //_____________________________________________________________________________
158 void AliTRD::AddRecPoint(Float_t *pos, Int_t *digits, Int_t det, Float_t amp)
159 {
160   //
161   // Add a reconstructed point for the TRD
162   //
163   
164   AliTRDrecPoint *RecPoint = new AliTRDrecPoint();
165   TVector3        posVec(pos[0],pos[1],pos[2]);
166   RecPoint->SetLocalPosition(posVec);
167   RecPoint->SetDetector(det);
168   RecPoint->SetEnergy(amp);
169   for (Int_t iDigit = 0; iDigit < 3; iDigit++) {
170     RecPoint->AddDigit(digits[iDigit]);
171   }
172
173   fRecPoints->Add(RecPoint);
174
175 }
176
177 //_____________________________________________________________________________
178 void AliTRD::AddDigit(Int_t *digits)
179 {
180   //
181   // Add a digit for the TRD
182   //
183
184   TClonesArray &ldigits = *fDigits;
185   new(ldigits[fNdigits++]) AliTRDdigit(kFALSE,digits);
186
187 }
188
189 //_____________________________________________________________________________
190 void AliTRD::AddHit(Int_t track, Int_t det, Float_t *hits)
191 {
192   //
193   // Add a hit for the TRD
194   //
195
196   TClonesArray &lhits = *fHits;
197   new(lhits[fNhits++]) AliTRDhit(fIshunt,track,det,hits);
198
199 }
200
201 //_____________________________________________________________________________
202 void AliTRD::BuildGeometry()
203 {
204   //
205   // Create the ROOT TNode geometry for the TRD
206   //
207
208   TNode *Node, *Top;
209   TPGON *pgon;
210   const Int_t kColorTRD = 46;
211   
212   // Find the top node alice
213   Top = gAlice->GetGeometry()->GetNode("alice");
214   
215   pgon = new TPGON("S_TRD","TRD","void",0,360,kNsect,4);
216   Float_t ff    = TMath::Cos(kDegrad * 180 / kNsect);
217   Float_t rrmin = kRmin / ff;
218   Float_t rrmax = kRmax / ff;
219   pgon->DefineSection(0,-kZmax1,rrmax,rrmax);
220   pgon->DefineSection(1,-kZmax2,rrmin,rrmax);
221   pgon->DefineSection(2, kZmax2,rrmin,rrmax);
222   pgon->DefineSection(3, kZmax1,rrmax,rrmax);
223   Top->cd();
224   Node = new TNode("TRD","TRD","S_TRD",0,0,0,"");
225   Node->SetLineColor(kColorTRD);
226   fNodes->Add(Node);
227
228 }
229  
230 //_____________________________________________________________________________
231 void AliTRD::CreateGeometry()
232 {
233   //
234   // Creates the volumes for the TRD chambers
235   //
236
237   // Check that FRAME is there otherwise we have no place where to put the TRD
238   AliModule* FRAME = gAlice->GetModule("FRAME");
239   if (!FRAME) {
240     printf(" The TRD needs the FRAME to be defined first\n");
241     return;
242   }
243
244   fGeometry->CreateGeometry(fIdtmed->GetArray() - 1299);
245
246 }
247  
248 //_____________________________________________________________________________
249 void AliTRD::CreateMaterials()
250 {
251   //
252   // Create the materials for the TRD
253   // Origin Y.Foka
254   //
255
256   Int_t   ISXFLD = gAlice->Field()->Integ();
257   Float_t SXMGMX = gAlice->Field()->Max();
258   
259   // For polyethilene (CH2) 
260   Float_t ape[2] = { 12., 1. };
261   Float_t zpe[2] = {  6., 1. };
262   Float_t wpe[2] = {  1., 2. };
263   Float_t dpe    = 0.95;
264
265   // For mylar (C5H4O2) 
266   Float_t amy[3] = { 12., 1., 16. };
267   Float_t zmy[3] = {  6., 1.,  8. };
268   Float_t wmy[3] = {  5., 4.,  2. };
269   Float_t dmy    = 1.39;
270
271   // For CO2 
272   Float_t aco[2] = { 12., 16. };
273   Float_t zco[2] = {  6.,  8. };
274   Float_t wco[2] = {  1.,  2. };
275   Float_t dco    = 0.001977;
276
277   // For water
278   Float_t awa[2] = {  1., 16. };
279   Float_t zwa[2] = {  1.,  8. };
280   Float_t wwa[2] = {  2.,  1. };
281   Float_t dwa    = 1.0;
282
283   // For isobutane (C4H10)
284   Float_t ais[2] = { 12.,  1. };
285   Float_t zis[2] = {  6.,  1. };
286   Float_t wis[2] = {  4., 10. };
287   Float_t dis    = 0.00267;
288
289   // For Xe/CO2-gas-mixture 
290   // Xe-content of the Xe/CO2-mixture (90% / 10%) 
291   Float_t fxc    = .90;
292   // Xe-content of the Xe/Isobutane-mixture (97% / 3%) 
293   Float_t fxi    = .97;
294   Float_t dxe    = .005858;
295   
296   // General tracking parameter
297   Float_t tmaxfd = -10.;
298   Float_t stemax = -1e10;
299   Float_t deemax = -0.1;
300   Float_t epsil  =  1e-4;
301   Float_t stmin  = -0.001;
302   
303   Float_t absl, radl, d, buf[1];
304   Float_t agm[2], dgm, zgm[2], wgm[2];
305   Int_t   nbuf;
306   
307   //////////////////////////////////////////////////////////////////////////
308   //     Define Materials 
309   //////////////////////////////////////////////////////////////////////////
310
311   AliMaterial( 1, "Al $",  26.98, 13.0, 2.7     ,     8.9 ,    37.2);
312   AliMaterial( 2, "Air$",  14.61,  7.3, 0.001205, 30420.0 , 67500.0);
313   AliMaterial( 4, "Xe $", 131.29, 54.0, dxe     ,  1447.59,     0.0);
314   AliMaterial( 5, "Cu $",  63.54, 29.0, 8.96    ,     1.43,    14.8);
315   AliMaterial( 6, "C  $",  12.01,  6.0, 2.265   ,    18.8 ,    74.4);
316   AliMaterial(12, "G10$",  20.00, 10.0, 1.7     ,    19.4 ,   999.0);
317
318   // Mixtures 
319   AliMixture(3, "Polyethilene$",   ape, zpe, dpe, -2, wpe);
320   AliMixture(7, "Mylar$",          amy, zmy, dmy, -3, wmy);
321   AliMixture(8, "CO2$",            aco, zco, dco, -2, wco);
322   AliMixture(9, "Isobutane$",      ais, zis, dis, -2, wis);
323   AliMixture(13,"Water$",          awa, zwa, dwa, -2, wwa);
324
325   // Gas mixtures
326   Char_t namate[21];
327   // Xe/CO2-mixture
328   // Get properties of Xe 
329   gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
330   // Get properties of CO2 
331   gMC->Gfmate((*fIdmate)[8], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
332   // Create gas mixture 
333   wgm[0] = fxc;
334   wgm[1] = 1. - fxc;
335   dgm    = wgm[0] * dxe + wgm[1] * dco;
336   AliMixture(10, "Gas mixture 1$", agm, zgm, dgm,  2, wgm);
337   // Xe/Isobutane-mixture
338   // Get properties of Xe 
339   gMC->Gfmate((*fIdmate)[4], namate, agm[0], zgm[0], d, radl, absl, buf, nbuf);
340   // Get properties of Isobutane
341   gMC->Gfmate((*fIdmate)[9], namate, agm[1], zgm[1], d, radl, absl, buf, nbuf);
342   // Create gas mixture 
343   wgm[0] = fxi;
344   wgm[1] = 1. - fxi;
345   dgm    = wgm[0] * dxe + wgm[1] * dis;
346   AliMixture(11, "Gas mixture 2$", agm, zgm, dgm,  2, wgm);
347  
348   //////////////////////////////////////////////////////////////////////////
349   //     Tracking Media Parameters 
350   //////////////////////////////////////////////////////////////////////////
351
352   // Al Frame 
353   AliMedium(1, "Al Frame$",   1, 0, ISXFLD, SXMGMX
354                 , tmaxfd, stemax, deemax, epsil, stmin);
355   // Air 
356   AliMedium(2, "Air$",        2, 0, ISXFLD, SXMGMX
357                 , tmaxfd, stemax, deemax, epsil, stmin);
358   // Polyethilene 
359   AliMedium(3, "Radiator$",   3, 0, ISXFLD, SXMGMX
360                 , tmaxfd, stemax, deemax, epsil, stmin);
361   // Xe 
362   AliMedium(4, "Xe$",         4, 1, ISXFLD, SXMGMX
363                 , tmaxfd, stemax, deemax, epsil, stmin);
364   // Cu pads 
365   AliMedium(5, "Padplane$",   5, 1, ISXFLD, SXMGMX
366                 , tmaxfd, stemax, deemax, epsil, stmin);
367   // Fee + cables 
368   AliMedium(6, "Readout$",    1, 0, ISXFLD, SXMGMX
369                 , tmaxfd, stemax, deemax, epsil, stmin);
370   // C frame 
371   AliMedium(7, "C Frame$",    6, 0, ISXFLD, SXMGMX
372                 , tmaxfd, stemax, deemax, epsil, stmin);
373   // Mylar foils 
374   AliMedium(8, "Mylar$",      7, 0, ISXFLD, SXMGMX
375                 , tmaxfd, stemax, deemax, epsil, stmin);
376   if (fGasMix == 1) {
377     // Gas-mixture (Xe/CO2) 
378     AliMedium(9, "Gas-mix$",   10, 1, ISXFLD, SXMGMX
379                   , tmaxfd, stemax, deemax, epsil, stmin);
380   }
381   else {
382     // Gas-mixture (Xe/Isobutane) 
383     AliMedium(9, "Gas-mix$",   11, 1, ISXFLD, SXMGMX
384                   , tmaxfd, stemax, deemax, epsil, stmin);
385   }
386   // Nomex-honeycomb (use carbon for the time being) 
387   AliMedium(10, "Nomex$",      6, 0, ISXFLD, SXMGMX
388                 , tmaxfd, stemax, deemax, epsil, stmin);
389   // Kapton foils (use Mylar for the time being) 
390   AliMedium(11, "Kapton$",     7, 0, ISXFLD, SXMGMX
391                 , tmaxfd, stemax, deemax, epsil, stmin);
392   // Gas-filling of the radiator 
393   AliMedium(12, "CO2$",        8, 0, ISXFLD, SXMGMX
394                 , tmaxfd, stemax, deemax, epsil, stmin);
395   // G10-plates
396   AliMedium(13, "G10-plates$",12, 0, ISXFLD, SXMGMX
397                 , tmaxfd, stemax, deemax, epsil, stmin);
398   // Cooling water
399   AliMedium(14, "Water$",     13, 0, ISXFLD, SXMGMX
400                 , tmaxfd, stemax, deemax, epsil, stmin);
401
402 }
403
404 //_____________________________________________________________________________
405 void AliTRD::DrawModule()
406 {
407   //
408   // Draw a shaded view of the Transition Radiation Detector version 0
409   //
410
411   // Set everything unseen
412   gMC->Gsatt("*"   ,"SEEN",-1);
413   
414   // Set ALIC mother transparent
415   gMC->Gsatt("ALIC","SEEN", 0);
416   
417   // Set the volumes visible
418   if (fGeometry->IsVersion() == 0) {
419     gMC->Gsatt("B071","SEEN", 0);
420     gMC->Gsatt("B074","SEEN", 0);
421     gMC->Gsatt("B075","SEEN", 0);
422     gMC->Gsatt("B077","SEEN", 0);
423     gMC->Gsatt("BTR1","SEEN", 0);
424     gMC->Gsatt("BTR2","SEEN", 0);
425     gMC->Gsatt("BTR3","SEEN", 0);
426     gMC->Gsatt("TRD1","SEEN", 0);
427     gMC->Gsatt("TRD2","SEEN", 0);
428     gMC->Gsatt("TRD3","SEEN", 0);
429   }
430   else {
431     gMC->Gsatt("B071","SEEN", 0);
432     gMC->Gsatt("B074","SEEN", 0);
433     gMC->Gsatt("B075","SEEN", 0);
434     gMC->Gsatt("B077","SEEN", 0);
435     gMC->Gsatt("BTR1","SEEN", 0);
436     gMC->Gsatt("BTR2","SEEN", 0);
437     gMC->Gsatt("BTR3","SEEN", 0);
438     gMC->Gsatt("TRD1","SEEN", 0);
439     if (fGeometry->GetPHOShole())
440       gMC->Gsatt("TRD2","SEEN", 0);
441     if (fGeometry->GetRICHhole())
442       gMC->Gsatt("TRD3","SEEN", 0);
443   }
444   gMC->Gsatt("UCII","SEEN", 0);
445   gMC->Gsatt("UCIM","SEEN", 0);
446   gMC->Gsatt("UCIO","SEEN", 0);
447   gMC->Gsatt("UL02","SEEN", 1);
448   gMC->Gsatt("UL05","SEEN", 1);
449   gMC->Gsatt("UL06","SEEN", 1);
450   
451   gMC->Gdopt("hide", "on");
452   gMC->Gdopt("shad", "on");
453   gMC->Gsatt("*", "fill", 7);
454   gMC->SetClipBox(".");
455   gMC->SetClipBox("*", 0, 2000, -2000, 2000, -2000, 2000);
456   gMC->DefaultRange();
457   gMC->Gdraw("alic", 40, 30, 0, 12, 9.4, .021, .021);
458   gMC->Gdhead(1111, "Transition Radiation Detector");
459   gMC->Gdman(18, 4, "MAN");
460
461 }
462
463 //_____________________________________________________________________________
464 Int_t AliTRD::DistancetoPrimitive(Int_t , Int_t )
465 {
466   //
467   // Distance between the mouse and the TRD detector on the screen
468   // Dummy routine
469   
470   return 9999;
471
472 }
473  
474 //_____________________________________________________________________________
475 void AliTRD::Init()
476 {
477   //
478   // Initialize the TRD detector after the geometry has been created
479   //
480
481   Int_t i;
482
483   printf("\n");
484   for (i = 0; i < 35; i++) printf("*");
485   printf(" TRD_INIT ");
486   for (i = 0; i < 35; i++) printf("*");
487   printf("\n");
488   printf("\n");
489
490   if      (fGeometry->IsVersion() == 0) {
491     printf("          Geometry for spaceframe with holes initialized.\n\n");
492   }
493   else if (fGeometry->IsVersion() == 1) {
494     printf("          Geometry for spaceframe without holes initialized.\n");
495     if (fGeometry->GetPHOShole())
496       printf("          Leave space in front of PHOS free.\n");
497     if (fGeometry->GetRICHhole())
498       printf("          Leave space in front of RICH free.\n");
499     printf("\n");
500   }
501
502   if (fGasMix == 1)
503     printf("          Gas Mixture: 90%% Xe + 10%% CO2\n\n");
504   else
505     printf("          Gas Mixture: 97%% Xe + 3%% Isobutane\n\n");
506
507 }
508
509 //_____________________________________________________________________________
510 void AliTRD::MakeBranch(Option_t* option)
511 {
512   //
513   // Create Tree branches for the TRD digits and cluster.
514   //
515
516   Int_t  buffersize = 4000;
517   Char_t branchname[15];
518
519   AliDetector::MakeBranch(option);
520
521   Char_t *R = strstr(option,"R");
522   sprintf(branchname,"%srecPoints",GetName());
523   if (fRecPoints && gAlice->TreeR() && R) {
524     gAlice->TreeR()->Branch(branchname,fRecPoints->IsA()->GetName()
525                            ,&fRecPoints,buffersize,0);
526     printf("* AliTRD::MakeBranch * Making Branch %s for points in TreeR\n",branchname);
527   }
528
529 }
530
531 //_____________________________________________________________________________
532 void AliTRD::ResetRecPoints()
533 {
534   //
535   // Reset number of reconstructed points and the point array
536   //
537
538   fNRecPoints = 0;
539   if (fRecPoints) fRecPoints->Delete();
540
541 }
542
543 //_____________________________________________________________________________
544 void AliTRD::SetTreeAddress()
545 {
546   //
547   // Set the branch addresses for the trees.
548   //
549
550   Char_t branchname[15];
551
552   AliDetector::SetTreeAddress();
553
554   TBranch *branch;
555   TTree   *treeR = gAlice->TreeR();
556
557   if (treeR) {
558     sprintf(branchname,"%srecPoints",GetName());
559     if (fRecPoints) {
560       branch = treeR->GetBranch(branchname);
561       if (branch) {
562         branch->SetAddress(&fRecPoints);
563       }
564     }
565   }
566
567 }
568
569 //_____________________________________________________________________________
570 void AliTRD::SetGasMix(Int_t imix)
571 {
572   //
573   // Defines the gas mixture (imix=0:  Xe/Isobutane imix=1: Xe/CO2)
574   //
575   
576   if ((imix < 0) || (imix > 1)) {
577     printf("Wrong input value: %d\n",imix);
578     printf("Use standard setting\n");
579     fGasMix = 0;
580     return;
581   }
582
583   fGasMix = imix;
584
585 }
586