Geant4 가이드

General Particle Source 이용하기

General Particle Source (GPS) 는 초기 입자 생성을 매크로 파일을 통해서 생성할 수 있도록 도와준다. 이를 이용하면 컴파일을 다시 하지 않고도 초기 입자의 입력을 변경할 수 있다. 세번째 프로그램으로 부터 시작하여 GPS에 대하여 알아보자.

다음 GPS 소스와 아래 설명은 세번째 프로그램에서 업데이트(1,2)한 내용이다.

GPS를 사용할 때의 이점은 초기입자를 변경할 때 PrimaryGeneratorAction 클래스를 변경하지 않아도 되기 때문에 컴파일을 다시 할 필요가 없다는 것이다. 고정된 OTPrimaryGeneratorAction 의 내용은 다음과 같다.

헤더:

class OTPrimaryGeneratorAction : public G4VUserPrimaryGeneratorAction
{
  public:
    OTPrimaryGeneratorAction();    
    virtual ~OTPrimaryGeneratorAction();

    // method from the base class
    virtual void GeneratePrimaries(G4Event*);         

  private:
    G4GeneralParticleSource* fParticleGun;
};

소스:

OTPrimaryGeneratorAction::OTPrimaryGeneratorAction()
: G4VUserPrimaryGeneratorAction()
{
  fParticleGun = new G4GeneralParticleSource();
}

OTPrimaryGeneratorAction::~OTPrimaryGeneratorAction()
{
  delete fParticleGun;
}

void OTPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
{
  //this function is called at the begining of each event
  fParticleGun -> GeneratePrimaryVertex(anEvent);
}

세번째 프로그램과 다른점은 fParticleGun이 G4ParticleGun 클래스가 아닌 G4GeneralParticleSource 클래스를 이용한다는 점과 fParticleGun의 설정을 전혀 하지 않는 다는 점이다.

GPS의 설정은 Geant4 매크로 파일을 이용한다. 예제로 들어이있는 myrun 파일의 내용을 보자:

/gps/position  0 0 0
/gps/direction 0 0 1
/gps/particle  e-
/gps/energy    10 MeV
/run/beamOn    2


/gps/position  0 0 0
/gps/direction 0 0 1
/gps/particle  neutron
/gps/energy    50 MeV
/run/beamOn    5


/gps/position  0 0 0
/gps/direction 0 0 1
/gps/particle  proton
/gps/energy    20 MeV
/run/beamOn    10


/gps/position  0 0 0
/gps/direction 0 0 1
/gps/particle  gamma
/gps/energy    1 MeV
/run/beamOn    2

위 매크로는

  1. 10 MeV 전자 2개
  2. 50 MeV 중성자 5개
  3. 20 MeV 양성자 10개
  4. 1 MeV 감마 2개

를 차례대로 생성한다. 입자의 방향이나 에너지 영역을 더 세밀하게 조정하는 것도 가능하다. 이러한 설정들은 Geant4 GPS 설명서를 참고하도록 하자.

이때, 기존 OTRunAction 클래스의 내용으로는 명령어; /run/beamOn 가 실행될 때 마다 BeginOfRunAction() 함수가 실행되고 데이터 파일을 새로 생성한다. 즉 위 매크로를 이용하면 데이터 파일이 4번 새로 생성되고 덮어쓰인다.

이는 다음과 같은 변경을 적용하여 해결한다:

  1. G4AnalysisManager 생성을 BeginOfRunAction() 함수 에서 OTRunAction 생성자로 옮김
  2. G4AnalysisManager 저장을 EndOfRunAction() 함수 에서 OTRunAction 파괴자로 옮김

변경 이후 같은 매크로 파일을 이용시 4번의 런 정보가 한 파일에 저장되는 것을 확인 있 수 있다.

실행
./example myrun

실행 이후 myrun.root 파일이 생성되는 것을 확인하고 파일의 "event" ntuple의 엔트리가 19개(전자 2개 + 중성자 5개 + 양성자 10개 + 감마 2개)임을 확인할 수 있다.

참고

댓글

댓글 본문
작성자
비밀번호
  1. ejungwoo
    런을 여러번 돌리면 eventID가 매번 0부터 다시 시작하기 때문에 runID 를 추가로 이용하시면 됩니다.

    #include "G4RunManager.hh"
    #include "G4Run.hh"
    ...
    G4int runID = G4RunManager::GetRunManager() -> GetCurrentRun() -> GetRunID();


    runID 를 따로 저장하는것도 방법이고 아래와 같이 runID 와 eventID를 조합해도 되겠네요.

    eventID = runID*[이벤트 개수]+eventID
    대화보기
    • GPS numbering
      안녕하세요, 위에 사용한 방법을 이용하여 GPS 를 구현하였고, 이를 NTUple 입력하여자료를 관리하고 있습니다.
      하지만 자료처리를 할때 1~100까지 쏘는 시뮬레이션을 5번진행하면 event number가 1~100 1~100 1~100 1~100 1~100 이렇게 반복이 되어 각 결과마다 고유한 번호를 가지지 못하고 나오게 됩니다. 혹시 시뮬레이션 수행할때 각 1~100을 반복하게 하는게 아니라 1~500까지 count하게 하려면 어떤식으로 코딩을 해야할까요..... 잘 안되서 막막해서 여기 올려봅니다... 감사합니다 !
    버전 관리
    ejungwoo
    현재 버전
    선택 버전
    graphittie 자세히 보기