![]() |
Precalibrated Ion Beam Identification Detector Simulation 1.0
A pilot study detector simulation, written in C++ with Geant4.
|
00001 00002 #include "PrimaryGeneratorAction.hh" 00003 00004 #include "DetectorConstruction.hh" 00005 #include "PrimaryGeneratorMessenger.hh" 00006 00007 00008 #include "G4ios.hh" 00009 #include "PrimaryGeneratorAction.hh" 00010 00011 void PrimaryGeneratorAction::SetParticle(G4int Z, G4int A, G4double E, G4double Q) 00012 { 00013 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); 00014 particleTable->GetIonTable()->CreateAllIon(); 00015 00016 G4ParticleDefinition* particle = particleTable->GetIon(Z, A, E); 00017 if(particle!=NULL) 00018 { 00019 particleGun->SetParticleCharge(Q); 00020 particleGun->SetParticleDefinition(particle); 00021 myRunAction->SetParticleZ(Z); 00022 myRunAction->SetParticleA(A); 00023 } 00024 } 00025 00026 00027 PrimaryGeneratorAction::PrimaryGeneratorAction(DetectorConstruction* DC, RunAction* run) 00028 :Detector(DC),myRunAction(run),rndmFlag("on") 00029 { 00030 G4int n_particle = 1; 00031 particleGun = new G4ParticleGun(n_particle); 00032 00033 //create a messenger for this class 00034 gunMessenger = new PrimaryGeneratorMessenger(this); 00035 00036 // default particle kinematic 00037 particleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.)); 00038 particleGun->SetParticleEnergy(11*GeV); // old value: 2.2 GeV 00039 00040 //default particle gun position. 00041 G4double position = -(Detector->GetWorldSizeX()); 00042 particleGun->SetParticlePosition(G4ThreeVector(position,0.*cm,0.*cm)); 00043 } 00044 00045 PrimaryGeneratorAction::~PrimaryGeneratorAction() 00046 { 00047 delete particleGun; 00048 delete gunMessenger; 00049 } 00050 00051 void PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) 00052 { 00053 //this function is called at the begining of event 00054 // 00055 00056 //Always place the gun outside the world. 00057 G4double x0 = -0.45*(Detector->GetWorldSizeX()); 00058 G4double y0 = 0.*cm, z0 = 0.*cm; 00059 if (rndmFlag == "on") 00060 { 00061 y0 = (Detector->GetBackScintillatorPlateSizeY())*(G4UniformRand()-0.5); 00062 z0 = (Detector->GetScintillatorBoxSizeZ())*1*(G4UniformRand()-0.5); 00063 } 00064 00065 particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); 00066 00067 particleGun->GeneratePrimaryVertex(anEvent); 00068 00069 /*if (rndmFlag == "on") 00070 {y0 = (Detector->GetScintillatorBoxSizeY())*12*(G4UniformRand()-0.5); 00071 z0 = (Detector->GetScintillatorBoxSizeZ())*1*(G4UniformRand()-0.5); 00072 } 00073 00074 particleGun->SetParticlePosition(G4ThreeVector(x0,y0,z0)); 00075 00076 particleGun->SetParticleTime(1.0*s); 00077 particleGun->GeneratePrimaryVertex(anEvent);*/ 00078 } 00079 00080 00081 G4ParticleGun* PrimaryGeneratorAction::GetParticleGun() 00082 { 00083 return particleGun; 00084 } 00085 00086 void PrimaryGeneratorAction::PrintTargetSize() 00087 { 00088 G4cout << "Shooting at area: " << Detector->GetBackScintillatorPlateSizeY()/cm << "cm x " << Detector->GetScintillatorBoxSizeZ()/cm << "cm => " << (Detector->GetBackScintillatorPlateSizeY())*(Detector->GetScintillatorBoxSizeZ())/cm/cm << "cm^2"<< G4endl; 00089 }