8e36f0a2745ef3fe2fb860053b9137e93f393770
[u/mrichter/AliRoot.git] / TRD / AliTRDv0.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.15  2000/06/07 16:25:37  cblume
19 Try to remove compiler warnings on Sun and HP
20
21 Revision 1.14  2000/02/28 19:10:26  cblume
22 Include the new TRD classes
23
24 Revision 1.13.4.1  2000/02/28 18:01:53  cblume
25 Change to new hit version and introduce geometry class
26
27 Revision 1.13  1999/11/05 22:50:28  fca
28 Do not use Atan, removed from ROOT too
29
30 Revision 1.12  1999/11/02 16:35:56  fca
31 New version of TRD introduced
32
33 Revision 1.11  1999/11/01 20:41:51  fca
34 Added protections against using the wrong version of FRAME
35
36 Revision 1.10  1999/09/29 09:24:35  fca
37 Introduction of the Copyright and cvs Log
38
39 */
40
41 ///////////////////////////////////////////////////////////////////////////////
42 //                                                                           //
43 //  Transition Radiation Detector version 0 -- fast simulator                //
44 //                                                                           //
45 //Begin_Html
46 /*
47 <img src="picts/AliTRDfullClass.gif">
48 */
49 //End_Html
50 //                                                                           //
51 //                                                                           //
52 ///////////////////////////////////////////////////////////////////////////////
53
54 #include <TMath.h>
55 #include <TRandom.h>
56 #include <TVector.h>
57
58 #include "AliRun.h"
59 #include "AliMC.h"
60 #include "AliConst.h"
61   
62 #include "AliTRDv0.h"
63 #include "AliTRDgeometry.h"
64
65 ClassImp(AliTRDv0)
66   
67 //_____________________________________________________________________________
68 AliTRDv0::AliTRDv0():AliTRD() 
69 {
70   //
71   // AliTRDv0 default constructor
72   //
73
74   fIdSens     = 0;
75   fHitsOn     = 0;
76
77   fIdChamber1 = 0;
78   fIdChamber2 = 0;
79   fIdChamber3 = 0;
80
81 }
82
83 //_____________________________________________________________________________
84 AliTRDv0::AliTRDv0(const char *name, const char *title) 
85          :AliTRD(name, title) 
86 {
87   //
88   // Standard constructor for Transition Radiation Detector version 0
89   //
90
91   fIdSens     = 0;
92   fHitsOn     = 0;
93
94   fIdChamber1 = 0;
95   fIdChamber2 = 0;
96   fIdChamber3 = 0;
97
98 }
99
100 //_____________________________________________________________________________
101 AliTRDv0::~AliTRDv0()
102 {
103   //
104   // AliTRDv0 destructor
105   //
106
107 }
108
109 //_____________________________________________________________________________
110 void AliTRDv0::CreateGeometry()
111 {
112   //
113   // Create the GEANT geometry for the Transition Radiation Detector - Version 0
114   // This version covers the full azimuth. 
115   //
116
117   // Check that FRAME is there otherwise we have no place where to put the TRD
118   AliModule* frame = gAlice->GetModule("FRAME");
119   if (!frame) return;
120
121   // Define the chambers
122   AliTRD::CreateGeometry();
123
124 }
125
126 //_____________________________________________________________________________
127 void AliTRDv0::CreateMaterials()
128 {
129   //
130   // Create materials for the Transition Radiation Detector
131   //
132
133   AliTRD::CreateMaterials();
134
135 }
136
137 //_____________________________________________________________________________
138 void AliTRDv0::Init() 
139 {
140   //
141   // Initialize Transition Radiation Detector after geometry is built
142   //
143
144   AliTRD::Init();
145
146   // Identifier of the sensitive volume (amplification region)
147   fIdSens     = gMC->VolId("UL06");
148
149   // Identifier of the TRD-driftchambers
150   fIdChamber1 = gMC->VolId("UCIO");
151   fIdChamber2 = gMC->VolId("UCIM");
152   fIdChamber3 = gMC->VolId("UCII");
153
154   printf("          Fast simulator\n\n");
155   for (Int_t i = 0; i < 80; i++) printf("*");
156   printf("\n");
157   
158 }
159
160 //_____________________________________________________________________________
161 void AliTRDv0::StepManager()
162 {
163   //
164   // Procedure called at every step in the TRD
165   // Fast simulator. If switched on, a hit is produced when a track
166   // crosses the border between amplification region and pad plane.
167   //
168
169   Int_t   pla = 0; 
170   Int_t   cha = 0;
171   Int_t   sec = 0; 
172   Int_t   iIdSens, icSens; 
173   Int_t   iIdChamber, icChamber;
174
175   Float_t hits[4];
176   Int_t   det[1];
177
178   TLorentzVector p;
179   TClonesArray  &lhits = *fHits;
180
181   // Writing out hits enabled?
182   if (!(fHitsOn)) return;
183
184   // Use only charged tracks and count them only once per volume
185   if (gMC->TrackCharge()    && 
186       gMC->IsTrackExiting()) {
187     
188     // Check on sensitive volume
189     iIdSens = gMC->CurrentVolID(icSens);
190     if (iIdSens == fIdSens) { 
191
192       gMC->TrackPosition(p);
193       for (Int_t i = 0; i < 3; i++) hits[i] = p[i];
194       // No charge created
195       hits[3] = 0;
196
197       // The sector number (0 - 17)
198       // The numbering goes clockwise and starts at y = 0
199       Float_t phi = kRaddeg*TMath::ATan2(hits[0],hits[1]);
200       if (phi < 90.) 
201         phi = phi + 270.;
202       else
203         phi = phi -  90.;
204       sec = ((Int_t) (phi / 20));
205
206       // The chamber number 
207       //   0: outer left
208       //   1: middle left
209       //   2: inner
210       //   3: middle right
211       //   4: outer right
212       iIdChamber = gMC->CurrentVolOffID(1,icChamber);
213       if      (iIdChamber == fIdChamber1)
214         cha = (hits[2] < 0 ? 0 : 4);
215       else if (iIdChamber == fIdChamber2)       
216         cha = (hits[2] < 0 ? 1 : 3);
217       else if (iIdChamber == fIdChamber3)       
218         cha = 2;
219
220       // The plane number (0 - 5)
221       pla = icChamber - TMath::Nint((Float_t) (icChamber / 7)) * 6 - 1;
222
223       det[0] = fGeometry->GetDetector(pla,cha,sec);
224       new(lhits[fNhits++]) AliTRDhit(fIshunt
225                                     ,gAlice->CurrentTrack()
226                                     ,det
227                                     ,hits);
228
229     }
230
231   }  
232
233 }