2-2b 簡単な測定器形状の記述


  1. 測定器記述の概観
  2. G4VSolidとその継承クラス
  3. G4LogicalVolume
  4. G4VPhysicalVolumeとその継承クラス
  5. 測定器記述の手順
  6. 可視属性をどう与えるか
  7. その他
  8. 参考資料

1. 測定器記述の概観

測定器は全てG4VUserDetectorConstructionを継承したユーザー独自のDetectorConstructionクラスの中の、Construct関数の中で組み立てられる。
Construct関数の戻り値は、シミュレーションを行う領域(世界)を表すWorld Physical Volumeである
ユーザーは、このWorldをまず始めに作成し、その中にシミュレーションしたい検出器の構造をインストールして、 測定器インストール済みのWorld Physical Volumeをreturnしなければならない。

Geant4はObject指向のプログラムであるため、検出器(およびその部品)を代表するクラスが存在する。
実際に実験で用いられる検出器には、以下の情報が与えられている。

  1. 検出器の形状(ジオメトリ)……………………G4VSolidクラスファミリー
  2. 検出器の材質、可視属性、有感領域属性………G4LogicalVolumeクラス
  3. 検出器の配置情報…………………………………G4VPhysicalVolumeクラスファミリー

実験における一つの検出器は1~3を全て合わせ持つものであり、検出器が複数個あればその数だけ材料も用意しなければならないが、シミュレーションでは必ずしもそこまで現実に合わせる必要はない。
Geant4では、1つの検出器を上記の3つの属性に分けることによって、コードの重複回避、メモリの節約を実現する。これらの属性は下から順にHas-A構造になっており、それぞれのインスタンス(これらは当然newで作成する必要がある)へのポインタを所持している。
最終的に検出器等を代表するのはG4VPhysicalVolumeの継承クラスのインスタンスである。

[top]

2. G4VSolidとその継承クラス

G4VSolidは、全てのジオメトリを表すクラスの為の抽象クラスである。Vがついているので、純粋仮想関数を持ち、従ってユーザーは実際にはこれを継承したクラスを用いる。
$G4INSTALL/source/geometry/solids/以下を見ると、以下のディレクトリが見える。

入門として使いやすいものはCSG(例題もほとんどこれを使っている)。BREPSは文字どおり境界面を定義して組み合わせてSolidに組み立てるものだが、マニュアルによればお勧めはCADを使って組み立てろとのこと(BREPSをがりがり自分で書くのは結構大変)。Booleanは意外に重宝するが、計算速度は組み合わせたSolidの数に比例して遅くなるので注意。STEP/STEPinterfaceはCADのSTEP形式アウトプットを読み込んでSolidを作成する(ただしこのインターフェースは将来的には廃止される方向とのこと)。例題が$G4INSTALL/examples/extended/geometry/にあるので、それを参照。

■座標系に関する注意

G4VSolidの継承クラスは、全てそれぞれに固有のLocal座標を持っている。このことから、Solidを組み立てる際に与えるパラメータはLocal座標に対して最も扱いやすい値であることが多い。G4Boxであれば、箱の中心にLocal座標の原点を持っているので、与えるパラメータは縦、横、高さの半分の値である(原点に対しプラスマイナスx、というように与える)。また、Boolean Solidの座標系は、いくつ組み合わされても一番最初に作られるBoolean Solidの第1引数のSolidの座標になる
(余談になるが、Solidクラスの引数がジオメトリの何処のパラメータを表すかは、なかなかマニュアルを見ても分かりづらいことが多い。是非、イラスト付きのマニュアルが欲しいところだが、Developerに頼んでも忙しくて手が回らないと思われるので、これからGeant4を勉強しようというみなさんで色々と実験をしてドキュメントを作ったら如何だろうか。手慣らしには丁度良いのでは。)

■例1 G4Boxの作り方

G4Boxのコンストラクタは次の形をしている。


pX, pY, pZは先述の通りBoxの各辺の半分の値である。

コードの中で用いるには、以下のようにする。

(コレ、オフィシャルのマニュアルからとって来たんですが…このコードではまずいでしょう。
newにしないと、{}を抜けた瞬間にこのBoxは消滅してしまい、ビームを打つ頃には箱が居ない!ということになってしまいます。)

■例2 Boolean Solidの作り方

ソースコードはこちら(CreatePMTSolid関数の中だけ参照のこと)。ただしここまでぐちゃぐちゃにUnionをやってしまうと、Visualizationは大抵失敗する。作ったSolidがまともに働くかどうかは、geantinoを打ち込んでみて正しい位置にHit点を作るかどうかを調べた方がよい。以下は、作ったPMTSolidに360度周辺からgeantinoを打ち込んで作ったHit点をROOTでプロットしたものである(ただし、PMTの表面に点を落とした直後に、track->SetTrackStatus(fStopButAlive)とやってTrackを止めている。我々の用途にはそれで十分なので。)

ちなみに、ROOTでこういう絵を書かせるデータマクロはこちら。

