Geant4 가이드

Stepping Action

드디어 데이터를 가지고 올 시간이다. 앞서 eventID, volumeID, energy deposit 정보를 Stepping Action에서 어떻게 가지고 오는지 알아보자.

G4Step

앞서, 기본 개념 - 틀 토픽에서 스텝에 관하여 다루었다. 시뮬레이션 상에서 스텝은 가장 작은 단위이고 결과와 직접적으로 연관되어 있기 때문에 사용자가 가장 관심있게 다루는 부분이다. Geant4 시뮬레이션은 하나의 스텝이 생성될 때 마다 G4UserSteppingAction 클래스의 UserSteppingAction(const G4Step*) 함수를 불러오며 G4Step 이라는 클래스로 스텝 정보에 접근 할 수 있다. G4Step은 요약하면 다음과 같은 정보를 가지고 있다.

  • PreStepPoint, PostStepPoint의 포인터
  • 스텝이 속한 G4Track의 포인터
  • 스텝의 길이와 소요된 시간
  • 스텝에서 잃은 에너지

이중에서 우리가 관심있는 잃은 에너지 정보는 G4Step의 GetTotalEnergyDeposit() 함수로 가져올 수 있다.

step -> GetTotalEnergyDeposit();

G4StepPoint

G4Step을 이해하기 위해서는 G4StepPoint 개념도 중요하다. G4StepPoint 는 스텝의 양 끝점인 스텝점이며 요약하면 다음과 같은 정보를 가지고 있다.

  • 위치와 시간
  • 운동량과 에너지
  • Physical volume 포인터

여기서 가장 중요한 정보는 Physical volume이다. 하나의 스텝에서 나온 두 스텝점은 같은 물질에 속해있을 수도 있고 다른 물질에 속해있을 수도 있다. 이때 이 스텝이 어느 물질에서 일어난 스텝인지 의문을 가질 수 있다. 트랙은 물질의 경계에 닿았을 때 무조건 스텝이 끝나고 새로운 스텝이 시작된다. 즉, 스텝은 시작 스텝점이 속해있는 물질에서 일어난 스텝이라고 할 수 있다. 따라서 우리에게 중요한 volumeID는 preStepPoint가 속한 물질의 ID가 된다. 이는 다음과 같이 가져올 수 있다.

step -> GetPreStepPoint() -> GetPhysicalVolume() -> GetCopyNo();

CopyNo는 우리가 앞서 Detector Construction에서 Physical volume을 생성할 때 부여한 번호이다. 이때 각 Physical volume에 다른 번호를 부여하였다면 지금과 같이 물질을 구분할 때 도움이 된다.

G4Event

마지막으로 이벤트 번호가 남았다. 이벤트 번호는 G4Event 포인터가 가지고 있으며 GetEventNo() 함수로 가지고 올 수 있다. 하지만 문제는 G4Step으로 부터 G4Event 포인터를 가지고 올 수 없다. 다른 G4Event에 접근 방법은 G4UserEventAction을 이용하는 등의 방법도 있으나 더 우리는 G4RunManager를 이용해보도록 하자. 메인 프로그램을 만들때 G4RunManager라는 것을 만든 기억이 있을 것이다. G4RunManager는 어디서든 불러올 수 있으며 현재 시뮬레이션에 관한 정보에 접근 할 수 있다. 즉, 현재 G4Event 포인터에도 접근하여 이벤트 번호를 가지고 올 수 있다.

G4RunManager::GetRunManager() -> GetCurrentEvent() -> GetEventID();

이렇게 세가지 정보를 OTSteppingAction의 UserSteppingAction(G4Step*) 함수에서 불러와 G4AnalysisManager에 Ntuple 형태로 저장하면 드디어 두번째 프로그램이 완성된다.

참고

댓글

