1 /////////////////////////////////////////////////////////
2 // Manager and hits classes for set:PHOS version 1 //
3 /////////////////////////////////////////////////////////
12 // --- galice header files ---
13 #include "AliPHOSv1.h"
18 //______________________________________________________________________________
21 AliPHOSv1::AliPHOSv1()
25 //______________________________________________________________________________
27 AliPHOSv1::AliPHOSv1(const char *name, const char *title)
28 : AliPHOS(name, title)
32 //___________________________________________
33 void AliPHOSv1::CreateGeometry()
36 AliPHOS *PHOS_tmp = (AliPHOS*)gAlice->GetModule("PHOS");
39 printf("There isn't PHOS detector!\n");
42 // AliPHOS &PHOS = *PHOS_tmp;
44 //////////////////////////////////////////////////////////////////////////////
46 Int_t rotation_matrix_number=0;
50 const float cell_length = GetCrystalLength()+GetAirThickness()+GetWrapThickness()+GetPIN_Length(),
51 cell_side_size = GetCrystalSideSize()+2*GetAirThickness()+2*GetWrapThickness(),
52 // cell_angle = 180/kPI * 2 * atan(cell_side_size/2 / GetRadius()), // radians
53 cradle_thikness = cell_length + GetCPV_Thickness() + GetCPV_PHOS_Distance(),
54 distance_to_CPV = GetRadius() - GetCPV_Thickness() - GetCPV_PHOS_Distance();
56 //////////////////////////////////////////////////////////////////////////////
57 // CELL volume and subvolumes creation
58 //////////////////////////////////////////////////////////////////////////////
60 par[0] = GetCrystalSideSize()/2 + GetWrapThickness();
61 par[1] = GetCrystalSideSize()/2 + GetWrapThickness();
62 par[2] = GetCrystalLength() /2 + GetWrapThickness()/2;
63 gMC->Gsvolu("WRAP","BOX ",GetPHOS_IDTMED_Tyvek(),par,3);
65 par[0] = GetCrystalSideSize()/2;
66 par[1] = GetCrystalSideSize()/2;
67 par[2] = GetCrystalLength()/2;
68 gMC->Gsvolu("CRST","BOX ",GetPHOS_IDTMED_PbWO4(),par,3);
71 par[0] = GetPIN_SideSize()/2;
72 par[1] = GetPIN_SideSize()/2;
73 par[2] = GetPIN_Length()/2;
74 gMC->Gsvolu("PIN ","BOX ",GetPHOS_IDTMED_PIN(),par,3);
76 //////////////////////////////////////////////////////////////////////////////
77 // CRADLE,CPV creation.
78 //////////////////////////////////////////////////////////////////////////////
80 par[0] = cell_side_size/2 * GetNz();
81 par[1] = cell_side_size/2 * GetNphi();
82 par[2] = cradle_thikness/2;
83 gMC->Gsvolu("PHOS","BOX ",GetPHOS_IDTMED_AIR(),par,3);
85 //par[0] : the same as above
86 //par[1] : the same as above
87 par[2] = GetCPV_Thickness()/2;
88 gMC->Gsvolu("CPV ","BOX ",GetPHOS_IDTMED_CPV(),par,3);
92 z = (cell_length+GetCPV_PHOS_Distance())/2;
93 gMC->Gspos("CPV ",1,"PHOS",x,y,z,0,"ONLY");
95 par[0] = cell_side_size/2 * GetNz();
96 par[1] = cell_side_size/2 * GetNphi();
97 par[2] = cell_length/2;
98 gMC->Gsvolu("CRS0","BOX ",GetPHOS_IDTMED_AIR(),par,3);
102 z = -(cradle_thikness-cell_length)/2;
103 gMC->Gspos("CRS0",1,"PHOS",x,y,z,0,"ONLY");
105 gMC->Gsdvn("CRS1","CRS0",GetNphi(),2);
106 gMC->Gsdvn("CELL","CRS1",GetNz() ,1);
108 //////////////////////////////////////////////////////////////////////////////
110 //////////////////////////////////////////////////////////////////////////////
114 z = -GetWrapThickness()/2;
115 gMC->Gspos("CRST",1,"WRAP",x,y,z,0,"ONLY");
119 z = GetPIN_Length()/2;
120 gMC->Gspos("WRAP",1,"CELL",x,y,z,0,"ONLY");
124 z = -GetCrystalLength()/2-GetWrapThickness()/2;
125 gMC->Gspos("PIN ",1,"CELL",x,y,z,0,"ONLY");
127 //////////////////////////////////////////////////////////////////////////////
128 // CELL has been created.
129 //////////////////////////////////////////////////////////////////////////////
132 // z = -(GetCPV_Thickness()+GetCPV_PHOS_Distance())/2;
134 // for( int iy=0; iy<GetNphi(); iy++ )
136 // y = (iy-(GetNphi()-1)/2.)*cell_side_size;
137 // for( int ix=0; ix<GetNz(); ix++ )
139 // x = (ix-(GetNz()-1)/2.)*cell_side_size;
140 // gMC->Gspos("CELL",++n,"PHOS",x,y,z,0,"ONLY");
144 //////////////////////////////////////////////////////////////////////////////
145 // End of CRADLE creation.
146 //////////////////////////////////////////////////////////////////////////////
149 //////////////////////////////////////////////////////////////////////////////
151 //////////////////////////////////////////////////////////////////////////////
153 for( int i=0; i<GetCradlesAmount(); i++ )
155 float c = distance_to_CPV, // Distance to CPV
156 l = cell_side_size*GetNphi()/2, // Cradle half size around beam (for rect. geom.)
157 cradle_angle = 360/kPI*atan(l/c),
158 cradle_angle_pos = -90+(i-(GetCradlesAmount()-1)/2.) * (cradle_angle+GetAngleBetweenCradles());
159 // Cradles are numerated in clock reversed order. (general way of angle increment)
161 float r = GetRadius() + cradle_thikness/2;
162 x = r*cos(cradle_angle_pos*kPI/180);
163 y = r*sin(cradle_angle_pos*kPI/180);
165 AliMatrix(rotation_matrix_number, 0,0 , 90,90+cradle_angle_pos , 90,180+cradle_angle_pos);
166 gMC->Gspos("PHOS",i+1,"ALIC",x,y,z,rotation_matrix_number,"ONLY");
168 GetCradleAngle(i) = cradle_angle_pos;
170 // int n = PHOS.fCradles->GetEntries();
171 // PHOS.fCradles->Add(new AliPHOSCradle( 1, // geometry.
172 // GetCrystalSideSize (),
173 // GetCrystalLength (),
174 // GetWrapThickness (),
175 // GetAirThickness (),
176 // GetPIN_SideSize (),
179 // GetCPV_Thickness (),
180 // GetCPV_PHOS_Distance (),
183 // cradle_angle_pos ));
185 // if( n+1 != PHOS.fCradles->GetEntries() ||
186 // NULL == PHOS.fCradles->At(n) )
188 // cout << " Can not create or add AliPHOSCradle.\n";
194 //////////////////////////////////////////////////////////////////////////////
196 // Print some information.
197 //////////////////////////////////////////////////////////////////////////////
200 void AliPHOSv1::StepManager()
202 static Bool_t inwold=0; // Status of previous ctrak->inwvol
205 int cradle_number, cell_Z, cell_Phi; // Variables that describe cell position.
207 if( gMC->GetMedium() == GetPHOS_IDTMED_PIN() && (gMC->IsTrackInside() || gMC->IsTrackExiting()==2) && inwold && gMC->TrackCharge()!=0 )
209 // GEANT particle just have entered into PIN diode.
211 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
213 gMC->CurrentVolOffID(4,copy);
214 cradle_number = copy-1;
215 gMC->CurrentVolOffID(1,copy);
217 gMC->CurrentVolOffID(2,copy);
220 cradle_number = cvolu->number[cvolu->nlevel-5]-1;
221 cell_Z = cvolu->number[cvolu->nlevel-2]-1;
222 cell_Phi = cvolu->number[cvolu->nlevel-3]-1;
225 TH2S &h = PHOS.GetCradle(cradle_number).fChargedTracksInPIN;
226 h.AddBinContent(h.GetBin(cell_Z,cell_Phi));
229 //////////////////////////////////////////////////////////////////////////////
231 if( gMC->GetMedium() == GetPHOS_IDTMED_PbWO4() )
233 // GEANT particle into crystal.
235 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
237 gMC->CurrentVolOffID(5,copy);
238 cradle_number = copy-1;
239 gMC->CurrentVolOffID(2,copy);
241 gMC->CurrentVolOffID(3,copy);
244 cradle_number = cvolu->number[cvolu->nlevel-6]-1;
245 cell_Z = cvolu->number[cvolu->nlevel-3]-1;
246 cell_Phi = cvolu->number[cvolu->nlevel-4]-1;
248 TH2F &h = PHOS.GetCradle(cradle_number).fCellEnergy;
249 h.AddBinContent(h.GetBin(cell_Z,cell_Phi),gMC->Edep());
252 //////////////////////////////////////////////////////////////////////////////
254 if( gMC->GetMedium()==GetPHOS_IDTMED_CPV() && (gMC->IsTrackInside() || gMC->IsTrackExiting()) && inwold )
256 // GEANT particle just have entered into CPV detector.
258 AliPHOS &PHOS = *(AliPHOS*)gAlice->GetModule("PHOS");
260 gMC->CurrentVolOffID(1,cradle_number);
262 // cradle_number = cvolu->number[cvolu->nlevel-2]-1;
264 // Save CPV x,y hits position of charged particles.
266 AliPHOSCradle &cradle = PHOS.GetCradle(cradle_number);
270 gMC->TrackPosition(xyz);
273 float R = cradle.GetRadius() - cradle.GetCPV_PHOS_Distance() - cradle.GetCPV_Thikness();
274 cradle.GetXY(xyz.Vect(),v,R,x,y,l);
275 if( PHOS.fDebugLevel>0 )
277 printf("PHOS_STEP: warning: negative distance to CPV!! %f\n", l);
279 // Store current particle in the list of Cradle particles.
281 gMC->TrackMomentum(pmom);
285 Int_t Ipart = gMC->TrackPid();
287 // TClonesArray &P=cradle.GetParticles();
288 // new( P[P.GetEntries()] ) AliPHOSgamma(x,0,y,0,ctrak->getot,0,Px,Py,Pz);
289 cradle.GetParticles().Add(new AliPHOSgamma(x,y,gMC->Etot(),Px,Py,Pz,Ipart));
291 if( gMC->TrackCharge()!=0 )
292 cradle.AddCPVHit(x,y);
295 inwold=gMC->IsTrackEntering(); // Save current status of GEANT variable.