5-2b ユーザアプリケーションの新規作成方法


  1. Geant4に何をさせたいか
  2. ユーザーが定義できるAction
  3. 基本の(手抜き)コーディングの流れ
  4. main関数の実装
  5. 参考資料

1. Geant4に何をさせたいか

Geant4は、初心者から見ると敷居が高いプログラムに見える。確かに、75万行を超える膨大なソースコード(※1)は威圧感があり、中で何をやっているか分からないまま末端のプログラムをいじるのはなかなか辛いものがある。
しかし、 プログラムの複雑さの割に、Geant4の最低限のミニマムセットは決して複雑ではない。example/novis/N01のsrcディレクトリを見ると、用意されているのはたった3つのファイルである。たまにML等でExN01をもとにプログラムを改造しようとして挫折する人を見かけるが、example/novis/N01の例題の使い方はむしろ、あのコードを眺めながら、自分のやりたいシミュレーションの為には何が欠けているのかを考える、という辺りが妥当であるように思う。

N01の3つのファイルは、我々が行うシミュレーションの3つの不可欠な要素をそれぞれ代表している。

ExN01DetectorConstruction.cc シミュレーションを行う実験室系(環境)を定義 User Initialization
ExN01PhysicsList.cc ターゲットとする物理を定義
ExN01PrimaryGeneratorAction.cc 実験室系で起こるイベントを定義 User Action

これらは、どれを欠いても最早シミュレーションの意味をなさない。従って、この3つのクラスはアプリケーションを新規に作るに当たって必ず用意しなければならないクラスであり、現実にコードを書く時には、何でもいいから適当な例題をコピー&改造して(勿論自分で一から書けるならそれに越したことはないが)この3つのクラスを用意するというのが最初の作業になる。

次の過程は、この3つではどうしても書けず、かつ欠く事の出来ない機能を探すことである。N01の状態は、いわば実験室に検出器は置いても配線がなされていない状態で、事象は起こっているのにそれを記録するすべがない。したがって、次に考えるべきはSensitiveDetectorの作成であろう。また、もしかしたら磁場などの場の中に置きたいかもしれない。この機能はDetectorConstructionは補ってくれないから、G4VFieldを継承したクラスが必要になる。

その次は、パフォーマンスを考えて、あれば便利なクラスを付け加える。Hitは、書き出しの順番を気にしないような状況であれば、SensitiveDetectorのEndOfEventで適切なアウトプットストリームに書き出してもよさそうなものだが、検出器が複数あって書き出しが混ざって欲しくない場合には、イベントの最後にまとめて吐き出すことを考えなくてはならない。このような場合には別途Hitを保存しておくHitクラスや、UserEventActionなどの実装が必要になる。

幸いにして、(よほど特別な場合を除けば)シミュレーションのアップグレードには一銭もかからないので、これらの作業は必ずしも一時に行う必要はない。従って、ユーザアプリケーションを新しく作成する際には、そのシミュレーションにとって最も重要な部分から書き始めればよいということになる。

(※1) geant4.5.2p02の.hh, .cc, .iccファイルの総行数は761,172行。

[top]

2. ユーザーが定義できるAction

Geant4では、ユーザーが定義できるActionは5つある。これらはすべて純粋仮想クラスの形で与えられており、以下に記す関数の実装を要求する。

それぞれ、example/novis以下に例題があるので、それらを参照のこと。

[top]

3.基本の(手抜き)コーディングの流れ

どうやって新規アプリケーションを立ち上げるか、というお題目であるので、なるべく敷居の低そうな手順を追ってみた。

  1. G4VUserDetectorConstructionを継承して独自のDetectorConstructionクラスを作り、World Volumeに検出器をインストールしてWorld Physical Volumeを返す関数を実装する。
  2. G4VUserPhysicsListを継承して独自のPhysicsListを作成。…とはいえ、これを一から作るのはなかなか厳しいものがあるので、とりあえずはやりたいシミュレーションに近い例題などから拝借する。あるいは全部の粒子を登録してしまう。
  3. G4VUserPrimaryGeneratorActionを継承して独自のPrimaryGeneratorActionを作成。特にファンシーなビームを作りたいわけでなければ(周辺から中心に向かって飛び込んでくるビームとか)これも例題をコピってきてさして問題はないと思われる
  4. SensitiveDetectorと、必要であればHitクラスを実装。いずれもベースクラスが存在するのでそれから継承する。
  5. 必要であればRunAction、EventActionを実装。これもベースクラスを継承。RunAction, EventAction
  6. 更にTrackやStep、Stackごとに操作が必要であれば、ベースクラスを継承して作る。

このうち、RunAction, EventActionに関しては、次節の例題で少し構造を述べる。

手抜きコーディングの場合、例題の選択が結構重要である。同じ分野だからといっていきなりexample/advancedの下の例題をいじろうとすると、authorの方言に翻弄され、何がGeant4の機能で何がローカルルールなのか分からなくなってハマる。一見似たような例題がなくても、example/novis程度の例題から少しずつ使える部分を拾って来た方が結局は早い。横着をして一つの例題をいじるだけでなんとかしようと思わないのが得策か。

[top]

4.main関数の実装


Geant4のmain関数の中の仕事は、大雑把にいって次の通りである。ユーザークラスのセットは、RunManagerに対し、RunManagerのInitialize関数が呼ばれる前に行わなければならない。

  1. RunManager(singleton)の生成
  2. User Initializationのセット(DetectorConstruction, PhysicsList)
  3. User Actionのセット (最低限PrimaryGeneratorActionはセットする)
  4. G4VisManagerの定義とInitialize
  5. RunManager のInitialize
  6. UIターミナルのセット  

5. 参考資料

[top]


[ top | 2-2a 物質定義 | 2-2b 測定器記述 | 5-2a 測定器応答実装例 | 5-2b アプリケーション作成 | 5-2c ROOTによる結果処理例]

このページに関するご質問、ご叱責はこちらへ。