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
    제가 드린 링크에
    Source direction and angular distribution 의 명령어와
    Angular Distribution 에 있는 명령어 설명을 읽어보시면 명령어로 방향을 랜덤하게 지정할 수 있습니다.

    사실 방향성에 대한 옵션은 아래 명령어 하나인것이나 마찬가지인것 같습니다.
    gps/ang/type iso 명령으로 4pi 에 방향으로 랜덤한 빔을 생성하고 다른 gps/ang/... 의 다른 명령어로
    각도를 제한할 수 있습니다.

    이 방법으로 원하는 결과를 얻을 수 없다면
    토픽 https://opentutorials.org......646 처럼 PrimaryGeneratorAction을 만들고
    GeneratePrimaries 함수 안에서 c++ 랜덤함수나 Geant4 랜덤함수를 코드로 적어서
    방향을 임의로 정할 수 있습니다.
    대화보기
    • GPS사용법
      앗 질문을정확히 못올린것 같네요
      예를들어 10000번의 양성자를 조사한다고 할때 각각의 방향을 랜덤할수로 줄 수 있는지 문의드린거에요!

      Primary generator action 에선 random함수를 사용할 수 있지만 gps에선 math를 불러오는 방법을잘몰라서 문의드린겁니다
      대화보기
      • ejungwoo
        아래 링크의
        - Source position and structure
        - Source direction and angular distribution
        항목의 명령어을 통해서 위치와 분포를 랜덤하게 지정할 수 있습니다.

        http://geant4-userdoc.web.cern.ch......nds
        대화보기
        • GPS 사용법
          안녕하세요, 항상 좋은 자료 잘보고 갑니다.

          다름이 아니라 GPS 사용시, particle direction 0 0 1 방향으로 쏘는건 쉬운데
          매번 발사되는 particle을 random 하게 쏘는 것도 구현이 가능한지요?
        • ejungwoo
          TrackingAction에서 바로 이렇게 쓰면 될 것 같습니다.

          EventAction *eventAction = (EventAction *) G4EventManager::GetEventManager() -> GetUserEventAction();
          G4int event = eventAction -> event;
          대화보기
          • numbering
            조언감사합니다.

            말씀하신대로 코드를 간단히 작성해봤습니다.

            두번쨰 방법으로 코드를 작성하였고 원하는 값이 나오는걸 확인할 수 있었습니다.

            제가 아직 C++에 익숙하지 못해....공부를 많이해야겠지만 해결이 안되어 마지막으로 한가지만 더 여쭙고자 합니다

            EventAction.hh 에
            public :
            G4 int event = 0 l
            을 추가하였고

            EventAction.cc에
            event = event +1 을 추가하여 EventAction에서 출력하니 결과가 나오는 것을 확인 할 수 있었습니다.

            질문은 이러합니다. 여기서 계산한 event 값을 TrackingAction 으로 보내서 Tracking Action의 ntuple에서 출력을 하고 싶은데 C++기본기가 없어 변수 넘기는게 쉽지가 않네요... 사소한거 까지 여쭤봐서 죄송하고 감사합니다.
            대화보기
            • ejungwoo
              여러가지 방법이 있지만 Geant4 기능 중에서는 방법이 없고 이 전 런의 event number를 사용자가 따로 저장해야 합니다.
              당장 생각나는 방법은 두가지정도 있을 것 같네요.

              1. G4UserRunAction 클래스의 EndOfRunAction() 함수 에서 마지막 event number를 저장해 두었다가 불러오는 방법. 이 경우 중첩되는 event number가 매번 더해지므로 이를 잘 생각해서 코딩을 해야 합니다.

              2. Geant4 내부 event number를 사용하지 않고 직접 G4UserEventAction에 event number 를 멤버 변수로 선언하고 EndOfEventAction() 함수에서 1씩 더해서 저장하는 방법.

              혹시나 그래도 해결하기 힘들 것 같다면 c++를 조금 더 공부하는 것을 추천드립니다. 이런 문제들은 대부분 Geant4 문제이기 보다는 c++ 언어 숙련도에 따른 문제이기 때문에 c++를 조금만 더 공부 하면 쉽게 해결 할 수 있습니다.
              대화보기
              • numbering
                안녕하세요, 아래 방법이 잘돌아가는건 확인 되었는데

                조금더 응용 문제가 해결이 안되어 문의드립니다.... 죄송합니다 ㅠㅠ

                event number가 1~251, 1~135, 1~950 1~149 1~3000 .................... 200개 이런식으로 되어있을때
                이것의 event number를 계산하는 방법도 있을까요?

                eventID = runID*[이벤트 개수]+eventID 이방법은 모든 이벤트가 동등할때만 가능해서 위와 방식에서는 구현이 안되네요...
              • 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 자세히 보기