Warning, file /geant4/examples/advanced/dna/moleculardna/src/PrimaryGeneratorAction.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "PrimaryGeneratorAction.hh"
0031
0032 #include "PrimaryGeneratorMessenger.hh"
0033 #include "PrimaryGeneratorSourceGRASCSV.hh"
0034
0035 #include "G4GeneralParticleSource.hh"
0036 #include "G4ParticleGun.hh"
0037
0038
0039 #include "G4AutoLock.hh"
0040 namespace
0041 {
0042 G4Mutex PrimaryGeneratorMutex = G4MUTEX_INITIALIZER;
0043 }
0044
0045
0046 PrimaryGeneratorSourceGRASCSV* PrimaryGeneratorAction::fPrimarySource = nullptr;
0047
0048
0049
0050 PrimaryGeneratorAction::PrimaryGeneratorAction()
0051 {
0052 G4AutoLock lock(&PrimaryGeneratorMutex);
0053 fParticleGun = new G4GeneralParticleSource();
0054
0055 fFirstEvent = true;
0056 fGunMessenger = new PrimaryGeneratorMessenger(this);
0057 }
0058
0059
0060
0061 PrimaryGeneratorAction::~PrimaryGeneratorAction()
0062 {
0063 G4AutoLock lock(&PrimaryGeneratorMutex);
0064 delete fParticleGun;
0065 if (fPrimarySource != nullptr) {
0066 delete fPrimarySource;
0067 fPrimarySource = nullptr;
0068 }
0069 delete fGunMessenger;
0070 }
0071
0072
0073
0074 void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
0075 {
0076 if (fMyInputFileName != "") {
0077 G4AutoLock lock(&PrimaryGeneratorMutex);
0078
0079
0080 if (fFirstEvent) {
0081 fPrimarySource = new PrimaryGeneratorSourceGRASCSV(fMyInputFileName);
0082 fFirstEvent = false;
0083 }
0084
0085 auto* fpParticleGun = new G4ParticleGun();
0086
0087
0088 Primary* primary = fPrimarySource->GetPrimary();
0089 if (primary != nullptr) {
0090 G4String particleName = primary->GetName();
0091 G4ThreeVector pos = primary->GetPosition();
0092 G4ThreeVector momdir = primary->GetMomentumDirection();
0093 G4double energy = primary->GetEnergy();
0094 G4ParticleDefinition* particle = primary->GetParticleDefinition();
0095
0096
0097 fpParticleGun->SetParticleDefinition(particle);
0098 fpParticleGun->SetParticlePosition(pos);
0099 fpParticleGun->SetParticleEnergy(energy * CLHEP::MeV);
0100 fpParticleGun->SetParticleMomentumDirection(momdir);
0101 fpParticleGun->GeneratePrimaryVertex(anEvent);
0102 }
0103 else {
0104
0105
0106 G4cout << "WARNING: The phase space source is ended. Maybe you reach the end of file, or "
0107 "your file is broken. A Geantino will be generated."
0108 << G4endl;
0109 G4ParticleTable* pTable = G4ParticleTable::GetParticleTable();
0110 G4ParticleDefinition* particle = pTable->FindParticle("geantino");
0111 fpParticleGun->SetParticleDefinition(particle);
0112 G4ThreeVector pos = G4ThreeVector(kInfinity, kInfinity, kInfinity);
0113 fpParticleGun->SetParticlePosition(pos);
0114 fpParticleGun->SetParticleEnergy(0);
0115 fpParticleGun->SetParticleMomentumDirection(pos);
0116 fpParticleGun->GeneratePrimaryVertex(anEvent);
0117 }
0118 }
0119 else {
0120 fParticleGun->GeneratePrimaryVertex(anEvent);
0121 }
0122 }
0123
0124