Geant4

Primary Generator Action

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);
  }
} 

위 코드는 흐름만 참고하도록 하자.

참고

댓글

댓글 본문
작성자
비밀번호
버전 관리
ejungwoo
현재 버전
선택 버전
graphittie 자세히 보기