■その他のSolid

マニュアルにも書いてあるが、IEEE03のG.Cosmo氏のTalkFNAL03の浅井氏のTalkなども参考になる。

[top]

3. G4LogicalVolume

G4LogicalVolumeは、上記のジオメトリ情報に測定器の位置情報以外の全ての情報を付け加えたものである。誤解を恐れずに言えば、インストールされる前の測定器と言ってもよいかも知れない。コンストラクタは以下の形をしている。

第一引数は上で定義したSolid、第二引数は2-2aで定義したMaterialのポインタである。LogicalVolumeが持つ情報はここに現れているものとそうでないものがあるが、Setメソッドでセットできる属性も含め、以下の情報を含む。

大部分の測定器がそうであるように、測定器は一般に内部構造を持つ。その内部構造は、測定器の外の座標系には依存せず、測定器自身のローカル座標系にのみ依存すべきである。ビームラインにインストールする前に、測定器の中身をしっかり作り込んでおくのと同じことである。したがって、測定器の階層構造を作りたい時には、親測定器のLogicalVolumeに娘測定器のPhysicalVolumeを配置する。このようにすることで、親測定器を正しい位置にインストールする(PhysicalVolumeを定義することに相当)すれば、娘測定器も自動的に正しい位置に配置される。

実際の測定器と異なる点は、この親子関係は完全に入れ子構造でなくてはならない、という点である。娘Volumeは、親Volumeのジオメトリを決してはみ出してはならない(Trackingがおかしくなる)。また、先にも述べた通り、LogicalVolumeは使いまわしがきくので、全く同じLogicalVolumeを使うなら、例えば2つの測定器をインストールするのに2つのLogicalVolumeのインスタンスを作る必要はない。

[top]

4. G4VPhysicalVolumeとその継承クラス

G4VPhysicalVolumeは上記のLogicalVolumeをどう配置するかを扱うクラスである。これを継承したクラスは次の5つがあり、ユーザーはこれらの5つの置き方のうち適したものを選んで使う。

このうち、初心者が主に使うのは最初の3種類である。以下に、この3種類のそれぞれの置き方を記す。(残り2つについては、本講習会のセッション6-1の浅井氏のTalkを参照)

■G4PVPlacement

かなりたくさんのコンストラクタが用意されているが、大体以下の通り。

pRotはRotationMatrixであるが、このように与えた場合、置かれるLogicalVolumeではなく座標系の方が回転する。普通に物を回転させる感覚でMatrixを作ると、逆方向に回転するので注意。ポインタがコピーされるだけなので、引数として与えるRotationMatrixは予めnewで定義しておく必要がある。tlateは平行移動を与えるベクトルである。
普通のセンスで回転マトリクスを定義したい場合には、G4Transform3Dを使う。これは中身はCLHEPのHepTransform3Dであるが、コンストラクタの第1引数に物が回転する方向の回転マトリクス、第2引数に平行移動のベクトルを与えて作る。

pCopyNoは、同じLogicalVolumeを使っていくつもPhysicalVolumeを置きたい場合につけるコピーナンバーである。pManyは今は使っていない引数なので常にFalseでよい、とのこと。G4PVPlacementで作る1つのインスタンスは一つの検出器(部品)しか代表しないので、置きたい数だけnewで作成する。

■G4PVReplica

