28 #include "ParisUniformPrimaryGeneratorAction.hh"
31 #include "G4ParticleGun.hh"
32 #include "G4ParticleTable.hh"
33 #include "G4ParticleDefinition.hh"
34 #include "Randomize.hh"
38 ParisUniformPrimaryGeneratorAction::ParisUniformPrimaryGeneratorAction()
42 particleGun =
new G4ParticleGun(1);
43 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
44 G4String particleName;
45 particleGun->SetParticleDefinition(particleTable->FindParticle(particleName=
"gamma"));
61 for (G4int imult = 0; imult < mult; imult++ ) {
63 EgammaDoppler[imult] = 0.;
88 ParisUniformPrimaryGeneratorAction::ParisUniformPrimaryGeneratorAction(G4String filename)
91 particleGun =
new G4ParticleGun(1);
92 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
93 G4String particleName;
94 particleGun->SetParticleDefinition(particleTable->FindParticle(particleName=
"gamma"));
110 for (G4int imult = 0; imult < mult; imult++ ) {
112 EgammaDoppler[imult] = 0.;
131 ComputeParameters(filename);
133 theMessanger =
new ParisUniformPrimaryGeneratorMessanger(
this);
136 ParisUniformPrimaryGeneratorAction::~ParisUniformPrimaryGeneratorAction()
142 void ParisUniformPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
149 particleGun->SetParticlePosition(G4ThreeVector(Posx, Posy, Posz));
150 for (G4int imult = 0; imult < mult; imult++ ) {
153 G4double phi = Phimin + (Phimax-Phimin) * G4UniformRand();
154 G4double cosThetamin = std::cos(Thetamin), cosThetamax = std::cos(Thetamax);
155 G4double cosTheta = cosThetamin + (cosThetamax-cosThetamin) * G4UniformRand();
158 G4double sinTheta = std::sqrt(1. - cosTheta*cosTheta);
159 G4double ux = sinTheta*std::cos(phi),
160 uy = sinTheta*std::sin(phi),
164 Egamma[imult] = Emin + (Emax-Emin) * G4UniformRand();
167 G4double bgamma = 1.;
168 beta = std::sqrt(betax*betax + betay*betay + betaz*betaz);
169 G4double ThetaCNgamma = std::acos(cosTheta);
171 ThetaCNgamma = std::acos(cosTheta) - std::acos(betaz/beta);
173 bgamma = 1. / (std::sqrt( (1.-beta*beta) ) );
174 EgammaDoppler[imult] = Egamma[imult]/bgamma/(1.-beta*(std::cos(ThetaCNgamma)));
176 particleGun->SetParticleEnergy(EgammaDoppler[imult]);
179 particleGun->SetParticleMomentumDirection(G4ThreeVector(ux,uy,uz));
180 particleGun->GeneratePrimaryVertex(anEvent);
188 void ParisUniformPrimaryGeneratorAction::ComputeParameters(G4String filename)
191 G4cout << G4endl <<
" ------ INF ------ from ParisUniformPrimaryGeneratorAction::ComputeParameters " << G4endl;
196 file.open(filename.data());
197 if ( file.is_open() == false ) {
198 G4cout <<
" ** WARNING ** cannot open file " << filename <<
" (Default parameters are used) "<< G4endl;
199 G4cout <<
" --> Default parameters are used for the generator" << G4endl;
200 G4cout << mult <<
" " << particleGun->GetParticleDefinition() <<
" with energy between" << Emin <<
" keV and " << Emax <<
"keV in (thetamin,thetamax,phimin,phimax) " << Thetamin <<
" " << Thetamax <<
" " << Phimin <<
" " << Phimax << G4endl;
205 const G4int MAXWIDTH = 300;
char aline[MAXWIDTH];
206 G4float tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
208 file.getline(aline,MAXWIDTH);
210 while ( file.good() ) {
212 if ( aline[0] ==
'#' ) { file.getline(aline,MAXWIDTH);
continue; }
216 sscanf(aline,
"%f %f %f %f %f %f", &tmp1, &tmp2, &tmp3, &tmp4, &tmp5, &tmp6);
224 file.getline(aline,MAXWIDTH);
229 sscanf(aline,
"%d", &mult);
231 file.getline(aline,MAXWIDTH);
237 sscanf(aline,
"%f %f %f %f %f %f", &tmp1, &tmp2, &tmp3, &tmp4, &tmp5, &tmp6);
240 Thetamin = tmp3 *deg;
241 Thetamax = tmp4 *deg;
246 file.getline(aline,MAXWIDTH);
252 G4cout <<
"Multiplicity = " << mult << G4endl;
253 G4cout <<
"Source position = " << Posx/cm <<
" " << Posy/cm <<
" " << Posz/cm << G4endl;
254 G4cout <<
"Source velocity/c = " << betax <<
" " << betay <<
" " << betaz << G4endl;
255 G4cout <<
"Particle characteristics (energy, angles) = " << G4endl;
256 G4cout <<
"Energy range in keV = " << Emin/keV <<
" " << Emax/keV << G4endl;
257 G4cout <<
"Angular range in deg = " << Thetamin/deg <<
" " << Thetamax/deg <<
" " << Phimin/deg <<
" " << Phimax/deg << G4endl;
259 G4cout <<
" ------ END ------ from ParisUniformPrimaryGeneratorAction::ComputeParameters " << G4endl << G4endl;
262 void ParisUniformPrimaryGeneratorAction::ChangeMultiplicity(G4int smult)
264 G4cout <<
" ------ INF ------ Changing multiplicity in ParisUniformPrimaryGeneratorAction " << G4endl;
268 #include "G4UIdirectory.hh"
269 #include "G4UIcmdWithAString.hh"
270 #include "G4UIcmdWithAnInteger.hh"
274 theDirectory =
new G4UIdirectory(
"/Paris/generator/");
275 theDirectory->SetGuidance(
"To modify the parameters");
277 resetParametersCmd =
new G4UIcmdWithAString(
"/Paris/generator/file",
this);
278 resetParametersCmd->SetGuidance(
"To load new parameters of ParisRandomCascade from a file");
279 resetParametersCmd->SetGuidance(
"Required parameters: one valid filename (string)");
280 resetParametersCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
282 multCmd =
new G4UIcmdWithAnInteger(
"/Paris/generator/mult",
this);
283 multCmd->SetGuidance(
"To change the multiplicity of the generated cascade");
284 multCmd->SetGuidance(
"Required parameters: an integer");
285 multCmd->AvailableForStates(G4State_PreInit,G4State_Idle);
291 delete theDirectory;
delete resetParametersCmd;
delete multCmd;
295 if( command == resetParametersCmd )
297 if( command == multCmd )
toROOTGPSPrimaryGeneratorActionMessanger * theMessanger