]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PHOS/AliPHOSv1.cxx
Minor mods to prevent compiler and ROOT warnings
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv1.cxx
CommitLineData
fe4da5cc 1/////////////////////////////////////////////////////////
2// Manager and hits classes for set:PHOS version 1 //
3/////////////////////////////////////////////////////////
4
5// --- ROOT system ---
6#include "TH1.h"
7#include "TRandom.h"
8#include "TFile.h"
9#include "TTree.h"
10#include "TBRIK.h"
11#include "TNode.h"
bc9ab547 12#include "TMath.h"
fe4da5cc 13
14// --- galice header files ---
15#include "AliPHOSv1.h"
16#include "AliRun.h"
17#include "TGeant3.h"
18
19ClassImp(AliPHOSv1)
20
21//______________________________________________________________________________
22
23
8c933dd7 24AliPHOSv1::AliPHOSv1()
fe4da5cc 25{
26}
27
28//______________________________________________________________________________
29
30AliPHOSv1::AliPHOSv1(const char *name, const char *title)
31 : AliPHOS(name, title)
32{
33}
34
35//___________________________________________
36void AliPHOSv1::CreateGeometry()
37{
38
39 AliMC* pMC = AliMC::GetMC();
40
6435828c 41 AliPHOS *PHOS_tmp = (AliPHOS*)gAlice->GetModule("PHOS");
fe4da5cc 42 if( NULL==PHOS_tmp )
43 {
44 printf("There isn't PHOS detector!\n");
45 return;
46 }
47// AliPHOS &PHOS = *PHOS_tmp;
48
49 //////////////////////////////////////////////////////////////////////////////
50
51 Int_t rotation_matrix_number=0;
52 Float_t par[11],
53 x,y,z;
54
55 const float cell_length = GetCrystalLength()+GetAirThickness()+GetWrapThickness()+GetPIN_Length(),
56 cell_side_size = GetCrystalSideSize()+2*GetAirThickness()+2*GetWrapThickness(),
bc9ab547 57// cell_angle = 180/kPI * 2 * atan(cell_side_size/2 / GetRadius()), // radians
fe4da5cc 58 cradle_thikness = cell_length + GetCPV_Thickness() + GetCPV_PHOS_Distance(),
59 distance_to_CPV = GetRadius() - GetCPV_Thickness() - GetCPV_PHOS_Distance();
60
61 //////////////////////////////////////////////////////////////////////////////
62 // CELL volume and subvolumes creation
63 //////////////////////////////////////////////////////////////////////////////
64
65 par[0] = GetCrystalSideSize()/2 + GetWrapThickness();
66 par[1] = GetCrystalSideSize()/2 + GetWrapThickness();
67 par[2] = GetCrystalLength() /2 + GetWrapThickness()/2;
68 pMC->Gsvolu("WRAP","BOX ",GetPHOS_IDTMED_Tyvek(),par,3);
69
70 par[0] = GetCrystalSideSize()/2;
71 par[1] = GetCrystalSideSize()/2;
72 par[2] = GetCrystalLength()/2;
73 pMC->Gsvolu("CRST","BOX ",GetPHOS_IDTMED_PbWO4(),par,3);
74
75 // PIN
76 par[0] = GetPIN_SideSize()/2;
77 par[1] = GetPIN_SideSize()/2;
78 par[2] = GetPIN_Length()/2;
79 pMC->Gsvolu("PIN ","BOX ",GetPHOS_IDTMED_PIN(),par,3);
80
81 //////////////////////////////////////////////////////////////////////////////
82 // CRADLE,CPV creation.
83 //////////////////////////////////////////////////////////////////////////////
84
85 par[0] = cell_side_size/2 * GetNz();
86 par[1] = cell_side_size/2 * GetNphi();
87 par[2] = cradle_thikness/2;
88 pMC->Gsvolu("PHOS","BOX ",GetPHOS_IDTMED_AIR(),par,3);
89
90//par[0] : the same as above
91//par[1] : the same as above
92 par[2] = GetCPV_Thickness()/2;
93 pMC->Gsvolu("CPV ","BOX ",GetPHOS_IDTMED_CPV(),par,3);
94
95 x = 0;
96 y = 0;
97 z = (cell_length+GetCPV_PHOS_Distance())/2;
98 pMC->Gspos("CPV ",1,"PHOS",x,y,z,0,"ONLY");
99
100 par[0] = cell_side_size/2 * GetNz();
101 par[1] = cell_side_size/2 * GetNphi();
102 par[2] = cell_length/2;
103 pMC->Gsvolu("CRS0","BOX ",GetPHOS_IDTMED_AIR(),par,3);
104
105 x = 0;
106 y = 0;
107 z = -(cradle_thikness-cell_length)/2;
108 pMC->Gspos("CRS0",1,"PHOS",x,y,z,0,"ONLY");
109
110 pMC->Gsdvn("CRS1","CRS0",GetNphi(),2);
111 pMC->Gsdvn("CELL","CRS1",GetNz() ,1);
112
113 //////////////////////////////////////////////////////////////////////////////
114 // CELL creation
115 //////////////////////////////////////////////////////////////////////////////
116
117 x = 0;
118 y = 0;
119 z = -GetWrapThickness()/2;
120 pMC->Gspos("CRST",1,"WRAP",x,y,z,0,"ONLY");
121
122 x = 0;
123 y = 0;
124 z = GetPIN_Length()/2;
125 pMC->Gspos("WRAP",1,"CELL",x,y,z,0,"ONLY");
126
127 x = 0;
128 y = 0;
129 z = -GetCrystalLength()/2-GetWrapThickness()/2;
130 pMC->Gspos("PIN ",1,"CELL",x,y,z,0,"ONLY");
131
132 //////////////////////////////////////////////////////////////////////////////
133 // CELL has been created.
134 //////////////////////////////////////////////////////////////////////////////
135
136// int n=0;
137// z = -(GetCPV_Thickness()+GetCPV_PHOS_Distance())/2;
138//
139// for( int iy=0; iy<GetNphi(); iy++ )
140// {
141// y = (iy-(GetNphi()-1)/2.)*cell_side_size;
142// for( int ix=0; ix<GetNz(); ix++ )
143// {
144// x = (ix-(GetNz()-1)/2.)*cell_side_size;
145// pMC->Gspos("CELL",++n,"PHOS",x,y,z,0,"ONLY");
146// }
147// }
148
149 //////////////////////////////////////////////////////////////////////////////
150 // End of CRADLE creation.
151 //////////////////////////////////////////////////////////////////////////////
152
153
154 //////////////////////////////////////////////////////////////////////////////
155 // PHOS creation
156 //////////////////////////////////////////////////////////////////////////////
157
158 for( int i=0; i<GetCradlesAmount(); i++ )
159 {
160 float c = distance_to_CPV, // Distance to CPV
161 l = cell_side_size*GetNphi()/2, // Cradle half size around beam (for rect. geom.)
bc9ab547 162 cradle_angle = 360/kPI*atan(l/c),
fe4da5cc 163 cradle_angle_pos = -90+(i-(GetCradlesAmount()-1)/2.) * (cradle_angle+GetAngleBetweenCradles());
164 // Cradles are numerated in clock reversed order. (general way of angle increment)
165
166 float r = GetRadius() + cradle_thikness/2;
bc9ab547 167 x = r*cos(cradle_angle_pos*kPI/180);
168 y = r*sin(cradle_angle_pos*kPI/180);
fe4da5cc 169 z = 0;
170 AliMatrix(rotation_matrix_number, 0,0 , 90,90+cradle_angle_pos , 90,180+cradle_angle_pos);
171 pMC->Gspos("PHOS",i+1,"ALIC",x,y,z,rotation_matrix_number,"ONLY");
172
173 GetCradleAngle(i) = cradle_angle_pos;
174//
175// int n = PHOS.fCradles->GetEntries();
176// PHOS.fCradles->Add(new AliPHOSCradle( 1, // geometry.
177// GetCrystalSideSize (),
178// GetCrystalLength (),
179// GetWrapThickness (),
180// GetAirThickness (),
181// GetPIN_SideSize (),
182// GetPIN_Length (),
183// GetRadius (),
184// GetCPV_Thickness (),
185// GetCPV_PHOS_Distance (),
186// GetNz (),
187// GetNphi (),
188// cradle_angle_pos ));
189//
190// if( n+1 != PHOS.fCradles->GetEntries() ||
191// NULL == PHOS.fCradles->At(n) )
192// {
193// cout << " Can not create or add AliPHOSCradle.\n";
194// exit(1);
195// }
196 }
197 AddPHOSCradles();
198
199 //////////////////////////////////////////////////////////////////////////////
200 // All is done.
201 // Print some information.
202 //////////////////////////////////////////////////////////////////////////////
203}
204
205void AliPHOSv1::StepManager()
206{
207 static Bool_t inwold=0; // Status of previous ctrak->inwvol
208 AliMC *MC = AliMC::GetMC();
209 Int_t copy;
210
fe4da5cc 211 int cradle_number, cell_Z, cell_Phi; // Variables that describe cell position.
212
213 if( MC->GetMedium() == GetPHOS_IDTMED_PIN() && (MC->TrackInside() || MC->TrackExiting()==2) && inwold && MC->TrackCharge()!=0 )
214 {
215 // GEANT particle just have entered into PIN diode.
216
6435828c 217 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
fe4da5cc 218
219 MC->CurrentVolOff(4,0,copy);
220 cradle_number = copy-1;
221 MC->CurrentVolOff(1,0,copy);
222 cell_Z = copy-1;
223 MC->CurrentVolOff(2,0,copy);
224 cell_Phi = copy-1;
225/*
226 cradle_number = cvolu->number[cvolu->nlevel-5]-1;
227 cell_Z = cvolu->number[cvolu->nlevel-2]-1;
228 cell_Phi = cvolu->number[cvolu->nlevel-3]-1;
229*/
230
231 TH2S &h = PHOS.GetCradle(cradle_number).fChargedTracksInPIN;
232 h.AddBinContent(h.GetBin(cell_Z,cell_Phi));
233 }
234
235 //////////////////////////////////////////////////////////////////////////////
236
bc9ab547 237 if( MC->GetMedium() == GetPHOS_IDTMED_PbWO4() )
fe4da5cc 238 {
239 // GEANT particle into crystal.
240
6435828c 241 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
fe4da5cc 242
243 MC->CurrentVolOff(5,0,copy);
244 cradle_number = copy-1;
245 MC->CurrentVolOff(2,0,copy);
246 cell_Z = copy-1;
247 MC->CurrentVolOff(3,0,copy);
248 cell_Phi = copy-1;
249/*
250 cradle_number = cvolu->number[cvolu->nlevel-6]-1;
251 cell_Z = cvolu->number[cvolu->nlevel-3]-1;
252 cell_Phi = cvolu->number[cvolu->nlevel-4]-1;
253*/
254 TH2F &h = PHOS.GetCradle(cradle_number).fCellEnergy;
255 h.AddBinContent(h.GetBin(cell_Z,cell_Phi),MC->Edep());
256 }
257
258 //////////////////////////////////////////////////////////////////////////////
259
260 if( MC->GetMedium()==GetPHOS_IDTMED_CPV() && (MC->TrackInside() || MC->TrackExiting()) && inwold )
261 {
262 // GEANT particle just have entered into CPV detector.
263
6435828c 264 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
fe4da5cc 265
266 MC->CurrentVolOff(1,0,cradle_number);
267 cradle_number--;
268// cradle_number = cvolu->number[cvolu->nlevel-2]-1;
269
270 // Save CPV x,y hits position of charged particles.
271
272 AliPHOSCradle &cradle = PHOS.GetCradle(cradle_number);
273
274 Float_t xyz[3];
275 MC->TrackPosition(xyz);
bc9ab547 276 TVector3 p(xyz[0],xyz[1],xyz[2]),v;
fe4da5cc 277
278 float x,y,l;
279 float R = cradle.GetRadius() - cradle.GetCPV_PHOS_Distance() - cradle.GetCPV_Thikness();
280 cradle.GetXY(p,v,R,x,y,l);
281 if( PHOS.fDebugLevel>0 )
282 if( l<0 )
283 printf("PHOS_STEP: warning: negative distance to CPV!! %f\n", l);
284
285 // Store current particle in the list of Cradle particles.
286 Float_t pmom[4];
287 MC->TrackMomentum(pmom);
288 float Px = pmom[0] * pmom[3],
289 Py = pmom[1] * pmom[3],
290 Pz = pmom[2] * pmom[3];
bc9ab547 291 Int_t Ipart = MC->TrackPid();
fe4da5cc 292
293// TClonesArray &P=cradle.GetParticles();
294// new( P[P.GetEntries()] ) AliPHOSgamma(x,0,y,0,ctrak->getot,0,Px,Py,Pz);
bc9ab547 295 cradle.GetParticles().Add(new AliPHOSgamma(x,y,MC->Etot(),Px,Py,Pz,Ipart));
fe4da5cc 296
297 if( MC->TrackCharge()!=0 )
298 cradle.AddCPVHit(x,y);
299 }
300
301 inwold=MC->TrackEntering(); // Save current status of GEANT variable.
302}
303