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

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

참고

댓글

댓글 본문
작성자
비밀번호
  1. ejungwoo
    검출기의 크기와 점선원의 중심까지의 거리, 그리고 생성된 빔의 개수로 볼 때 빔이 검출기에 들어갈 확률이 매우 작아보긴 합니다. 따로 background 시뮬레이션을 염두해 둔것이 아니라면, 빔이 검출기 안으로 들어가는 각도를 계산을 해서 그 각도 안에서 빔을 생성하는 것이 좋아보입니다.

    시뮬레이션이 오래 걸리는 이유는 아마도 이벤트 뷰어(/vis/viewer/...)를 사용해서 이벤트를 화면에 그리기 때문일 것입니다. 이벤트 뷰어는 시뮬레이션을 눈으로 확인할 때만 테스트용으로 사용하고, 많은 빔을 생성할 때는 뷰어를 끄고 시뮬레이션을 돌리면 시간을 단축할 수 있습니다.
    대화보기
    • 이핑크
      감사합니다. 알려주신대로 작성해서 돌리니까 잘 생성되었습니다.

      그런데 점선원과 검출기와 거리가 1m여서 그런지 반구 모양으로 1000개의 빔을 생성해도 검출기까지 간 빔이 없더라구요. 그냥 /gps/direction 으로 하는게 나을까요??

      걱정되는 부분은 보통 점선원이라는 것이 등방형으로 방출하는데 그렇게 돌리면 시간이 많이 걸려서 검출기 있는 방향 즉, 반구 모양으로 생성하는 것이 효율적이라고 생각했거든요. 근데 이렇게 반응 하나도 안하는 것이라면..
      대화보기
      • ejungwoo
        타입을 "iso"로 두시고 theta 혹은 phi 의 최소 최대 각을 조절하면 됩니다. 예를 들어서 아래와 같이 하면 +z 방향을 중심에 둔 반구 모양으로 빔이 생성됩니다.

        /gps/ang/type iso
        /gps/ang/mintheta 90 deg
        /gps/ang/maxtheta 180 deg

        아래 링크를 보시면 명령어 설명이 잘 되어있습니다.

        http://geant4-userdoc.web.cern.ch......ure
        대화보기
        • 이핑크
          점선원에 대해서 한쪽 방향으로만 빔을 생성하고 싶습니다.

          보통 /gps/direction 0 0 1의 경우면 z축으로 일직선으로만 빔이 생성되는데

          iso 타입으로 한쪽 방향으로만 즉, 반구 모양으로 방출하려면 어떻게 해야하는지 알 수 있을까요??
        버전 관리
        ejungwoo
        현재 버전
        선택 버전
        graphittie 자세히 보기