-->

Garfieldの使い方


Garfieldとは、CERNで開発されたガス検出器のシミュレーションプログラムです。 日本でもGarfieldはよく使われていますが、少なくとも私が知る限りでは 日本語で書かれた解説サイトは存在しません(誰か知っていたら教えてください)。 それならば自分で作ってしまおうということでこのページを作成しました。 尚、ここが正しいとは限りませんので参照する場合は自分の責任においてお願いします。 また、間違いを発見しましたらご連絡くださると幸いです。

もくじ


Garfieldのインストール

たとえば Nanjo氏のサイトを参照


Garfieldの実行

京大宇宙線研究室の環境では、
nagayosi@gp11% 7-garfield < inputfile
とする。ここで、Garfield実行ファイルは7-garfieldという名前になっている。計算結果は garfield.metafile という名前のPSファイルとして出力される。 (この辺は動作環境によって異なると思う。)


入力ファイルの構成

基本的には以下の各セクションからなる。
CELLセクションtd>検出器の幾何学的形状を決める。ワイヤーなどの電圧もここで与える。
GASセクションガスを決める。
FIELDセクション検出器内の電場を計算する
DRIFTセクション検出器内での電子やイオンの動き(ドリフト、ガス増幅など)を計算する。
各セクション名の頭には「&」をつける。(&CELL、&DRIFT など)
これらを使えば基本的なことはできる。

Garfieldでは、大文字と小文字を区別しない(と思う)。また、コマンドを完全に綴らないで省略して書いてもよい。例えば、"INTEGRATION-PARAMETERS"というコマンドを使いたいときは、これを"INT-PAR"や"Int-par"などと省略してもよい。


CELLセクション

原則として、Garfieldでは検出器の形状をワイヤーと平面で表す。平面やワイヤーのジオメトリ、印加電圧などはこのセクションで与える。 ここでは、使用頻度が高いPLANE、TUBE、ROWSについてそれらの使い方を述べる。

平行平板型電離箱や多線比例計数管などのように平板型の電極の計算を行なうときは、以下のように平板(平面)を定義する。 Garfieldでは「平面」という場合、無限に広い平面を表す。平面を定義するには、PLANEコマンドを使う。書式は以下の通り。
Plane 位置[cm] 電圧[V]
<例>
Plane y 10.0 v 1000.0
この例では、y=10.0のところに平面を置き、1000.0Vの電圧を与えることを意味する。

注意
二つの平面が交わるとエラーとなり、両方の平面が消える。

円筒型比例計数管のようなチューブ状の電極の計算には、TUBE を用いる。ここで、円筒の長さは無限となる。書式は以下の通り。
Tube r=半径 V=印加電圧
<例>
TUBE r={c_rad} V={c_volt}
この例では、後述の方法で円筒の半径と印加電圧を与えている。

ワイヤーの位置および印加電圧は、ROWSというコマンドで与える。複数のワイヤーを使う場合、ここで一度に定義できる。 ROWSの書式は以下の通り。
Row
ラベル 本数 直径[cm] X座標[cm] Y座標[cm]
ラベル 本数 直径[cm] X座標[cm] Y座標[cm]
...
(空行)
ROWSでワイヤーを定義するとき、ラベルや本数を表す文のあとに必ず空行を入れる。さらに、電圧やワイヤーの長さ、張力、密度を指定することができる。その場合は以下のように書く。
Row
ラベル 本数 直径[cm] X座標[cm] Y座標[cm] 電圧[V] 長さ[cm] 張力[g] 密度[g/cm^3]
...
(空行)
<例>
Rows 
s 1 0.0050 0.0 0.0 3000.0 15.0 30.0 8.93

この例では、sというラベルをつけて長さ30cm、直径50μmの銅ワイヤー (密度8.93g/cm^3)を(0.0, 0.0)に張り、15g重の張力をかけて3000Vの電圧を印加している。一度に複数のワイヤーを定義する場合は、次の例のように変数"i"を使用する。 (iは整数を表すが、0から始まるか1から始まるかは忘れた。)
a 5 0.0049 (0.0100*i) -0.0020 1000.0
複数のワイヤーが重なる場合は、どちらかが消える(無視される)。また、ワイヤーと平面が重なる場合はワイヤーが無視される。


GASセクション

ここでは、使用するガスを決定する。また、ドリフト速度などのガスの性質を表示することもできる。 よくガス検出器に使われる以下の代表的なガスについては、そのままガスの種類を指定できる(built-in)。

ガスの種類を指定しない場合は、これ以後の計算については、 CO2(二酸化炭素)が指定されたものとして扱う(と思う)。

<例>

Argon-80-Ethane-20

ガス中での電子のドリフト速度や拡散などは、GarfieldからMagboltzというプログラムを呼び出して計算する。 Magboltzでは、基本的には使用するガスとその割合、計算に用いる電場強度の範囲を指定する。 Magboltzには非常に多くの機能があるので、詳しくはオンラインヘルプを参照されたい。

<例>

MAGBOLTZ ARGON 80 ETHANE 20 ...
         electric-field-range 50.0 400000.0 N-E 50 ...
         mobility 1.7*10^(-6)

Magboltzの計算にはかなり時間がかかるが、計算結果をファイルに残しておけば次回以降に同じガスを使って計算するときに短時間でガスのデータを取り込める。

<例>

