Geant4 무작정 따라하기 시리즈의 일곱번째. 시뮬레이션에서 입자가 발생되어 수송되는 과정을 직접 눈으로 보기 위해, Tracking Verbose를 다루는 법을 알아봅니다.
선원항을 정의하고 나면 시뮬레이션 상에서 실제로 내가 정의한대로 초기 입자가 발생되고 있는지 확인을 할 필요가 있을 것입니다. 그래서 선원항을 정의하는 방법을 배우기 전에, Tracking Verbose를 먼저 다루게 되었습니다.
관련된 Geant4의 용어부터 간단하게 설명한 뒤, Tracking Verbose의 모습을 살펴보겠습니다.
입자 수송해석을 위한 몬테칼로 시뮬레이션이라 하면 일반적으로 방사선원이나 발생장치로부터 입자가 발생되는 시점부터 그 입자로 인해 야기된 여러 반응들을 모니터링하는 일련의 과정을 반복적으로 시행하는 것을 의미하지요.
이렇게 반복적으로 시행되는 일련의 과정 1회를 Geant4에서는 Event라고 합니다. 다시 말해 Event란, 초기 입자(Primary particle)가 발생하여 이로부터 파생되는 이차 입자들(Secondary particles)까지의 수송 과정을 의미하는 것입니다.
몬테칼로 시뮬레이션에서 “시뮬레이션을 한 회 수행한다“는 표현은 일반적으로 한 세트의 반복시행작업을 전부 끝냈음을 의미할 것입니다.
Geant4에서는 시뮬레이션 한 회를 Run이라고 합니다. 즉, 여러 개의 Event를 반복하는 싸이클을 한데 묶어 Run이라고 부르는 것이지요.
Geant4의 가장 핵심적인 기능은 입자의 수송을 모사하는 것입니다. Geant4가 입자를 수송하면서 그 입자의 상태를 추적하는 것을 Tracking이라고 합니다.
다만 Geant4는 입자의 수송을 “모사“하는 프로그램이기 때문에, 실제 세상에서 입자가 거동하는 것과는 다소 차이가 있습니다. 대표적으로 다음 두 가지 관점에서의 차이를 살펴봅시다.
동시성
실제 세상에서는 여러 입자가 동시에 움직이고 있지만, Geant4는 기본적으로 한 번에 하나의 입자의 움직임만 계산합니다.
예를 들어 감마선이 Compton 산란을 일으켜 전자를 생성한 경우를 생각해봅시다.
실제 세상에서는 감마선과 전자가 동시에 이동하겠지요.
하지만 Geant4에서는 일단 감마선을 수송하다가 Compton 산란이 일어나서 전자가 생성돼도 “전자가 이 위치에서 생성되었다"는 기록만 남겨둔 채 감마선을 계속 수송합니다. 그러다가 언젠가 그 감마선이 광전흡수나 쌍생성 반응 등으로 완전히 사라진 후에야 비로소 아까 기록해둔 전자의 생성 위치에서부터 전자의 수송을 시작합니다.
즉, 실제 세상에서 동시에 일어나는 일을, Geant4에서는 한 번에 한 입자씩 순차적으로 나누어 모사하는 것입니다.
연속성
실제 세상에서 입자는 연속적인 궤적을 따라 움직입니다. (0, 0, 0)에 있던 입자가 (1, 0, 0) 위치로 순간이동 하듯 움직이는 것이 아니죠. (양자역학적 관점에서의 이산성은 논외로 하겠습니다)
그러나 Geant4는 입자를 수송할 때 그 연속적인 궤적을 지속적으로 추적하는 것이 불가능합니다. 마치 이동하는 물체를 연속 사진 촬영을 하듯, 약간의 간격을 두고 추적할 수밖에 없지요. 그래서 Geant4가 기록해둔 입자의 궤적은 마치 순간이동을 한 것처럼 띄엄띄엄 기록되어 있습니다.
물론, 기록한 두 지점 사이에서 변화한 물리량은 여러가지 물리학적 이론과 계산식을 바탕으로, 실제 세상의 입자가 거동한 것과 최대한 유사하게끔 모사하긴 합니다. 다만, 기록하는 방식 자체가 연속적일 수는 없다는 것이지요.
이 두 가지 차이를 인지하고, Track과 Step의 개념을 간단하게만 살펴보겠습니다.
Track이란 Geant4가 수송하고 있는 입자의 “현재 상태“를 의미합니다.
Geant4는 한 번에 하나의 입자만 수송한다고 하였으므로, 현재 수송 중인 어떠한 입자가 있을 것입니다. 그리고, 그 입자의 궤적을 볼 때 마치 사진을 촬영하듯 불연속적인 한 순간만 포착하여 본다고 했지요. 이렇게 포착한 한 순간의 스냅샷이 그 입자의 Track입니다. 스냅샷을 찍을 때마다 입자의 궤적 상에 불연속적인 분절점이 생기고, 이 지점에서의 정보를 Track이 가지고 있게 되는 것이지요.
이런 분절점을 자주 만들어 기록하면 실제 궤적과 상당히 유사한 정보를 얻을 수는 있겠지만, 그만큼 연산량이 늘어 계산 시간이 길어지게 될 것입니다. 반대로, 분절점을 너무 가끔 만들게 되면 계산 시간은 단축되겠지만 실제 궤적과의 차이가 심해져 계산의 정확도가 떨어지게 되겠지요.
Geant4 분절점이 만들어지는 조건은 기본적으로 다음과 같습니다.
Track은 입자가 수송되더라도 변하지 않는 정적 정보와 입자가 수송됨에 따라 변화하는 동적 정보를 모두 담고 있습니다.
Step이란 “이전 Track과 현재 Track의 차이“를 의미합니다.
Track은 불연속적인 순간들이라고 하였습니다. 그렇다면 현재의 Track(방금 찍은 사진)과 바로 이전의 Track(직전에 찍은 사진) 간에 차이를 확인할 수 있을 것입니다. 이 현재와 직전의 차이를 Geant4에서는 Step이라는 개념으로 다루고 있습니다.
Geant4에서 Verbose란 일종의 로그(log)1라고 생각하시면 됩니다. 시뮬레이션이 어떤 조건 하에서 어떠한 설정값을 바탕으로 어떻게 진행되는지를 출력하는 것이죠.
이 시리즈에서는 Geant4에서 제공하는 여러가지 Verbose들 중 Tracking Verbose 만을 다룰 예정입니다. 이 외에도 Geant4는 Run, Event, Physics 등 다양한 항목에 대해 정보를 출력하는 기능을 제공하고 있으니 필요에 따라 찾아보시기 바랍니다.
이 시리즈에서는 Tracking Verbose 한 가지만 알아볼 것입니다. Tracking Verbose는 말그대로 Geant4가 Tracking을 하며 얻은 정보를 출력(Verbose)하는 기능입니다. 출력 수준은 -1부터 5까지 조정할 수 있으며, 수준이 높아질수록 더욱 상세한 정보가 출력됩니다.
일단 Tracking Verbose를 설정하는 방법부터 알아봅시다.
이전에 Geant4 프로그램을 실행하는 방식 중 batch모드 실행에 대해 언급한 적이 있습니다. ./g4_minimal run.mac
과 같이 입력하여 실행하면, run.mac
파일의 내용이 일괄적으로 입력되어 시뮬레이션이 수행된다고 했었지요. 여기서 run.mac
과 같은 파일을 매크로파일(macro file)이라고 부릅니다.
Tracking Verbose는 이러한 매크로파일을 이용하면 쉽게 설정할 수 있습니다.
현재 run.mac
파일을 열어보면 다음과 같이 작성되어 있을 것입니다.
1# Can be run in batch, without graphic
2# or interactively: Idle> /control/execute run.mac
3
4# Verbose
5/control/verbose 2
6/run/verbose 2
7/event/verbose 0
8/tracking/verbose 1
9
10/run/beamOn 100
#
이후는 주석으로 처리됩니다.
주석 이후 위에서부터 4개 줄에 전부 verbose가 적혀있지요. 이 모두가 각 사항에 대한 출력 수준을 설정하는 부분입니다. 여기서는 /tracking/verbose 1
이라고 적힌 부분만 조절하며 살펴볼 것입니다. 적혀있는 숫자 1
은 출력 수준을 1로 설정하겠다는 뜻입니다.
마지막 줄에는 /run/beamOn 100
이라는 내용이 있는데요, 이 줄이 바로 Run을 실행하는 명령줄입니다. /run/beamOn
은 Geant4 프로그램이 입자 수송을 시작하도록 하는 명령어로, 뒤에 정수 인자를 받아 이 정수 값만큼 Event를 반복시행하여 하나의 Run을 구성하도록 합니다.
/run/beamOn
줄을 여러 회 입력하여 여러 개의 Run이 순차적으로 실행되게끔 할 수도 있습니다.
지금 상태인 출력 수준 1에서 출력이 제대로 되는지부터 확인해보겠습니다. build
디렉토리에서 다음 명령어를 입력하여 Geant4 프로그램을 batch 모드로 실행합니다.
1./g4_minimal run.mac
많은 양의 글이 화면에 주르륵 뜨며 스크롤이 내려간 뒤, 다음 그림과 같이 Good Bye :)를 띄우며 끝나는 것을 확인할 수 있을 것입니다.
여기까지는 이미 이전 글에서 해봤던 작업이지요.
지금 우리가 관심있는 부분은, 위에 스쳐지나간 많은 양의 글입니다. 스크롤을 올리다보면 다음 그림과 같은 부분이 보일 것입니다.
이것이 Tracking Verbose 입니다. 보시다시피 출력되는 양이 너무 많기도 하고, 터미널 창에서 보기에는 불편함이 많지요. 그래서 일반적으로는 리눅스 표준 입출력을 redirection하는 명령어인 >
기능을 사용하여 파일에 출력시켜 내용을 확인합니다. 이 명령어를 간단히 설명하면, “화면에 출력될 내용을 파일에 적고싶을 때 사용하는 명령어“라고 보시면 됩니다.
다음과 같이 입력해보겠습니다.
1./g4_minimal run.mac > vb.out
이러면 build 디렉토리 안에 vb.out이라는 새로운 파일이 생성되고, 화면에는 아무것도 출력되지 않을 것입니다. 화면에 출력될 내용을 vb.out에 담은 것이지요. 이런 방법을 통해 Verbose 수준을 올려서 출력되는 내용을 저장한 뒤에 확인할 수 있습니다.
이제 Tracking Verbose의 출력 수준을 바꾸어가며, 실제로 어떤 내용이 출력되는지 차근차근 살펴보겠습니다.
-1: Silent
0: Silent
단계 -1과 0은 아무런 정보도 출력하지 않는 단계입니다.
1: Minimum information of each Step
Tracking Verbose를 1로 설정하였을 때의 출력은 다음 그림과 같습니다.
이 그림에서 보이는 것이 입자를 Tracking한 기록 3개 분량입니다. 빨간색 테두리로 표시한만큼이 입자 하나의 생성부터 소멸까지의 기록입니다.
각 기록마다 맨 위에는 Tracking한 입자의 정보가 간단하게 적혀 있습니다. (주황색 테두리로 표시한 부분)
여기서 입자의 이름으로 나타난 geantino는 실제 존재하는 입자가 아니라 Geant4가 만들어낸 가상의 입자입니다. 이 입자는 어떠한 반응도 일으키지 않는 입자로, 여러가지 테스트를 목적으로 종종 사용됩니다.
자세한 사항은 선원항 정의를 다루게 될 다음 글에서 좀 더 살펴보도록 하겠습니다.
초록색 테두리로 표시한 입자의 정보 아래 부분에는 해당 입자를 Tracking을 하며 획득한 다양한 정보가 순차적으로 기록됩니다. 표 형태로 기록되어 있으며, Track이라는 스냅샷을 새로이 찍을 때마다 가로줄이 한 줄씩 추가되는 식입니다. 각 열이 의미하는 바를 간단하게 설명하자면 다음과 같습니다.
2: Addition to Level=1, info of secondary particles.
Tracking Verbose를 2로 설정하면, 1일 때의 출력에 추가적으로 이차입자의 정보가 표시됩니다.
현재 초기입자가 geantino라서 아무런 반응이 일어나지 않아 차이를 확인할 수 없을 것입니다.
예시를 보여드리기 위해 제가 임의로 gamma를 수송할 때의 결과를 가져와 보았습니다.
출력 수준이 2가 되면 이차입자가 생성된 분절점에서, 그 이차입자에 대한 정보를 추가적으로 출력해 줍니다.
앞서 말한 바와 같이, Geant4는 한 번에 한 입자만 수송하므로, 생성된 이차입자는 이처럼 기록만 해두고, 원래 수송하던 입자를 마저 수송하게 됩니다.
3: Addition to Level=1, pre/postStepoint information after all AlongStep/PostStep process executions.
4: Addition to Level=3, pre/postStepoint information at each AlongStepPostStep process execuation.
5 : Addition to Level=4, proposed Step length information from each AlongStepPostStep process.
수준 3일 때의 출력은 다음 그림과 같습니다.
지금 보시는 이만큼이 분절점 한 개 입니다. 입자 한 개 분량이 아닙니다. 엄청나게 길죠.
여기부터는 Geant4에 어느정도 익숙해지시고 난 뒤에 공부하셔도 충분할 것이라 생각합니다.
Tracking Verbose는 Geant4 시뮬레이션 코드를 작성함에 있어 반드시 익숙해져야 하는 기능입니다. 현재 시뮬레이션이 계획한대로 진행되고 있는지 디버깅 목적으로 활용할 수 있는 아주 유용한 도구이기 때문입니다.
자주 사용되는 수준은 다음과 같습니다.
다음 글에서는 선원항을 정의해서 어떤 입자가 어떻게 수송되는지 직접 살펴보도록 하겠습니다.
시간의 흐름에 따라 작업, 성능, 컴퓨터/네트워크 사용 등 일련의 작업 흐름을 기록해 둔 것 ↩︎