댓글 본문
작성자
비밀번호
  1. ejungwoo
    Physics Volume의 수는 제한되어 있지 않습니다. 있다 하더라도 10개 정도의 오더는 아닙니다. 이 경우는 코딩 상의 문제일 가능성이 가장 클 것 같네요.
    대화보기
    • ejungwoo
      Geant4는 사용자가 생성한 입자와 그 입자로 인하여 생성되는 secondary 입자에 의한 에너지 밖에 계산하지 않습니다.
      Secondary 입자는 parentID가 0 이 아닌것으로 구분할 수 있습니다.
      대화보기
      • ejungwoo
        UserSteppingAction 함수에서
        step -> GetPostStepPoint() -> GetProcessDefinedStep() -> GetProcessName()
        로 프로세스 이름을 알 수 있습니다.
        대화보기
        • 이핑크
          제가 Physical volume 11(0~10)개를 생성하고 실행했습니다. 그런데 volumeID 10번에서만 누적된 에너지가 산출되더라구요.
          Physical volume을 10 (0~9)개만 생성하고 실행하면 또 잘 나옵니다..

          혹시 Physical volume의 수가 제한되어 있나요??
        • 이핑크
          위의 예제는 들어오는 입자가 손실되는 에너지를 나타내는 Edep을 나타냈는데요, 혹시 Detector가 얻는 에너지도 계산할 수 있을까요?
          질문은 이러합니다 만야 두물체가 충돌( 입사하는 물체와 Detector) 했을때 위의 예제는 입사하는 물체를 기준으로 손실된 에너지를 계산하는 것인데요, Detector에서 구성물질이 충돌되어서 움직이는 position energy등은 어디서 알 수 있는지 궁금합니다.
        • 행인2
          안녕하세요 neutron 을 검출기에 쏘는 시뮬레이션 하려고 하는데,
          이때 결과분석을 통해 edep의 원인이 충돌인지 아니면 핵분열로 인한 것인지 파악이 어렵네요.
          혹시 edep이나 다른 output을 통해 핵분열이나 충돌을 구분할 방법이 있을까요?
        • ejungwoo
          Geant4에서 데이터를 가지고 오는 방법은 크게 두가지가 있습니다. 위와같이 Action 클래스를 통해서 데이터를 가져오는 방법과 G4VSensitiveDetector 클래스를 이용해서 데이터를 가져오는 방법입니다.

          Action 클래스를 이용하면 시뮬레이션 상의 모든 데이터에 접근을 할 수 있습니다. 이 중에서 사용자가 원하는 데이터를 직접 골라내고 저장하거나 간단한 가공을 하는 방법이 위의 방법입니다. 코딩 난이도는 상대적으로 쉽고 코딩의 양 또한 적습니다. 이 가이드에서 이 방법을 설명하는 이유도 쉽다는 점 때문입니다.

          SD(Sensitive Detector)를 이용하는 방법은 사용자가 관찰하고 싶은 logical volume에 SD를 등록하고 해당 volume에서 반응이 있을 때만 데이터를 받아옵니다. SD를 이용한 예제들을 보면 G4THitsCollection, G4VHit 클래스를 이용해서 코딩을 하는데, 데이터를 분석하기 쉽도록 의미있는 형태로 가공을 하는 작업입니다. 이 방법의 장점은 검출기의 시스템이나 시뮬레이션이 복잡해 질수록 더 정리가 잘되고 데이터 가공을 더 효과적으로 할 수 있다는 점입니다. 하지만 그만큼 배워야 하는 양도 많고 코드의 양도 많아집니다.

          규모가 큰 그룹에서 시뮬레이션을 만들 때는 프로그램 이용자가 최소한의 일을 할 수 있도록 SD를 포함한 방법을 이용하여 데이터를 최대한 많이 가공하는 방법을 택합니다. 하지만 작은 시뮬레이션에서는 간단하고 빠른 프로그램을 작성하고 ROOT를 이용하여 분석을 하는 것이 유리하다고 생각합니다. 이 부분은 개인적인 의견이며 두가지 방법을 모두 경험해 보고 사용자가 선택 하는 것이 맞다고 생각합니다.
          대화보기
          • 이핑크
            다른 자료같은거 보니까 위의 정보를 얻는데 SteppingAction.cc 말고 SensitiveDetector.cc 에 똑같이 작성해서 정보를 뽑아내기도 하더라구요. 어떻게 하든 상관 없는건가요?? 아니면 서로 차이가 있는건가요??
          버전 관리
          ejungwoo
          현재 버전
          선택 버전
          graphittie 자세히 보기