今回の話題
前回ユーザコード例(C++)を書きました.今回はこれをビルド&実行する手順です.本家の説明はInstallation GuideのHow to Make an Executable ProgramやPostinstall Setupあたり.
前提条件
作業環境は下記とします.
- Geant4およびビルドツールををインストール済みのLinux – 初回参照
- bash
ファイル構成は下記とします.ユーザはビルド設定ファイル $MySRCDIR/CMakeLists.txt
を用意するのですが,その中身がファイル構成により変わります.
$G4DIR/
… Geant4インストール先フォルダbin/geant4.sh
… 実行時の環境変数の設定スクリプトlib/Geant4-$G4VER/
… cmakeファイル置場Geant4Config.cmake
… Geant4システム側のビルドの元締め
$MYSRCDIR/
… myappのソースフォルダCMakeLists.txt
… ビルドの設定myapp.cc
… メインのソースinclude/*.hh
… ユーザ定義クラスのヘッダsrc/*.cc
… ユーザ定義クラスのソースmacro/*.mac
… Geant4マクロファイル
$MYBINDIR/
… ビルド&実行フォルダ(あらかじめmkdirしておく)
ビルドする
現在(Geant4 10.6.2)はcmakeを使ってビルドするのが標準で,従来の”Geant4Make”は廃止の方向です.下記がcmakeの最小限の設定例です.さしあたり,3-6行目以外は変更不要でしょう.
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(myapp)
file(GLOB mysrc ${PROJECT_SOURCE_DIR}/src/*.cc)
file(GLOB myhdr ${PROJECT_SOURCE_DIR}/include/*.hh)
file(GLOB mymac RELATIVE ${PROJECT_SOURCE_DIR} macro/*.mac)
#set(mymac macro/run.mac macro/vis.mac)
find_package(Geant4 REQUIRED ui_all vis_all) # interactive & visual
#find_package(Geant4 REQUIRED) # batch
include(${Geant4_USE_FILE})
include_directories(${PROJECT_SOURCE_DIR}/include)
add_executable(${PROJECT_NAME} ${PROJECT_NAME}.cc ${mysrc} ${myhdr})
target_link_libraries(${PROJECT_NAME} ${Geant4_LIBRARIES})
foreach(_f ${mymac})
configure_file(${PROJECT_SOURCE_DIR}/${_f} ${PROJECT_BINARY_DIR}/${_f} COPYONLY)
endforeach()
- 1行目はcmakeのバージョンの下限の指定(省略不可)です.Geant4アプリでは2.6必須,3.8推奨.
- 3-6行目はアプリ固有のファイル構成の指定(など)です.必要に応じここを編集.
- ファイル一覧を file GLOB で取得するのは手抜きとされ(ファイル構成の変更に弱い),
7行目のような逐一列挙が推奨です. - 9-16行目がビルドの指定です.システム側の何をどう使うかは
Geant4Config.cmake
にお任せ. - 18-20行目はマクロ等をコピーする指定です.コピー不要ならここと6行目は不要.
ビルドは次のようにします.成功すると,実行ファイル $MYBINDIR/myapp
が生成され,マクロ等が $MYBINDIR
にコピーされます.
cd $MYBINDIR
cmake -DGeant4_DIR=$G4DIR/lib/Geant4-$G4VER $MYSRCDIR
make
- cmakeでMakefileの生成やマクロのコピーをおこない,makeで実行ファイルを生成します.
- cmakeは,引数で与えたパス(絶対でも相対でもOK)やその変数名から
CMakeLists.txt
やGeant4Config.cmake
を探し出し,よろしく処理してくれます. make -j4
などとすると並列ビルドできます.
実行する
まずGeant4の共有ライブラリや物質データなどのパスを設定します.先頭の “.” (source)にご注意.
. $G4DIR/bin/geant4.sh
これでアプリを実行可能になりました.myapp の場合(前回のコード参照),デフォルトでは標準入力からコマンドを読むので,たとえば次で実行できます.
echo "/run/beamOn 100" | ./myapp
また引数を与えるとマクロを読むなど挙動が変わります../myapp run.mac
(バッチ処理), ./myapp -v vis.mac
(表示・対話ON), ./myapp -h
(ヘルプ) など.
UIコマンドとマクロの例
最後に,Geant4アプリに食わせるマクロ2例を並べておきます.
ひとつはバッチ処理的な例です.1〜10行目の設定のUIコマンドは適宜uncommentするとして,14行目の /run/beamOn
でシミュレーションが走ります.
# 饒舌度設定
#/control/verbose 2 # 読込んだコマンド,コメントを出力
#/run/verbose 2 # beamOnの条件や結果を出力
#/tracking/verbose 1 # step情報(散乱など)を出力
# 線源粒子の属性の既定値
#/gun/particle gamma # 粒子種類
#/gun/energy 6 MeV # エネルギー
#/gun/position 0 0 0 mm # 初期位置
#/gun/direction 1 0 0 # 進行方向
# 照射実行
/run/printProgress 10000 # 経過表示間隔
/run/beamOn 1000000 # イベント数
もうひとつは画面表示する例です./run/beamOn
以外は全て表示系の /vis/*
コマンドです.引数の “!” は既定値の意味.
# 表示ON
/vis/open OGL 960x960
/vis/drawVolume
# 物体の表示色
/vis/geometry/set/colour World 0 1 1 1 .1 # logvol,depth,R,G,B,opacity
/vis/geometry/set/colour Region1 0 1 0 0 .5
/vis/geometry/set/colour Region2 0 0 1 0 .5
# ステップ点の表示ON
/vis/modeling/trajectories/create/drawByCharge
/vis/modeling/trajectories/drawByCharge-0/default/setDrawStepPts true
# 軸・スケール・ラベルなどの表示
/vis/set/textColour white
/vis/scene/add/scale 1 mm auto 1 1 1 auto # len,unit,dir,R,G,B,placement,...
/vis/scene/add/text 10 -10 3.0 mm ! ! ! Vacuum # x,y,z,unit,...,label
/vis/scene/add/text 10 -10 1.0 mm ! ! ! Tungsten
/vis/scene/add/text 10 -10 -1.0 mm ! ! ! Cupper
/vis/scene/add/trajectories smooth # 軌跡表示ON
/vis/scene/endOfEventAction accumulate -1 # 複数の軌跡を重畳表示
# レンダラの設定
/vis/viewer/set/style surface # 領域表示方法: wireframe|surface|cloud
/vis/viewer/set/hiddenEdge 1 # 隠れた物体の辺を表示
/vis/viewer/set/hiddenMarker 1 # 隠れた粒子軌跡を表示
/vis/viewer/set/autoRefresh 1 # 設定変更時に再描画
# 照明・カメラの設定
/vis/viewer/set/lightsVector 1 1 1 # 被写体から照明の方向
/vis/viewer/set/viewpointThetaPhi 60 45 # 被写体からカメラの方向
#/vis/viewer/zoom 1
#/vis/viewer/pan 0 0 mm
# 照射ON
/run/beamOn 30
# 画面保存
#/vis/ogl/set/printFilename image.eps # 出力先 image_NNNN.eps
#/vis/ogl/set/printMode pixmap
#/vis/ogl/printEPS
./myapp -v vis.mac
すると,何やら出てきます(そして対話セッションに入ります).マクロのコメントと合わせれば,どのUIコマンドがどう働いたかは想像つくのではないでしょうか.

例で使った主なUIコマンドをグループ別にまとめておきます.
コマンド群 | 処理概要 | 備考 |
---|---|---|
/run/beamOn N | 照射ON | 1次粒子をN回生成 |
/gun/* | 線源粒子の設定 | 種類,位置,エネルギー,進行方向など |
/vis/* | 表示系の設定 | カメラ・照明・物体色,目盛,注釈,粒子軌跡など |
/*/verbose N | 饒舌度設定 | *=control|vis|run|event|tracking|… |
説明に代えて.対話セッションではUIコマンドのリストやヘルプを表示できるので,いじってみると何ができるか大体わかります.tab補完やヒストリエディタでタイプ量を節約できます.
ls /PATH/TO/DIR/
help /PATH/TO/DIR/COMMAND
というわけで,3回かけてなんとかGeant4アプリを作って動かすことができました.
次回予告
「ネットワーク設定」ということで,小さな騒動の顛末などを.
Accutheraでは加速器・医療システム・機械学習・放射線シミュレーションなどの専門技術を軸に開発やコンサルティングを承っております。お困りの案件がございましたら、こちら からお気軽にお問合せください。