G4ParticleGun, G4ParticleTable
초기 입자를 정의 하기 위해서 G4ParticleGun, G4ParticleTable 클래스를 사용한다.
fParticleGun = new G4ParticleGun(1); G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable(); G4ParticleDefinition* particle = particleTable -> FindParticle("proton"); fParticleGun -> SetParticlePosition(G4ThreeVector(0.,0.,1.)); fParticleGun -> SetParticleDefinition(particle); fParticleGun -> SetParticleMomentumDirection(G4ThreeVector(0.,0.,1.)); fParticleGun -> SetParticleEnergy(40.*MeV);
위 코드는 G4ParticleGun은 초기 입자의 시작 위치, 방향, 에너지 등을 정의한다. 위에서 볼 수 있듯이 함수의 이름이 명확하다.
G4ParticleTable은 입자들이 정의 되어 있는 리스트 이며 이름, PDGEncoding, 원자번호 등의 방법으로 찾을 수 있다. 위 예제에서는 입자의 이름을 이용하여 찾았다. G4ParticleTable에서 입자를 가져오는 함수는 일반적으로 아래와 같이 있다.
- FindParticle (G4int PDGEncoding)
- FindParticle (const G4String &particle_name)
Ion 의 경우 G4ParticleTable 대신 G4IonTable을 사용한다.
- FindIon (G4int atomicNumber, G4int atomicMass, G4double excitationEnergy)
- ground state일 경우 excitationEnergy는 0이다.
Geant4에 정의 되어 있는 입자의 이름이나 PDGcode는 아래 리스트에서 찾을 수 있다.
Primary Generator Acction
입자를 쏘는 일은 G4VUserPrimaryGeneratorAction 클래스의 GeneratePrimaries(G4Event* event) 함수에서 한다. 아래와 같이 G4ParticleGun의 GeneratorPrimaryVertex(G4Event *) 함수를 이용한다.
void OTPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent) { fParticleGun -> GeneratePrimaryVertex(anEvent); }
이 함수는 이벤트가 시작할때마다 불러온다. 그렇기 때문에 물질을 정의할 때 처럼 초기 입자를 이 함수에서 정의 하는것이 아니라 클래스의 맴버 변수로 생성자에서 정의하고, 이벤트마다 속성만 바꿔주는 식으로 코드를 작성한다.
GeneratePrimaryVertex(G4Event*) 함수는 G4ParticeGun의 입자 초기 입자 하나를 다음 이벤트에 넣어준다. 즉, 위 코드는 이벤트마다 같은 초기 입자를 넣어준다. 만약에 이벤트 마다 여러개의 입자를 다른 입자를 넣어주고 싶다면 fParticleGun의 특성을 바꾸면서 GenearatePrimaryVertex(G4Event *) 함수를 여러번 써주면 된다. 예를 들어서 아래와 같은 식이다.
{ G4int pdg; G4double vx, vy, vz, px, py, pz; fEventGenerator -> ReadNextEvent(vx, vy, vz); fParticleGun -> SetParticlePosition(G4ThreeVector(vx,vy,vz)); while (fEventGenerator -> ReadNextTrack(pdg, px, py, pz)) { G4ParticleDefinition* particle = G4ParticleTable::GetParticleTable() -> FindParticle(pdg); fParticleGun -> SetParticleDefinition(particle); G4ThreeVector momentum(px,py,pz); fParticleGun -> SetParticleMomentum(momentum.mag()*MeV); fParticleGun -> SetParticleMomentumDirection(momentum.unit()); fParticleGun -> GeneratePrimaryVertex(anEvent); } }
위 코드는 흐름만 참고하도록 하자.