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. 행인
    지금 구분하려고 하는 프로세스는 protonInelastic 프로세스입니다.
    대화보기
    • ejungwoo
      어떤 프로세스를 이용하려고 하는지 알 수 있을까요?
      대화보기
      • 행인
        답변 감사합니다.

        제가 질문을 좀 잘못 한것 같은데 특정 프로세스의 이름을 찾는게 아니라 어떤 프로세스가 일어난 트랙을 그렇지 않은 트랙과 구분할 수 있는 방법이 있는지 궁금합니다.
        대화보기
        • ejungwoo
          특정 프로세스에 의해서 "생성된" 트랙은 다음과 같이 프로세스 이름을 알 수 있습니다.
          step -> GetTrack() -> GetCreatorProcess() -> GetProcessName();

          트랙이 생성된 원인이 아닌 다른 프로세스까지 찾고 싶다면 스텝이 일어났을 때
          step->GetPreStepPoint()->GetProcessDefinedStep()->GetProcessName();
          로 일일이 체크해야 합니다.
          대화보기
          • 행인
            안녕하세요

            현재 시뮬레이션에서 프로세스에 따라 total energy deposit이 어떻게 나오는지 그리고 얼마나 많이 그 프로세스가 일어났는지 알아보고 있습니다.

            G4String process = step->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessName();

            if(process == "" )
            {

            }
            일단 이렇게 해서 프로세스 이름을 가지고 오는것 까지는 된것 같은데 특정 프로세스가 일어난 트랙을 그렇지 않은 트랙과 구분할 수 있는 방법이 있는지 궁금합니다.
          • ejungwoo
            인터넷을 찾아보니 이런 논의가 있더군요.
            https://hypernews.slac.stanford.edu......e=1

            내용을 간단하게 요약하면,

            1) electron-hole pair 를 직접적으로 계산을 할 수 없고 그 이유는 Geant4 가 900eV 이하의 secondary particle을 다루지 않기 때문이라고 합니다.
            2) 간접적으로 계산 하는 방법은 전자가 남기는 energy deposit 가져와서 e-h pair 생성의 mean energy 인 3.62 eV 로 나누면 전자의 개수를 얻는 방법입니다.
            3) 시작할때 보면 좋은 예제로 $G4INSTALL/examples/extended/electromagnetic/TestEm8 를 추천했고 이 예제를 조금 들여다보면 Run 클래스에서 e-h pair 프로세스를 위한 G4ElectronIonPair* fElIonPair 가 정의되어 있는 것을 볼 수 있습니다.
            ->
            https://github.com......L98
            https://github.com......L48

            찾아보면 관련 논문도 있는 것 같으니 참고하시면 좋을것 같습니다.
            대화보기
            • 고체물리전공자
              안녕하세요, 혹시 Geant4에서 alpha 입자 진행에 따른 electron hole pair의 생성을 확인 할 수 있을까요??

              alpha 입자가 움직일때 대부분의 에너지는 ionization 에 의해 잃는 것으로 TRIM결과로 확인하였지만

              Geant4에서 electro의 cutoff 를 낮게 하여 모든 electron의 숫자를 count하면 e-h pait를 count 할 수있을 까요??

              핵물리학 분야가 아니라 어려움이 있으시겠지만 의견 부탁드립니다
            • ejungwoo
              트랙이 끝나는 경우
              TrackAction에서는 EndOfTrack() 함수로 알 수 있고
              StepAction에서는 step -> GetTrack() -> GetTrackStatus()의 값이 fStopAndKill 이 됩니다.
              코드 상으로는
              if (step -> GetTrack() -> GetTrackStatus() == fStopAndKill) ...
              으로 확인 할 수 있습니다.
              대화보기
              • ejungwoo
                penetration depth 를 따로 가져올 수 있는 함수는 없고 코딩을 조금 해야 합니다.
                이런 저런 방법이 있겠지만 예를 들어보면 다음과 같은 방법이 있겠네요.

                1)한 트랙에 대해서 모든 스텝의 preStep 볼륨과 postStep 볼륨을 체크합니다.

                2) preStep은 Detector가 아닌데 postStep이 Detector로 바뀌었을 때(들어가는 지점) trackLength 를 저장합니다 -> length1

                3) preStep이 Detector인데 postStep이 Detector가 아닌 볼륨으로 바뀌었을 때(나가는 지점) trackLength 를 저장합니다. 혹은 트랙이 볼륨안에서 죽었다면 죽은 지점(마지막 스텝)의 trackLength를 저장합니다. -> length2

                4) penetration depth = length2 - length1
                대화보기
                • 이핑크
                  안녕하세요~
                  Geant4 에서 Tracking length 의 의미가 궁금합니다.
                  aTrack -> getTracklength() 를 통해 가져오는 Tracklength 시작점으로 부터 떨어진 '이동거리' 라고 생각됩니다.

                  그렇다면 특정 Detector 안에서 움직인 '변위-penetration depth'를 알기위해서는 어떤 명령어를 사용해요하나요?
                  간단하게 secondary particle의 tracking length를 알고 싶으면 secondary particle의 시작위치자와 끝나는 위치를 알아서 피타고라스 정리에 의해 계산하면 될 것으로 생각되는데 시작하는 위치는GetPosition()함수를 통해 Secondarypariticle의 위치를 알 수 있지만 끝나는 particle의 위치는 어떠한 방식으로 가져오는지 잘몰라서 문의드립니다. 아니면 penetration depth를 사용하는 특별한 함수가 따로 있나요? 문의드립니다. 감사합니다.
                • 이핑크
                  말씀하신대로 코딩 상의 문제였더라구요. 답변 감사합니다.
                  대화보기
                  • 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 자세히 보기