1 /////////////////////////////////////////////////////////
2 // Manager and hits classes for set:PHOS version 3 //
3 /////////////////////////////////////////////////////////
13 // --- galice header files ---
14 #include "AliPHOSv3.h"
20 //______________________________________________________________________________
23 AliPHOSv3::AliPHOSv3()
27 //______________________________________________________________________________
29 AliPHOSv3::AliPHOSv3(const char *name, const char *title)
30 : AliPHOS(name, title)
34 //___________________________________________
35 void AliPHOSv3::CreateGeometry()
38 cout << "AliPHOSv3::CreateGeometry() PHOS creation\n";
40 AliPHOS *PHOS_tmp = (AliPHOS*)gAlice->GetModule("PHOS");
43 printf("There isn't PHOS detector!\n");
46 // AliPHOS &PHOS = *PHOS_tmp;
48 //////////////////////////////////////////////////////////////////////////////
50 Int_t rotation_matrix_number=0;
54 const float cell_length = GetCrystalLength()+GetAirThickness()+GetWrapThickness()+GetPIN_Length(),
55 cell_side_size = GetCrystalSideSize()+2*GetAirThickness()+2*GetWrapThickness(),
56 // cell_angle = 180/kPI * 2 * atan(cell_side_size/2 / GetRadius()), // radians
57 cradle_thikness = cell_length + GetCPV_Thickness() + GetCPV_PHOS_Distance(),
58 distance_to_CPV = GetRadius() - GetCPV_Thickness() - GetCPV_PHOS_Distance();
60 //////////////////////////////////////////////////////////////////////////////
61 // CELL volume and subvolumes creation
62 //////////////////////////////////////////////////////////////////////////////
64 par[0] = GetCrystalSideSize()/2 + GetWrapThickness();
65 par[1] = GetCrystalSideSize()/2 + GetWrapThickness();
66 par[2] = GetCrystalLength() /2 + GetWrapThickness()/2;
67 gMC->Gsvolu("WRAP","BOX ",GetPHOS_IDTMED_Tyvek(),par,3);
69 par[0] = GetCrystalSideSize()/2;
70 par[1] = GetCrystalSideSize()/2;
71 par[2] = GetCrystalLength()/2;
72 gMC->Gsvolu("CRST","BOX ",GetPHOS_IDTMED_PbWO4(),par,3);
75 par[0] = GetPIN_SideSize()/2;
76 par[1] = GetPIN_SideSize()/2;
77 par[2] = GetPIN_Length()/2;
78 gMC->Gsvolu("PIN ","BOX ",GetPHOS_IDTMED_PIN(),par,3);
80 //////////////////////////////////////////////////////////////////////////////
81 // CRADLE,CPV creation.
82 //////////////////////////////////////////////////////////////////////////////
84 par[0] = cell_side_size/2 * GetNz();
85 par[1] = cell_side_size/2 * GetNphi();
86 par[2] = cradle_thikness/2;
87 gMC->Gsvolu("PHOS","BOX ",GetPHOS_IDTMED_AIR(),par,3);
89 //par[0] : the same as above
90 //par[1] : the same as above
91 par[2] = GetCPV_Thickness()/2;
92 gMC->Gsvolu("CPV ","BOX ",GetPHOS_IDTMED_CPV(),par,3);
96 z = (cell_length+GetCPV_PHOS_Distance())/2;
97 gMC->Gspos("CPV ",1,"PHOS",x,y,z,0,"ONLY");
99 par[0] = cell_side_size/2 * GetNz();
100 par[1] = cell_side_size/2 * GetNphi();
101 par[2] = cell_length/2;
102 gMC->Gsvolu("CRS0","BOX ",GetPHOS_IDTMED_AIR(),par,3);
106 z = -(cradle_thikness-cell_length)/2;
107 gMC->Gspos("CRS0",1,"PHOS",x,y,z,0,"ONLY");
109 gMC->Gsdvn("CRS1","CRS0",GetNphi(),2);
110 gMC->Gsdvn("CELL","CRS1",GetNz() ,1);
112 //////////////////////////////////////////////////////////////////////////////
114 //////////////////////////////////////////////////////////////////////////////
118 z = -GetWrapThickness()/2;
119 gMC->Gspos("CRST",1,"WRAP",x,y,z,0,"ONLY");
123 z = GetPIN_Length()/2;
124 gMC->Gspos("WRAP",1,"CELL",x,y,z,0,"ONLY");
128 z = -GetCrystalLength()/2-GetWrapThickness()/2;
129 gMC->Gspos("PIN ",1,"CELL",x,y,z,0,"ONLY");
131 //////////////////////////////////////////////////////////////////////////////
132 // CELL has been created.
133 //////////////////////////////////////////////////////////////////////////////
136 // z = -(GetCPV_Thickness()+GetCPV_PHOS_Distance())/2;
138 // for( int iy=0; iy<GetNphi(); iy++ )
140 // y = (iy-(GetNphi()-1)/2.)*cell_side_size;
141 // for( int ix=0; ix<GetNz(); ix++ )
143 // x = (ix-(GetNz()-1)/2.)*cell_side_size;
144 // gMC->Gspos("CELL",++n,"PHOS",x,y,z,0,"ONLY");
148 //////////////////////////////////////////////////////////////////////////////
149 // End of CRADLE creation.
150 //////////////////////////////////////////////////////////////////////////////
153 //////////////////////////////////////////////////////////////////////////////
155 //////////////////////////////////////////////////////////////////////////////
157 for( int i=0; i<GetCradlesAmount(); i++ )
159 float c = distance_to_CPV, // Distance to CPV
160 l = cell_side_size*GetNphi()/2, // Cradle half size around beam (for rect. geom.)
161 cradle_angle = 360/kPI*atan(l/c),
162 cradle_angle_pos = -90+(i-(GetCradlesAmount()-1)/2.) * (cradle_angle+GetAngleBetweenCradles());
163 // Cradles are numerated in clock reversed order. (general way of angle increment)
165 float r = GetRadius() + cradle_thikness/2;
166 x = r*cos(cradle_angle_pos*kPI/180);
167 y = r*sin(cradle_angle_pos*kPI/180);
169 AliMatrix(rotation_matrix_number, 0,0 , 90,90+cradle_angle_pos , 90,180+cradle_angle_pos);
170 gMC->Gspos("PHOS",i+1,"ALIC",x,y,z,rotation_matrix_number,"ONLY");
172 GetCradleAngle(i) = cradle_angle_pos;
174 // int n = PHOS.fCradles->GetEntries();
175 // PHOS.fCradles->Add(new AliPHOSCradle( 1, // geometry.
176 // GetCrystalSideSize (),
177 // GetCrystalLength (),
178 // GetWrapThickness (),
179 // GetAirThickness (),
180 // GetPIN_SideSize (),
183 // GetCPV_Thickness (),
184 // GetCPV_PHOS_Distance (),
187 // cradle_angle_pos ));
189 // if( n+1 != PHOS.fCradles->GetEntries() ||
190 // NULL == PHOS.fCradles->At(n) )
192 // cout << " Can not create or add AliPHOSCradle.\n";
198 //////////////////////////////////////////////////////////////////////////////
200 // Print some information.
201 //////////////////////////////////////////////////////////////////////////////
204 void AliPHOSv3::StepManager()
206 static Bool_t inwold=0; // Status of previous ctrak->inwvol
209 // if( gMC->TrackEntering() ) {
210 // Int_t Volume_ID = gMC->CurrentVol(Volume_name, copy);
211 // cout << "AliPHOSv3::StepManager() entered to PHOS to the volume " << Volume_name << "!\n";
214 int cradle_number, cell_Z, cell_Phi; // Variables that describe cell position.
216 if( gMC->GetMedium()==GetPHOS_IDTMED_PIN() && gMC->IsTrackEntering() && gMC->TrackCharge()!=0 )
218 // GEANT particle just have entered into PIN diode.
220 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
222 gMC->CurrentVolOffID(4,copy);
223 cradle_number = copy-1;
224 gMC->CurrentVolOffID(1,copy);
226 gMC->CurrentVolOffID(2,copy);
229 TH2S &h = PHOS.GetCradle(cradle_number).fChargedTracksInPIN;
230 h.AddBinContent(h.GetBin(cell_Z,cell_Phi));
232 // cout << "AliPHOSv3::StepManager() entered to PHOS pin diode\n";
233 // cout << " cradle_nimber = " << cradle_number << endl;
234 // cout << " cell_z = " << cell_Z << endl;
235 // cout << " cell_Phi = " << cell_Phi << endl;
238 //////////////////////////////////////////////////////////////////////////////
240 if( gMC->GetMedium() == GetPHOS_IDTMED_PbWO4() )
242 // GEANT particle into crystal.
244 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
246 gMC->CurrentVolOffID(5,copy);
247 cradle_number = copy-1;
248 gMC->CurrentVolOffID(2,copy);
250 gMC->CurrentVolOffID(3,copy);
253 TH2F &h = PHOS.GetCradle(cradle_number).fCellEnergy;
254 h.AddBinContent(h.GetBin(cell_Z,cell_Phi),gMC->Edep());
257 //////////////////////////////////////////////////////////////////////////////
259 if( gMC->GetMedium()==GetPHOS_IDTMED_CPV() && gMC->IsTrackEntering() )
261 // GEANT particle just have entered into CPV detector.
263 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
265 gMC->CurrentVolOffID(1,cradle_number);
268 // Save CPV x,y hits position of charged particles.
270 AliPHOSCradle &cradle = PHOS.GetCradle(cradle_number);
273 gMC->TrackPosition(p);
277 float R = cradle.GetRadius() - cradle.GetCPV_PHOS_Distance() - cradle.GetCPV_Thikness();
278 cradle.GetXY(p.Vect(),v,R,x,y,l);
279 if( PHOS.fDebugLevel>0 )
281 printf("PHOS_STEP: warning: negative distance to CPV!! %f\n", l);
283 // Store current particle in the list of Cradle particles.
285 gMC->TrackMomentum(pmom);
286 Float_t Px = pmom[0],
289 Float_t Getot = pmom[3];
290 Int_t Ipart = gMC->TrackPid();
292 cradle.GetParticles().Add(new AliPHOSgamma(x,y,Getot,Px,Py,Pz,Ipart));
294 // printf ("Cradle %i, x,y = %8.3f, %8.3f cm, E,Px,Py,Pz = %8.3f, %8.3f, %8.3f GeV, %8.3f, Ipart = %i\n",
295 // cradle_number,x,y,Getot,Px,Py,Pz,Ipart);
299 inwold=gMC->IsTrackEntering(); // Save current status of GEANT variable.