source: trunk/source/event/test/GeneralParticleSource/src/ExamplePrimaryGeneratorAction.cc @ 1316

Last change on this file since 1316 was 1316, checked in by garnier, 14 years ago

update geant4-09-04-beta-cand-01 interfaces-V09-03-09 vis-V09-03-08

File size: 12.0 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26
27#include "ExamplePrimaryGeneratorAction.hh"
28#include "G4Event.hh"
29#include "G4ParticleTable.hh"
30#include "G4ParticleDefinition.hh"
31#include "globals.hh"
32#include "G4ThreeVector.hh"
33
34#include "G4GeneralParticleSource.hh"
35
36ExamplePrimaryGeneratorAction::ExamplePrimaryGeneratorAction()
37{
38  //DEBUG
39  DebugXmin = -999999.;
40
41  particleGun = new G4GeneralParticleSource ();
42}
43
44ExamplePrimaryGeneratorAction::~ExamplePrimaryGeneratorAction()
45{
46  //  if(verbosityLevel == 2)
47  //{
48      // Always give the user debug info.
49
50  G4cout << "Output of DEBUG stuff" << G4endl;
51  G4cout << "positional stuff" << G4endl;
52  G4cout << "Scale, X, Scale, Y, Scale, Z" << G4endl;
53  G4double scalex, scaley, scalez;
54  G4int i;
55  for( i=0; i<100; i++)
56    {
57      scalex = DebugXmin + (i+1)*DebugXStep;
58      scaley = DebugYmin + (i+1)*DebugYStep;
59      scalez = DebugZmin + (i+1)*DebugZStep;
60      G4cout << scalex << "   " << debugx[i] << "     " << scaley << "   " << debugy[i] << "     " << scalez << "   " << debugz[i] << G4endl;
61    }
62 
63  G4cout << "Scale, Number Px, Py, Pz, Scale, Number Theta, Scale, Number Phi" << G4endl;
64  G4double scalep, scalet, scalephi;
65  for(i=0; i<100; i++)
66    {
67      scalep = -1 + (i+1)*0.02;
68      scalet = (i+1) * (pi/100.);
69      scalephi = (i+1) * (twopi/100.);
70      G4cout << scalep << "   " << debugpx[i] << "   " << debugpy[i] << "   " << debugpz[i] << "     " << scalet << "   " << debugtheta[i] << "     " << scalephi << "   " << debugphi[i] << G4endl;
71    }
72 
73  G4cout << "Initial Energy,  No. Of Events" << G4endl;
74  G4double ene_out = 0.;
75  for(i=0; i<100; i++)
76    {
77      if(EneDisType == "Mono")
78        ene_out = emin/2. + (i+1)*debug_energy_step;
79      //      else if(EneDisType == "Arb")
80      //{
81      //  if(IntType == "Spline")
82      //    ene_out = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(0)) + (i+1)*debug_energy_step;
83      //  else
84      //    ene_out = ArbEnergyH.GetLowEdgeEnergy(size_t(0)) + (i+1)*debug_energy_step;
85      //}
86      //else if(EnergyDisType == "Epn")
87      //{
88      //  ene_out = IPDFEnergyH.GetLowEdgeEnergy(size_t(0)) + (i+1)*debug_energy_step;
89      //}
90      else
91        ene_out = emin + (i+1)*debug_energy_step;
92      G4cout << ene_out << "       " << debugenergy[i] << G4endl;
93    }
94  //}
95  //  G4cout << "About to delete particleGun " << G4endl;
96  delete particleGun;
97  //G4cout << "Deleted particleGun " << G4endl;
98}
99
100void ExamplePrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
101{
102  //G4cout << "About to generate primary vertex" << G4endl;
103  particleGun->GeneratePrimaryVertex(anEvent);
104  //G4cout << "Back " << DebugXmin << G4endl;
105
106  if(DebugXmin == -999999.)
107    {
108    SourceType = particleGun->GetPosDisType();
109    //G4cout << "SourceType " << SourceType << G4endl;
110    SourceShape = particleGun->GetPosDisShape();
111    //G4cout << "SourceShape " << SourceShape << G4endl;
112    radius = particleGun->GetRadius();
113    //G4cout << "radius " << radius << G4endl;
114    halfx = particleGun->GetHalfX();
115    //G4cout << "halfx " << halfx << G4endl;
116    halfy = particleGun->GetHalfY();
117    //G4cout << "halfy " << halfy << G4endl;
118    halfz = particleGun->GetHalfZ();
119    //G4cout << "halfz " << halfz << G4endl;
120    centre = particleGun->GetCentreCoords();
121    //G4cout << "centre " << centre << G4endl;
122
123    // for use with energy
124    EneDisType = particleGun->GetEnergyDisType();
125    //G4cout << "EneDisType " << EneDisType << G4endl;
126    InterpolationType = particleGun->GetIntType();
127    //G4cout << "InterpolationType " << InterpolationType << G4endl;
128    if(EneDisType == "Arb")
129      {
130        emin = particleGun->GetArbEmin();
131        //G4cout << "emin " << emin << G4endl;
132        emax = particleGun->GetArbEmax();
133        //G4cout << "emax " << emax << G4endl;
134      }
135    else
136      {
137        emin = particleGun->GetEmin();
138        //G4cout << "emin " << emin << G4endl;
139        emax = particleGun->GetEmax();
140        //G4cout << "emax " << emax << G4endl;
141      }
142    }
143 
144  G4ThreeVector ParticlePos = particleGun->GetParticlePosition();
145  //G4cout << "ParticlePos " << ParticlePos << G4endl;
146  G4ThreeVector ParticleMomDir = particleGun->GetParticleMomentumDirection();
147  //G4cout << "ParticleMomDir " << ParticleMomDir << G4endl;
148
149  //G4cout << "Starting DEBUG stuff " << DebugXmin << G4endl;
150  // DEBUG SECTION
151  //  if(verbosityLevel == 2)
152  // G4cout << "Collecting DEBUG info" <<G4endl;
153  G4int idebug = 0;
154  // position
155  if(DebugXmin == -999999.)
156    {
157      //G4cout << "Here 11 " << SourceType << " " << centre <<G4endl;
158      if(SourceType == "Point")
159        {
160          // DEBUG - make Xmin etc 0.5 * point and Xmax etc 1.5 * point
161          if(centre.x() == 0.0)
162            {
163              DebugXmin = -2.;
164              DebugXmax = 2.;
165            }
166          else
167            {
168              DebugXmin = centre.x() * 0.5;
169              DebugXmax = centre.x() * 1.5;
170            }
171
172          if(centre.y() == 0.0)
173            {
174              DebugYmin = -2.;
175              DebugYmax = 2.;
176            }
177          else
178            {
179              DebugYmin = centre.y() * 0.5;
180              DebugYmax = centre.y() * 1.5;
181            }
182
183          if(centre.z() == 0.0)
184            {
185              DebugZmin = -2.;
186              DebugZmax = 2.;
187            }
188          else
189            {
190              DebugZmin = centre.z() * 0.5;
191              DebugZmax = centre.z() * 1.5;
192            }
193        }
194      else 
195        {
196          //G4cout << "Here 11a " << SourceShape << G4endl;
197          if((SourceShape == "Circle") || (SourceShape == "Annulus") || (SourceShape == "Sphere"))
198            {
199              DebugZmax = radius;
200            }
201          else if((SourceShape == "Ellipse") || (SourceShape == "Ellipsoid"))
202            {
203              DebugZmax = halfx;
204              if(halfy > DebugZmax)
205                DebugZmax = halfy;
206              if(halfz > DebugZmax)
207                DebugZmax = halfz;
208            }
209          else if(SourceShape == "Square")
210            {
211              DebugZmax = halfx;
212            }
213          else if(SourceShape == "Rectangle")
214            {
215              DebugZmax = halfx;
216              if(DebugZmax < halfy)
217                DebugZmax = halfy;
218            }
219          else if(SourceShape == "Cylinder")
220            {
221              if(radius >= halfz)
222                DebugZmax = radius;
223              else
224                DebugZmax = halfz;
225            }
226          else if(SourceShape == "Para")
227            {
228              DebugZmax = halfx;
229              if(DebugZmax < halfy)
230                DebugZmax = halfy;
231              if(DebugZmax < halfz)
232                DebugZmax = halfz;
233            }
234          DebugZmax = 3 * DebugZmax;
235          DebugXmin = centre.x() - DebugZmax;
236          DebugYmin = centre.y() - DebugZmax;
237          DebugZmin = centre.z() - DebugZmax;
238          DebugXmax = centre.x() + DebugZmax;
239          DebugYmax = centre.y() + DebugZmax;
240          DebugZmax = centre.z() + DebugZmax;
241        }
242      DebugXStep = (DebugXmax - DebugXmin)/100.;
243      DebugYStep = (DebugYmax - DebugYmin)/100.;
244      DebugZStep = (DebugZmax - DebugZmin)/100.;
245    }
246
247  //G4cout << "out of first bit" << G4endl;
248  idebug = 0;
249  G4double X_edge = DebugXmin;
250  //G4cout << "entering while loop 1 " << ParticlePos.x() << G4endl;
251  while (ParticlePos.x() > X_edge)
252    {
253      //G4cout << idebug << " " << ParticlePos.x() << " " << X_edge << G4endl;
254      X_edge = DebugXmin + (idebug+1)*DebugXStep;
255      idebug++;
256    }
257  debugx[idebug-1] = debugx[idebug-1] + 1;
258  idebug = 0;
259  G4double Y_edge = DebugYmin;
260  //G4cout << "entering while loop 2" << G4endl;
261  while (ParticlePos.y() > Y_edge)
262    {
263      Y_edge = DebugYmin + (idebug+1)*DebugYStep;
264      idebug++;
265    }
266  debugy[idebug-1] = debugy[idebug-1] + 1;
267  idebug = 0;
268  G4double Z_edge = DebugZmin;
269  //G4cout << "entering while loop 3" << G4endl;
270  while (ParticlePos.z() > Z_edge)
271    {
272      Z_edge = DebugZmin + (idebug+1)*DebugZStep;
273      idebug++;
274    }
275  debugz[idebug-1] = debugz[idebug-1] + 1;
276
277  //G4cout << "Here 12" << G4endl;
278  // trajectory
279  // px, py, pz are unit vectors so arrays run -1 to 1
280  idebug = 0;
281  G4double Px_edge = -1.;
282  //G4cout << "Loop 1" << G4endl;
283  while (ParticleMomDir.x() > Px_edge)
284    {
285      Px_edge = -1 + (idebug+1)*0.02;
286      idebug++;
287    }
288  debugpx[idebug-1] = debugpx[idebug-1] + 1;
289  idebug = 0;
290  G4double Py_edge = -1.;
291  //G4cout << "Loop 2" << G4endl;
292  while (ParticleMomDir.y() > Py_edge)
293    {
294      Py_edge = -1 + (idebug+1)*0.02;
295      idebug++;
296    }
297  debugpy[idebug-1] = debugpy[idebug-1] + 1;
298  idebug = 0;
299  G4double Pz_edge = -1.;
300  //G4cout << "Loop 3" << G4endl;
301  while (ParticleMomDir.z() > Pz_edge)
302    {
303      Pz_edge = -1 + (idebug+1)*0.02;
304      idebug++;
305    }
306  debugpz[idebug-1] = debugpz[idebug-1] + 1;
307
308  G4double theta = particleGun->GetTheta();
309  G4double phi = particleGun->GetPhi();
310 
311  //G4cout << "Here 13" << G4endl;
312  // Theta ranges 0-Pi, and Phi goes 0-two pi.
313  idebug = 0;
314  G4double Theta_edge = 0;
315  while (theta > Theta_edge)
316    {
317      Theta_edge =  (idebug+1) * (pi/100.);
318      idebug++;
319    }
320  debugtheta[idebug-1] = debugtheta[idebug-1] + 1;
321  idebug = 0;
322  G4double Phi_edge = 0.;
323  while (phi > Phi_edge)
324    {
325      Phi_edge = (idebug+1) * (twopi/100.);
326      idebug++;
327    }
328  debugphi[idebug-1] = debugphi[idebug-1] + 1;
329
330  //G4cout << "Here 14" << G4endl;
331  // Energy
332  if(EneDisType == "Mono")
333    debug_energy_step = emin/100.;
334  //  else if(EneDisType == "Arb")
335  // {
336  //   if(InterpolationType == "Spline")
337  //{
338  //  G4int len = G4int(IPDFArbEnergyH.GetVectorLength());
339  //  debug_energy_step = (IPDFArbEnergyH.GetLowEdgeEnergy(size_t(len-1)) - IPDFArbEnergyH.GetLowEdgeEnergy(size_t(0)))/100.;
340  //}
341  //  else
342  //{
343  //  G4int len = G4int(ArbEnergyH.GetVectorLength());
344  //  debug_energy_step = (ArbEnergyH.GetLowEdgeEnergy(size_t(len-1)) - ArbEnergyH.GetLowEdgeEnergy(size_t(0)))/100.;
345  //}
346  //}
347  //else if(EneDisType == "Epn")
348  // {
349  //  G4int len = G4int(IPDFEnergyH.GetVectorLength());
350  //  debug_energy_step = (IPDFEnergyH.GetLowEdgeEnergy(size_t(len-1)) - IPDFEnergyH.GetLowEdgeEnergy(size_t(0)))/100.;
351  //}
352  else
353    debug_energy_step = (emax - emin)/100.;
354
355  //G4cout << "Here 15" << G4endl;
356  G4double PartEnergy = particleGun->GetParticleEnergy();
357  //G4cout << "Energy is " << PartEnergy << " " << emin << " " << emax << G4endl;
358
359  G4double Ebin_edge = 0.;
360  idebug = 0;
361  while (PartEnergy > Ebin_edge)
362    {
363      if(EneDisType == "Mono")
364        Ebin_edge = emin/2. + (idebug+1)*debug_energy_step;
365      //  else if(EneDisType == "Arb")
366      //{
367      //  if(InterpolationType == "Spline")
368      //    Ebin_edge = IPDFArbEnergyH.GetLowEdgeEnergy(size_t(0)) + (idebug+1)*debug_energy_step;
369      //  else
370      //    Ebin_edge = ArbEnergyH.GetLowEdgeEnergy(size_t(0)) + (idebug+1)*debug_energy_step;
371      //}
372      // else if(EneDisType == "Epn")
373      //{
374      //  Ebin_edge = IPDFEnergyH.GetLowEdgeEnergy(size_t(0)) + (idebug+1)*debug_energy_step;
375      //}
376      else
377        Ebin_edge = emin + (idebug+1)*debug_energy_step;
378      idebug++;
379    }
380  debugenergy[idebug-1] = debugenergy[idebug-1] + 1;
381
382  //  G4cout << "debug-energy_step " << debug_energy_step << " " << Ebin_edge << G4endl;
383  //G4cout << "Ending thingy" << G4endl;
384
385}
386
387
388
Note: See TracBrowser for help on using the repository browser.