28 #include "ParisBasicPrimaryGeneratorAction.hh"
31 #include "G4ParticleGun.hh"
32 #include "G4ParticleTable.hh"
33 #include "G4ParticleDefinition.hh"
34 #include "Randomize.hh"
38 ParisBasicPrimaryGeneratorAction::ParisBasicPrimaryGeneratorAction()
42 particleGun =
new G4ParticleGun(1);
43 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
44 G4String particleName;
45 particleGun->SetParticleDefinition(particleTable->FindParticle(particleName=
"gamma"));
55 for (G4int imult = 0; imult < mult; imult++ ) {
57 EgammaDoppler[imult] = 0.;
58 Theta_min[imult] = 0.;
59 Theta_max[imult] = 0.;
72 Egamma[0] = 200. *keV;
73 Theta_min[0] = 0. *deg;
74 Theta_max[0] = 180.*deg;
76 Phi_max[0] = 360. *deg;
84 ParisBasicPrimaryGeneratorAction::ParisBasicPrimaryGeneratorAction(G4String filename)
88 particleGun =
new G4ParticleGun(1);
89 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
90 G4String particleName;
91 particleGun->SetParticleDefinition(particleTable->FindParticle(particleName=
"gamma"));
101 for (G4int imult = 0; imult < mult; imult++ ) {
103 EgammaDoppler[imult] = 0.;
104 Theta_min[imult] = 0.;
105 Theta_max[imult] = 0.;
118 Egamma[0] = 200. *keV;
119 Theta_min[0] = 0. *deg;
120 Theta_max[0] = 180.*deg;
121 Phi_min[0] = 0. *deg;
122 Phi_max[0] = 360. *deg;
125 ComputeParameters(filename);
127 theMessanger =
new ParisBasicPrimaryGeneratorActionMessanger(
this);
130 ParisBasicPrimaryGeneratorAction::~ParisBasicPrimaryGeneratorAction()
135 void ParisBasicPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
142 particleGun->SetParticlePosition(G4ThreeVector(Posx, Posy, Posz));
143 for (G4int imult = 0; imult < mult; imult++ ) {
146 G4double phi = Phi_min[imult] + (Phi_max[imult]-Phi_min[imult]) * G4UniformRand();
147 G4double cosThetamin = std::cos(Theta_min[imult]), cosThetamax = std::cos(Theta_max[imult]);
148 G4double cosTheta = cosThetamin + (cosThetamax-cosThetamin) * G4UniformRand();
151 G4double sinTheta = std::sqrt(1. - cosTheta*cosTheta);
152 G4double ux = sinTheta*std::cos(phi),
153 uy = sinTheta*std::sin(phi),
157 G4double bgamma = 1.;
158 beta = std::sqrt(betax*betax + betay*betay + betaz*betaz);
159 G4double ThetaCNgamma = std::acos(cosTheta);
161 ThetaCNgamma = std::acos(cosTheta) - std::acos(betaz/beta);
163 bgamma = 1. / (std::sqrt( (1.-beta*beta) ) );
164 EgammaDoppler[imult] = Egamma[imult]/bgamma/(1.-beta*(std::cos(ThetaCNgamma)));
166 particleGun->SetParticleEnergy(EgammaDoppler[imult]);
169 particleGun->SetParticleMomentumDirection(G4ThreeVector(ux,uy,uz));
170 particleGun->GeneratePrimaryVertex(anEvent);
177 void ParisBasicPrimaryGeneratorAction::ComputeParameters(G4String filename)
179 G4cout << G4endl <<
" ------ INF ------ from ParisBasicPrimaryGeneratorAction::ComputeParameters " << G4endl;
185 file.open(filename.data());
186 if ( file.is_open() == false ) {
187 G4cout <<
" ** WARNING ** cannot open file " << filename <<
" (Default parameters are used) "<< G4endl;
188 G4cout <<
" --> Default parameters are used for the generator" << G4endl;
189 G4cout << mult <<
" " << particleGun->GetParticleDefinition()->GetParticleName() <<
" with energy " << Egamma[0] <<
" keV emitted in (theta_min,theta_max,phi_min,phi_max) " << Theta_min[0] <<
" " << Theta_max[0] <<
" " << Phi_min[0] <<
" " << Phi_max[0] << G4endl;
194 const G4int MAXWIDTH = 300;
char aline[MAXWIDTH];
195 G4float tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
197 file.getline(aline,MAXWIDTH);
199 while ( file.good() ) {
201 if ( aline[0] ==
'#' ) { file.getline(aline,MAXWIDTH);
continue; }
205 sscanf(aline,
"%f %f %f %f %f %f", &tmp1, &tmp2, &tmp3, &tmp4, &tmp5, &tmp6);
213 file.getline(aline,MAXWIDTH);
218 sscanf(aline,
"%d", &fileformat);
220 file.getline(aline,MAXWIDTH);
224 switch( fileformat ){
227 sscanf(aline,
"%f %f %f %f %f", &tmp1, &tmp2, &tmp3, &tmp4, &tmp5);
228 Egamma[mult] = tmp1 *keV;
229 Theta_min[mult] = tmp2 *deg;
230 Theta_max[mult] = tmp3 *deg;
231 Phi_min[mult] = tmp4 *deg;
232 Phi_max[mult] = tmp5 *deg;
235 sscanf(aline,
"%f", &tmp1);
236 Egamma[mult] = tmp1 *keV;
237 Theta_min[mult] = Theta_min[0];
238 Theta_max[mult] = Theta_max[0];
239 Phi_min[mult] = Phi_min[0];
240 Phi_max[mult] = Phi_max[0];
245 sscanf(aline,
"%f %f %f %f %f", &tmp1, &tmp2, &tmp3, &tmp4, &tmp5);
246 Egamma[mult] = tmp1 *keV;
247 Theta_min[mult] = tmp2 *deg;
248 Theta_max[mult] = tmp3 *deg;
249 Phi_min[mult] = tmp4 *deg;
250 Phi_max[mult] = tmp5 *deg;
254 G4cout <<
" ** WARNING ** empty generator file " << G4endl;
258 file.getline(aline,MAXWIDTH);
264 G4cout <<
"Multiplicity = " << mult << G4endl;
265 G4cout <<
"Source position = " << Posx/cm <<
" " << Posy/cm <<
" " << Posz/cm << G4endl;
266 G4cout <<
"Source velocity/c = " << betax <<
" " << betay <<
" " << betaz << G4endl;
267 G4cout <<
"Particle characteristics (energy, angles) = " << G4endl;
268 for (G4int imult = 0; imult < mult; imult++ ) {
269 G4cout << imult+1 <<
" " << Egamma[imult]/keV << G4endl;
270 G4cout << Theta_min[imult]/deg <<
" " << Theta_max[imult]/deg <<
" " << Phi_min[imult]/deg <<
" " << Phi_max[imult]/deg <<
" " <<G4endl;
273 G4cout <<
" ------ END ------ from ParisBasicPrimaryGeneratorAction::ComputeParameters " << G4endl << G4endl;
276 #include "G4UIdirectory.hh"
277 #include "G4UIcmdWithAString.hh"
281 theDirectory =
new G4UIdirectory(
"/Paris/generator/");
282 theDirectory->SetGuidance(
"To modify generator's parameters");
284 resetParametersCmd =
new G4UIcmdWithAString(
"/Paris/generator/file",
this);
285 resetParametersCmd->SetGuidance(
"To load new parameters of ParisBasicPrimaryGeneratorAction from a file");
286 resetParametersCmd->SetGuidance(
"Required parameters: one valid filename (string)");
287 resetParametersCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
292 delete theDirectory;
delete resetParametersCmd;
Messanger class for ParisBasicPrimaryGenerator.
void ComputeParameters(G4String filename="setup/basic.gene")
from a given file, it reads the characteristics of the gamma cascade
void SetNewValue(G4UIcommand *, G4String)
Basic generator to generate a cascade of discrete gamma-rays.
toROOTGPSPrimaryGeneratorActionMessanger * theMessanger
~ParisBasicPrimaryGeneratorActionMessanger()