1 |
|
2 |
#include "PrimaryGeneratorMessenger.hh" |
3 |
#include "PrimaryGeneratorAction.hh" |
4 |
#include "DetectorConstruction.hh" |
5 |
#include "G4Event.hh" |
6 |
#include "G4ParticleGun.hh" |
7 |
#include "G4ParticleTable.hh" |
8 |
#include "G4ParticleDefinition.hh" |
9 |
#include "globals.hh" |
10 |
#include "Randomize.hh" |
11 |
|
12 |
PrimaryGeneratorAction::PrimaryGeneratorAction( |
13 |
DetectorConstruction* DC) |
14 |
:Detector(DC),rndmFlag("off") |
15 |
{ |
16 |
G4int n_particle = 1; |
17 |
particleGun = new G4ParticleGun(n_particle); |
18 |
//create a messenger for this class |
19 |
gunMessenger = new PrimaryGeneratorMessenger(this); |
20 |
// default particle |
21 |
|
22 |
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); |
23 |
G4String particleName; |
24 |
G4ParticleDefinition* particle |
25 |
= particleTable->FindParticle(particleName="proton"); |
26 |
particleGun->SetParticleDefinition(particle); |
27 |
particleGun->SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.)); |
28 |
particleGun->SetParticleEnergy(20.*GeV); |
29 |
G4double position = -(Detector->GetWorld_Z())/2.; |
30 |
particleGun->SetParticlePosition(G4ThreeVector(0.*cm, 0.*cm, position)); |
31 |
} |
32 |
|
33 |
PrimaryGeneratorAction::~PrimaryGeneratorAction() |
34 |
{ |
35 |
delete particleGun; |
36 |
} |
37 |
|
38 |
void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) |
39 |
{ |
40 |
if (rndmFlag == "on"){ |
41 |
|
42 |
G4double z = Detector->GetWorld_XY()*(G4UniformRand()-0.5); |
43 |
G4double y = Detector->GetWorld_XY()*(G4UniformRand()-0.5); |
44 |
G4double x = Detector->GetWorld_Z()/2.; |
45 |
particleGun->SetParticlePosition(G4ThreeVector(x,y,z)); |
46 |
|
47 |
//k G4int i=0; |
48 |
//k G4double theta=pi/10*(i+G4UniformRand()); |
49 |
G4double phi=G4UniformRand()*twopi; |
50 |
|
51 |
|
52 |
|
53 |
|
54 |
G4double theta; |
55 |
do |
56 |
theta = G4UniformRand() * halfpi; |
57 |
while( G4UniformRand() > 2.*cos(theta)*sin(theta)); |
58 |
|
59 |
G4double px=sin(theta)*sin(phi); |
60 |
|
61 |
G4double py=sin(theta)*cos(phi); |
62 |
|
63 |
G4double pz=cos(theta); |
64 |
|
65 |
particleGun->SetParticleMomentumDirection(G4ThreeVector(-fabs(pz),py,px)); |
66 |
|
67 |
// G4cout<<"y0 "<<y0<< " z0 "<<z0<<" Theta " << theta<<" Phi "<<phi<<G4endl; |
68 |
|
69 |
// G4double E=pow(6.0255959E-6 -5.91594E-6*G4UniformRand(),-0.5747712644); |
70 |
// G4double E=pow(0.000316228 -0.000310604*G4UniformRand(),-0.571429); |
71 |
|
72 |
// particleGun->SetParticleEnergy(E*GeV); |
73 |
// G4cout<<E<<"GeV"<<G4endl; |
74 |
|
75 |
//l particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); |
76 |
} |
77 |
particleGun->GeneratePrimaryVertex(anEvent); |
78 |
} |
79 |
|
80 |
|
81 |
// 2005 by G.I.Vasilyev |