Global gasfile `AR8ETHANE2_HF.DAT`
Call inquire_file(gasfile,exist)
If exist Then
  Get {gasfile}
Else
  MAGBOLTZ ARGON 80 ETHANE 20 ...
           electric-field-range 50.0 400000.0 N-E 50 ...
           mobility 1.7*10^(-6)
  Write {gasfile}
Endif
この例では、まずGlobalコマンドを使ってMagboltzの結果を書くファイル名を定義する。その後、そのファイルが存在するかチェックし、ファイルがあれば(前回までに計算した)ファイルを読み込み、ファイルがなければ新しくMagboltzでガスのデータを計算してGlobalコマンドで定義したファイルに書き込む。

ガスに関するデータを出力するにはオプションを用いる。

<例>

Option gas-print gas-plot
この例では、標準出力(?)にガス中での電子ドリフトなどのデータを出力し、さらにそのデータをグラフにプロットする。

また、オプションではないが、

TEMPERATURE 300 K
PRESSURE 1.0 atm
とするとガスの温度(ここでは300K)や圧力(ここでは1気圧)を決めることもできる。


FIELDセクション


DRIFTセクション


変数の扱い

複数のワイヤーや平面に電圧を与えるような場合、各々のROWやPLANEなどに個別に与えると、設定値を変更したいときは個別に書き直す必要があり、これがミスの原因ともなる(変更し忘れるなど)。そこで、このような場合はある一ヶ所でまとめて電圧などを決めて変数として与え、ROWやPLANEなどではこの変数を用いるのが良い。 変数は、Globalコマンドで定義する。ここで定義した変数を他のところで参照するときは、中括弧{ }で括る(例1)。ただし、Callを使ってさまざまな計算をするとき、引数として使いたいときは中括弧で括らずにそのまま参照する(例2)。

<例1>

Global a_volt = 5000.0
Global c_volt = 0.0
...
&CELL
Plane y 10.0 v {a_volt}
Plane y -10.0 v {c_volt}
<例2>
Global pitch=0.04
Global xcen=0.0
Global xmin=xcen-(pitch/2.0)
Global xmax=xcen+(pitch/2.0)
<例3>
&GAS
Global fname `AR8ETHANE2.DAT`
Call inquire_file(fname,exist)
If exist then
  Get {fname}
Else
  MAGBOLTZ ARGON 80 ETHANE 20 ...
           electric-field-range 50.0 220000.0 ...
           mobility 1.7*10^(-6)
  Write {fname}
Endif
例1のように、ワイヤーや平面(ドリフト電極)に電圧をあたえるときなどに使うと便利。例2のように、他のGlobal文で先に定義した変数を使うこともできるがそのときは中括弧{ }をつけない。このほかに、繰り返し処理や入出力ファイル名を指定するときにも使う(例3)。


小技

MAGBOLTZなど、1行が長いコマンドを使用するとき、行の末尾を「...」(ピリオド三つ)にすると、つぎの行はコマンドの継続とみなされる。例については、上記「変数の参照」の<例2>を参照。

入力ファイル中で、
$ shell command
と入力する。

<例>

$ ls -a
Global gas_file `AR8ETHANE2.DAT`
$ ls -l {gas_file}
このように、shellコマンドの引数としてGlobalコマンドで定義した変数を使うこともできる。

以下のような書式を使うと、Garfieldコマンドの結果をファイルへ出力できる。この場合も、ファイル名にGlobalで決めた変数名を参照できる。
> filename
(Garfield commands)
>
はじめの行でファイルを開き、Garfieldコマンドを実行した後、最後の行の「>」でファイルを閉じる。
<例>
Global fname `townsend.dat`
Call drift_electron(-0.01,0.04,status,time,diffusion,townsend)
> {fname}
Say "{townsend}"
>
この例では、ガス増幅率をファイルに出力している。PAWやROOTなどで結果を解析したいときに使うと良い。出力フォーマットは以下のようになっている。
*----.----1----.----2----.----3----.----4----.----5----.----6----.----7----.----8----.----9----.---10----.---11----.---12----.---13--
% Created 06/01/03 At 21.34.39 < none > OUTPUT   "Printed output               "
  (Garfield$B$+$i$N=PNO(B)
数字だけのファイルにしたいときは、適当なシェルスクリプトなどを使って不要な部分を削除する必要がある。

このコマンド(?)は、開きたいファイルが存在しないとき(新規のファイルに書き込むとき)はそのファイルを生成し、存在する場合は既にあるファイルの末尾に書き足している。従って、条件を変えて計算をやり直す場合などは、既に存在するファイルを消す必要がある。これはGarfieldを実行する前に手で消しても良いが、Garfield内で次のようにしてもよい。

Global fieldfile `field_kiban_2um.dat`
Call inquire file(fieldfile,exist)
If exist Then
  Say "Old {fieldfile} is being removed."
  $ rm {fieldfile}
Endif

Global zlim=thick+0.0021
> {fieldfile}
Plot graph E on '{a_radi}*cos(2*pi*t)+{xcen},{a_radi}*sin(2*pi*t)+{ycen},{zlim}' N 75 print
Say "test"
>
この例では、Call文を使って「field_kiban_2um.dat」というファイルが存在するか否かを調べ、存在する場合はそのファイルを消している。こうすることによって、Garfieldを実行する度にファイルを上書きできる。(これを忘れて何度も同じ計算をしていると巨大ファイルができることになるので注意。)



トップに戻る