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