source: trunk/examples/advanced/human_phantom/src/G4HumanPhantomPrimaryGeneratorAction.cc@ 1239

Last change on this file since 1239 was 807, checked in by garnier, 17 years ago

update

File size: 6.4 KB
RevLine 
[807]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// Authors: S. Guatelli and M. G. Pia, INFN Genova, Italy
27//
28// Based on code developed by the undergraduate student G. Guerrieri
29// Note: this is a preliminary beta-version of the code; an improved
30// version will be distributed in the next Geant4 public release, compliant
31// with the design in a forthcoming publication, and subject to a
32// design and code review.
33//
34#include "G4HumanPhantomPrimaryGeneratorAction.hh"
35#include "G4HumanPhantomConstruction.hh"
36#include "G4HumanPhantomPrimaryGeneratorMessenger.hh"
37
38#include "G4Event.hh"
39#include "G4ParticleGun.hh"
40#include "G4ParticleTable.hh"
41#include "G4ParticleDefinition.hh"
42#include "globals.hh"
43
44#include "G4RunManager.hh"
45//#ifdef G$ANALYSIS_USE
46//#include "G4HumanPhantomAnalysisManager.hh"
47//#endif
48
49#include "G4ios.hh"
50
51G4HumanPhantomPrimaryGeneratorAction::G4HumanPhantomPrimaryGeneratorAction()
52 :beamKind("beamAlongZ"),worldLength(200.)
53{
54 G4int n_particle = 1;
55
56 messenger= new G4HumanPhantomPrimaryGeneratorMessenger(this);
57
58 particleGun = new G4ParticleGun(n_particle);
59
60 probability.push_back(0.1667);
61 probability.push_back(0.1667);
62 probability.push_back(0.1667);
63 probability.push_back(0.1667);
64 probability.push_back(0.1666);
65 probability.push_back(0.1666);
66
67 // Default Particle
68 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
69
70particleGun->SetParticleDefinition(particleTable->FindParticle("geantino"));
71 particleGun->SetParticleEnergy(100.*MeV);
72}
73
74G4HumanPhantomPrimaryGeneratorAction::~G4HumanPhantomPrimaryGeneratorAction()
75{
76 delete particleGun;
77 delete messenger;
78}
79
80void G4HumanPhantomPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
81{
82 if (beamKind == "beamAlongZ") GenerateBeamAlongZ();
83 if (beamKind == "beamAlongY") GenerateBeamAlongY();
84 if (beamKind == "beamAlongX") GenerateBeamAlongX();
85 if (beamKind == "isotropicFlux") GenerateIsotropicFlux();
86
87 particleGun->SetParticlePosition(G4ThreeVector(x0, y0,z0));
88 particleGun->GeneratePrimaryVertex(anEvent);
89}
90
91void G4HumanPhantomPrimaryGeneratorAction::GenerateBeamAlongZ()
92{
93 z0 = 0.5*(worldLength)*cm;
94 y0 = (worldLength)*(G4UniformRand()-0.5)*cm;
95 x0 = (worldLength)*(G4UniformRand()-0.5)*cm;
96
97 //z0 = 0.5*(worldLength)*cm;
98 //y0 = 50. * cm + 5.*(G4UniformRand()-0.5)*cm;
99 //x0 = 10.*(G4UniformRand()-0.5)*cm;
100
101 G4ThreeVector direction(0.,0.,-1.);
102
103
104 particleGun->SetParticleMomentumDirection(direction);
105}
106
107void G4HumanPhantomPrimaryGeneratorAction::GenerateBeamAlongX()
108{
109 x0 = -0.5*(worldLength)*cm;
110 y0 = (worldLength)*(G4UniformRand()-0.5)*cm;
111 z0 = (worldLength)*(G4UniformRand()-0.5)*cm;
112
113 G4ThreeVector direction(1.,0.,0.);
114 particleGun->SetParticleMomentumDirection(direction);
115}
116void G4HumanPhantomPrimaryGeneratorAction::GenerateBeamAlongY()
117{
118 y0 = 0.5*(worldLength)*cm;
119 x0 = (worldLength)*(G4UniformRand()-0.5)*cm;
120 z0 = (worldLength)*(G4UniformRand()-0.5)*cm;
121
122 G4ThreeVector direction(0.,-1.,0.);
123 particleGun->SetParticleMomentumDirection(direction);
124}
125
126void G4HumanPhantomPrimaryGeneratorAction::GenerateIsotropicFlux()
127{
128 G4double random = G4UniformRand();
129 G4double sum = 0.;
130 G4int i = 0;
131
132 while(sum<random){sum += probability[i]; i++;}
133
134 if(i==1)
135 {
136 z0 = -0.5*(worldLength-2.)*cm;
137 y0 = (worldLength)*(G4UniformRand()-0.5)*cm;
138 x0 = (worldLength)*(G4UniformRand()-0.5)*cm;
139 }
140
141 if(i==2)
142 {
143 y0 = -0.5*(worldLength-2.)*cm;
144 z0 = (worldLength)*(G4UniformRand()-0.5)*cm;
145 x0 = (worldLength)*(G4UniformRand()-0.5)*cm;
146 }
147
148 if(i==3)
149 {
150 x0 = -0.5*(worldLength-2.)*cm;
151 z0 = (worldLength)*(G4UniformRand()-0.5)*cm;
152 y0 = (worldLength)*(G4UniformRand()-0.5)*cm;
153 }
154
155 if (i==4)
156 {
157 z0 = 0.5*(worldLength-2.)*cm;
158 y0 = (worldLength)*(G4UniformRand()-0.5)*cm;
159 x0 = (worldLength)*(G4UniformRand()-0.5)*cm;
160 }
161
162 if(i==5)
163 {
164 y0 = 0.5*(worldLength-2.)*cm;
165 z0 = (worldLength)*(G4UniformRand()-0.5)*cm;
166 x0 = (worldLength)*(G4UniformRand()-0.5)*cm;
167 }
168
169 if(i==6)
170 {
171 x0 = 0.5*(worldLength-2.)*cm;
172 z0 = (worldLength)*(G4UniformRand()-0.5)*cm;
173 y0 = (worldLength)*(G4UniformRand()-0.5)*cm;
174 }
175
176 G4double a,b,c;
177 G4double n;
178 do{
179 a = (G4UniformRand()-0.5)/0.5;
180 b = (G4UniformRand()-0.5)/0.5;
181 c = (G4UniformRand()-0.5)/0.5;
182 n = a*a+b*b+c*c;
183 }while(n > 1 || n == 0.0);
184 n = std::sqrt(n);
185 a /= n;
186 b /= n;
187 c /= n;
188
189 G4ThreeVector direction(a,b,c);
190 particleGun->SetParticleMomentumDirection(direction);
191}
192
193void G4HumanPhantomPrimaryGeneratorAction::SetBeam(G4String beam)
194{
195 if((beam == "beamAlongZ")||(beam == "beamAlongX")||
196 (beam == "beamAlongY")||(beam == "isotropicFlux")) beamKind = beam;
197
198 else G4cout<<"This option is not valid "<<
199 "---> beamAlongZ/beamAlongY/beamAlongX/isotropicFlux"
200 <<G4endl;
201}
202
Note: See TracBrowser for help on using the repository browser.