1つのLogicalVolumeを簡単な規則によって並べる場合に用いる。注意すべき点は、この機能はむしろ箱形、筒型などの全体を何等分かにしたい場合に使うためのものであるというところである(注。x軸、y軸、z軸、z軸を中心にphi方向などの並べ方があるが、x,y,z軸に関しては軸に対して90度以外の置き方はできないし、phi方向に並べる場合は並べたLogicalVolumeの側面が原点を通っていなくてはならない。風車のような傾いた境界もNG。親VolumeとReplicaの間に隙間をあけるのも禁止されている(widthとoffsetをとるので、一見隙間が許されるように見えるが、これはphi方向のReplicaに限りoffsetをずらすオプションがあるというだけで、いずれにしても隙間は禁止とのこと)。
G4PVPlacementと違い、G4PVReplicaのインスタンスは複数の検出器(部品)を代表する。



山ほどのLogicalVolumeを並べる際(例えばチェンバーのドリフトセルを円筒に並べたい場合など)には、インスタンスを作る手間とメモリの浪費を回避できて重宝する。DAWNなどのVisualizationプログラムで絵を描かせるとnReplicasの数だけのVolumeを描いてくれるが、実体は実は1つしかなく、Tracking が始まると、その1つのLogicalVolumeがTrackのやって来たところまで移動することで仮想的に複数あるように見せている。

■G4PVParametrised

G4PVReplicaが同じLogicalVolume(形状、材質)のものを並べる機能であると考えれば、G4PVParametrisedはLogicalVolumeそのものも並べながらパラメータで変化させて置く置き方である。G4PVReplicaと同様に、1つのインスタンスで複数の検出器(部品)を代表する。置き方という意味ではReplicaより自由度があると言えるが、そのかわり、置いたLogicaVolumeの中に内部構造を作り込んでいる場合(娘LogicalVolumeを既にインストール済みの場合)、自動では内部構造まではパラメトライズされない(※1)ので注意が必要である。

G4PVParametrisedを使うには、別途どのようにパラメトライズさせるかを定義するクラスが必要になる。最後の引数がそれに相当し、ユーザーはG4VPVParameterisationを継承して自分のパラメトリゼーションクラスを作らなければならない。このパラメトリゼーションクラスに最低限要求される関数は次の2つである。

やろうと思えば、以下のようなこともできるとのこと。

詳細は例題/novis/exampleN02, exampleN04を参照のこと。

(※1) ComputeTransformationなどの関数の実装が完全にユーザーに任されているため、コーディングの方法によっては、娘Volumeに向かって再帰的にパラメトライズさせることは可能と思われる。

■注意点(若干重複あり)

[top]

5. 測定器記述の手順

上記の道具立てが揃ったら、実際に測定器を実装できる。この節の初めにも述べたように、Geant4がジオメトリに関して要求するのは、全ての測定器がインストールされたWorld Physical Volumeを作成せよ、という一点である。ユーザーはこの要求をGeant4の枠組みに沿って満たすため、G4VUserDetectorConstructionを継承して独自のDetectorConstructionクラスを作らなければならない。example/novis/ExN01のsrcディレクトリを見ると分かる通り、このユーザークラスは最低限必要なクラスの一つである。

ExN01DetectorConstruction.ccを見ると、Construct関数の中に上から順にMaterialの定義、LogicalVolumeの定義、PhysicalVolumeの定義がされており、最終的にWorld Volumeの中に筒型のTrackerと箱形のCalorimeterが置かれ、それらをインストールしたWorld Physical Volumeが returnされている。全ての検出器がWorldVolumeに直置き出来る場合にはこれで特に不便はないが、場合によっては検出器の内部により詳細な構造を作り込みたい場合があるかも知れない。このような場合には、(内部構造を含む)全ての構造をこのConstruct関数の中に直接書き込むとプログラムが大変読みにくくなり、管理の面で不便である。

このような不便を回避する例題としては、例えば$G4INSTALL/examples/advanced/Tiara/source/tiaraのように独自のBuild関数をDetectorConstructionに付け加えるもの、あるいは第1回Geant4講習会で用いられたExampleU01(※2)のようにインストールする検出器の為のクラスを作り、そのクラスのBuild関数をDetctorConstructionのConstruct関数の中で呼ぶもの等がある。とにかくGeant4が要求するのは中身のつまったWorld Physical Volumeだけであるから、そこに至る過程はプログラマの自由に任されているのである。

(※2)2003年12月現在、ExampleU01はGeant4の最近のバージョン+GCC3ではコンパイル出来ない模様だが、以下のMaterialManagerの44行目を
for(i=0; i< elementTable-> size(); i++) {
のように直す、生endlをG4endlに直す、必要であればnamespaceを定義する、などの操作でコンパイル可能になる。

[top]

6. 可視属性をどう与えるか

ところで、example/N01はコンパイルして走らせても何も絵を見せてくれない。G4VIS_USE変数等を定義してあってもダメである。組み立てた検出器の絵を描かせるには、そのための設定が必要である。

あるオブジェクトを描かせるか否かは、PhysicalVolume単位ではなくLogicalVolume単位でセットされる。G4LogicalVolumeはG4VisAttributeへのポインタを持っており、ここにnewしたG4VisAttributeのインスタンスへのポインタをセットしてやると、G4VisAttributeを通じて様々な設定ができる。

ちなみに、G4VisAttributesのコンストラクタの最初の引数は可視属性のON/OFF、2つ目は何色で描くかをRGBで指定したものである(この例でいうとR=0、G=1、B=1なのでcyan)。
可視化にはこの他にもいくつかの作業が必要だが、ジオメトリに付随する可視情報は全てG4VisAttributeを通して行う。この他、ワイヤーフレーム表示と面表示の属性などもセットできるが、詳細はG4VisAttribute.hhを参照のこと。

[top]

7. その他

Geant4は大変大きなプログラムなので、 例えばG4VisAttributeのコンストラクタの種類が知りたいと思っても、探すのはかなり大変である。Geant4のホームページにLXRを用いた検索システムなどもあるが、ネットワークにつながっていないときは使えないという難点がある。そこで、個人的にGeant4用のfindシェルスクリプトを作ってみた。bash環境でG4INSTALL変数が定義されており、ソースコードを持っていればそのソースコードのフルパスを教えてくれる。実行形式属性を与えて自分のホームのbinディレクトリにでも入れておくと、どこでも使えて便利かも知れない。使用したい人はご自由にどうぞ(ただし使用は自己責任で)。(g4bin.tgzを展開するとあります。右クリックでディスクに保存のこと。)

■ findG4file

■ findG4text

[top]

8. 参考資料

[top]


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

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