File indexing completed on 2025-02-23 09:20:26
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 "STCyclotronPrimaryGeneratorAction.hh"
0031 #include "STCyclotronRun.hh"
0032
0033 #include "G4RunManager.hh"
0034 #include "G4Event.hh"
0035 #include "G4GeneralParticleSource.hh"
0036 #include "G4ParticleTable.hh"
0037 #include "G4ParticleDefinition.hh"
0038 #include "G4SystemOfUnits.hh"
0039 #include "STCyclotronPrimaryGeneratorActionMessenger.hh"
0040
0041 STCyclotronPrimaryGeneratorAction::STCyclotronPrimaryGeneratorAction()
0042 : G4VUserPrimaryGeneratorAction()
0043 {
0044 fMessenger = new STCyclotronPrimaryGeneratorActionMessenger(this);
0045 fParticleBeam = new G4GeneralParticleSource();
0046 fBeamCurrent = 10.E-6 ;
0047
0048 }
0049
0050 STCyclotronPrimaryGeneratorAction::~STCyclotronPrimaryGeneratorAction()
0051 {
0052 delete fMessenger;
0053 delete fParticleBeam;
0054 }
0055
0056 void STCyclotronPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
0057 {
0058
0059 G4double timePerEvent = 1.E-11 ;
0060 G4double chargeParticle = fParticleBeam->GetParticleDefinition()->GetPDGCharge()*1.6E-19;
0061 G4double numberOfPart = std::abs(fBeamCurrent*timePerEvent/chargeParticle);
0062 G4String name = fParticleBeam->GetParticleDefinition()->GetParticleName();
0063
0064 G4double energy = fParticleBeam -> GetCurrentSource()->GetEneDist()->GetMonoEnergy();
0065 G4int fPrimariesPerEvent = (G4int)numberOfPart;
0066
0067 if(fPrimariesPerEvent < 1){
0068 G4cout << "Warning: number of particles per event below 0: " << numberOfPart << G4endl;
0069 return;
0070 }
0071
0072 fParticleBeam->SetNumberOfParticles(fPrimariesPerEvent);
0073 fParticleBeam->GeneratePrimaryVertex(anEvent);
0074
0075 STCyclotronRun* fRun = static_cast<STCyclotronRun*>(G4RunManager::GetRunManager()->GetNonConstCurrentRun());
0076 fRun->SetPrimariesPerEvent(fPrimariesPerEvent);
0077 fRun->SetTimePerEvent(timePerEvent);
0078
0079 fRun->SetBeamName(name);
0080 fRun->SetBeamCurrent(fBeamCurrent);
0081 fRun->SetBeamEnergy(energy);
0082
0083
0084
0085
0086 }
0087
0088 void STCyclotronPrimaryGeneratorAction::SetBeamCurrent(G4double current)
0089 {
0090 if(fBeamCurrent!=current){
0091 fBeamCurrent=current;
0092 G4cout << "The new beam current is the following : " << fBeamCurrent << " Ampere." << G4endl;
0093 }
0094 }