aboutsummaryrefslogtreecommitdiffstats
path: root/src/G4BeamTestPrimaryGeneratorAction.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/G4BeamTestPrimaryGeneratorAction.cxx')
-rw-r--r--src/G4BeamTestPrimaryGeneratorAction.cxx84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/G4BeamTestPrimaryGeneratorAction.cxx b/src/G4BeamTestPrimaryGeneratorAction.cxx
new file mode 100644
index 0000000..192ab12
--- /dev/null
+++ b/src/G4BeamTestPrimaryGeneratorAction.cxx
@@ -0,0 +1,84 @@
+#include "G4BeamTestPrimaryGeneratorAction.h"
+#include "G4BeamTestPrimaryGeneratorMessenger.h"
+
+#include "Randomize.hh"
+
+#include "G4Event.hh"
+#include "G4GeneralParticleSource.hh"
+#include "G4ParticleTable.hh"
+#include "G4ParticleDefinition.hh"
+#include "G4SystemOfUnits.hh"
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+G4BeamTestPrimaryGeneratorAction::G4BeamTestPrimaryGeneratorAction()
+ : G4VUserPrimaryGeneratorAction(),
+fParticleGun(0)
+{
+ G4int n_particle = 1;
+// fParticleGun = new G4GeneralParticleSource(n_particle);
+ fParticleGun = new G4GeneralParticleSource();
+
+ //create a messenger for this class
+ fGunMessenger = new G4BeamTestPrimaryGeneratorMessenger(this);
+
+ //default kinematic
+ //
+ G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
+ G4ParticleDefinition* particle = particleTable->FindParticle("mu-");
+
+ fParticleGun->SetParticleDefinition(particle);
+ fParticleGun->SetParticleTime(0.0*ns);
+ fParticleGun->SetParticlePosition(G4ThreeVector(-76.2*cm,0.0*cm,-21.59*cm));
+ //fParticleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.));
+ //fParticleGun->SetParticleEnergy(2.0*GeV);
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+G4BeamTestPrimaryGeneratorAction::~G4BeamTestPrimaryGeneratorAction()
+{
+ delete fParticleGun;
+ delete fGunMessenger;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+void G4BeamTestPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
+{
+ fParticleGun->GeneratePrimaryVertex(anEvent);
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+void G4BeamTestPrimaryGeneratorAction::SetOptPhotonPolar()
+{
+ G4double angle = G4UniformRand() * 360.0*deg;
+ SetOptPhotonPolar(angle);
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+
+void G4BeamTestPrimaryGeneratorAction::SetOptPhotonPolar(G4double angle)
+{
+ if (fParticleGun->GetParticleDefinition()->GetParticleName()!="opticalphoton")
+ {
+ G4cout << "--> warning from PrimaryGeneratorAction::SetOptPhotonPolar() :"
+ "the particleGun is not an opticalphoton" << G4endl;
+ return;
+ }
+
+ G4ThreeVector normal (1., 0., 0.);
+ G4ThreeVector kphoton = fParticleGun->GetParticleMomentumDirection();
+ G4ThreeVector product = normal.cross(kphoton);
+ G4double modul2 = product*product;
+
+ G4ThreeVector e_perpend (0., 0., 1.);
+ if (modul2 > 0.) e_perpend = (1./std::sqrt(modul2))*product;
+ G4ThreeVector e_paralle = e_perpend.cross(kphoton);
+
+ G4ThreeVector polar = std::cos(angle)*e_paralle + std::sin(angle)*e_perpend;
+ fParticleGun->SetParticlePolarization(polar);
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......