よい子の ぢゃーんと にゅうもん - 理化学研究所 先端中間子 研究室

よい子の
ぢゃーんと にゅうもん
山本 昌亘 著
岡大核研出版
Dedicated t o all my poi son fri ends .
2
初版序
本書は Detector Simulati on tool 「 GEANT 3.15 」の恐ろしく基本的な入門書です。対
象となる読者としては、GEANT に関しては全くのド 素人ですが、FORTRAN の簡単な
プログラムの書き方を知っていて、UNIX の基本的なコマンド (l og i n、l og out 、l e 操作、
edi tor での文書作成、FOR TRAN Compi l er の実行) も知っている、という高エネルギー物
理学専攻の学生を想定しています。そしてこの文章を読んでいるからには以下のような立
場に立っているのでしょう。
平穏な日々を送っていた学生にある日、
「 GEANT
を使ってみようか」とい
う魔可不思議な仕事が降って湧いたように現れた。よし、やるぞ!と意気込ん
でいるところへ「じゃあ、とりあえずこのマニュアルの Geometry のところか
ら読んで。」という抑揚の無い一言とともに、ド サッと手渡される 431 ページ
の分厚いマニュアル。うへぇーと素っ頓狂な声を上げていたその学生は、ペー
ジをめくった瞬間化石と化す。
全部英語・
・
・
・
・
・。
「英語が3度の飯よりも大好き!」という人ならともかく、よほどの神童でない限り初めて
GEANT を扱うときには、戸惑いや焦燥感にかられることでしょう。ですが、誰かに尋ね
ようと思っても周りは忙しい人達ばかり。こんなとき何か参考になる本でもあれば・
・
・
・
・
・。
そう思うのは当然の成り行きでしょう。
ここで、ある一人の学生の例を紹介しましょう。
彼は「学食の帝王」の異名を持つ岡大物理学科の4年生です。私 (著者) は彼のことを
とてもよく知っていて他人のような気がしないほどなのですが、そんな彼は 1994 年 9 月
17 日、GEANT を使うという仕事に手を出してしまったのです。それから彼はちびちび
と GEANT
を理解し始め、何とかプログラムを走らせたのはすっかり秋の気配も深まった
1994 年 10 月 21 日の夕方でした。そのとき彼はこう考えたそうです。
「あとからまた使い始める人が GEANT に慣れるのにこんなに時間がかかっ
ていては、仕事がなかなか先に進まない。この程度のことなら何か簡単な手引
き書があれば3日でできるだろう。」と。
彼から話を持ちかけられた私は、その考えに同意し、僭越ながら彼の1ヶ月を凝縮した
手引き書を書く決心をしました。そしてこの度なんとか完成した初版を一般公開すること
となりました。執筆の際に注意したことは、多少格好悪くても、とにかくバカ丁寧に説明
することでした。ですから本書は、最初に一回使ったらあとはもう使わなくていい、とい
う程度のものです。そのために必要最小限のことしか書いていないつもりです。難解な点
や、曖昧な点はあっさりと理解することを諦めています。一回読み通したあとには、決して
GEANT のマニュアルと一緒に本棚に並べて置くようなことはしないでください。そして
3
次のステップに進んだあかつきには、
「なんだこの紙屑は」とバカにできるぐ らいになって
いることでしょう。本書の読者がそうなってくれれば物書き冥利につきるというものです。
さて、本書の出版にあたって、前述の「学食の帝王」氏をはじめ、岡大高エネルギーグ
ループ の主・田村 詔生先生、修士課程の前大道 浩之 氏、高旗 誠 氏のお力添えをいただ
きました。この場を借りてお礼申し上げます。
最後になりましたが、岡大高エネルギーグループが今後ますます発展することを祈念い
たします。
1995 年 春先 岡山にて
山本 昌亘
4
目次
目 次
1 GEANT とは?
5
2 プ ログラムリスト の詳説
7
2.1
2. 2
2. 3
2. 4
2. 5
2. 6
2. 7
GEANT
のプログラム全行 : : : :
Geometry( 検出器の配置) : : : : :
タイトル : : : : : : : : : : : : : :
メインプログラム : : : : : : : : :
初期化のためのサブルーチン : :
2. 5. 1 サブルーチン ugini t : : :
2. 5. 2 サブルーチン ugeom : : :
2. 5. 3 サブルーチン uhi ni t : : :
シミュレーション過程 : : : : : :
2. 6. 1 サブルーチン guki ne : : :
2. 6. 2 サブルーチン gut r ev : : :
2. 6. 3 サブルーチン gut r ak : : :
2. 6. 4 サブルーチン guhadr : : :
2. 6. 5 サブルーチン guphad : : :
2. 6. 6 サブルーチン gust ep : : :
2. 6. 7 サブルーチン gudi gi : : :
2. 6. 8 サブルーチン guout : : : :
終わり処理のためのサブルーチン
2. 7. 1 サブルーチン uglas t : : :
: : : : : : : : : : : : : : : : : : : : : : :
7
: : : : : : : : : : : : : : : : : : : : : : :
11
: : : : : : : : : : : : : : : : : : : : : : :
12
: : : : : : : : : : : : : : : : : : : : : : :
12
: : : : : : : : : : : : : : : : : : : : : : :
19
: : : : : : : : : : : : : : : : : : : : : : :
19
: : : : : : : : : : : : : : : : : : : : : : :
26
: : : : : : : : : : : : : : : : : : : : : : :
35
: : : : : : : : : : : : : : : : : : : : : : :
38
: : : : : : : : : : : : : : : : : : : : : : :
38
: : : : : : : : : : : : : : : : : : : : : : :
41
: : : : : : : : : : : : : : : : : : : : : : :
41
: : : : : : : : : : : : : : : : : : : : : : :
42
: : : : : : : : : : : : : : : : : : : : : : :
43
: : : : : : : : : : : : : : : : : : : : : : :
43
: : : : : : : : : : : : : : : : : : : : : : :
46
: : : : : : : : : : : : : : : : : : : : : : :
46
: : : : : : : : : : : : : : : : : : : : : : :
49
: : : : : : : : : : : : : : : : : : : : : : :
49
3 GE ANT の走らせ方
3. 1
3. 2
3. 3
3. 4
dat a car d
を作る : : : : : :
mak e でコンパイル&リンク
GEANT
を走らせる : : : :
PAW でヒストグラムの出力
52
: : : : : : : : : : : : : : : : : : : : : : : : : :
52
: : : : : : : : : : : : : : : : : : : : : : : : : :
53
: : : : : : : : : : : : : : : : : : : : : : : : : :
55
: : : : : : : : : : : : : : : : : : : : : : : : : :
56
5
1
GEANT とは?
_
GEANT は、検出器のシミュレーションをち_ ゃ_ ー_ ん_ とやってくれる
(ですから「ちゃー
んと」という日本語がなまって「ぢゃーんと」という名前が付いたのです。) サブルーチ
ン集のことです。サブルーチンとは「プログラムの小さな一かたまり」のことですが、そ
の一つのサブルーチンだけで何か仕事ができるというわけではありません。サブルーチン
が集まって一つの大きなプログラムができあがり、そうして初めて仕事が遂行できるわけ
です。
というわけで、GEANT にはうんざりするほと多くのサブルーチンが用意されています。
つまり G
E
A
N
T
を使うということは、
数多くのサブルーチンの中から自分のやりたいシミュレーシ
ョンに必要なサブルーチンを選び出し、それらのサブ ルーチ
ンをプ ログラムの中に正確に書き記していく
という作業に他なりません。はっきりいって面倒くさいです。しかも初心者ならば「どのサ
ブルーチンが必要で、どのサブルーチンがいらないのか」という見分け方が、はじめの内は
分かりません。マニュアルには確かに詳しく説明されているのですが、これも最初の内は
マニュアルのどこを読めばよいのかがわかりません。(わかる人は本書を読まないように!)
そこでとにかく、この「よいこの ぢゃーんと にゅうもん」を一通り読んでもらいた
いのです。本書では必要最低限のサブルーチンをほぼカバーしています。そしてこれもあ
とになって分かることですが、別のシミュレーションをやるときに書き換える部分は、ほ
んのわずかだということです。
それでは次の節からは、
「学食の帝王」氏の書いた GEANT
のプログラムを実際に眺め
ながら、その中に出てくるサブルーチンを一つ一つ解説していく、という形式で GEANT
の理解を深めて行こうと思います。上々颱風のアルバムに「亜州一周八十日間」というの
がありましたが、ここはひとつ「 GEANT
半周三日間」というノリでいってください。
1
6
GEANT とは?
練習問題
1. GEANT
を作ったのは日本人である。True
or False?
2.
キリスト教信者を昔キリシタンと呼んでいた。また、インダス川が国土を流れる国
は、パキスタンである。それでは 1 99 8年に日本の高エネルギー物理学研究所で稼働
予定の実験施設の名称は?
3.
岡大高エネルギーグループの院生にはずっと高エネルギー物理学研究所で仕事をして
いる人が多い。では、そのときどこに泊まっている?
(a )
筑波にある一泊 2 00 0 0円の一流ホテル
( b) 研究所内の一泊 50 0 円の宿泊施設
( c) メインリング (1周約 3 km)内の一泊 0
円の野営テント
7
2 プ ログラムリスト の詳説
さあ、ここからが本番です。いよいよ GEANT のプログラムとご対面です。この節では
いきなりで恐縮ですが、何の前触れも無しにプログラムリストの説明に入らせてもらいま
す。それでも理解できるように極力丁寧に解説しているつもりです。
2.1
GEANT
のプログラム全行
まずは、GE ANT のプログラムを実際に見てもらいましょう。
C
C
C
C
C
/////////////////////////////////////////////////////////////////
Energy Deposite Simulation
in case a pion incidents into the BOX-type Calorimeter
programed by TEIOU OF GAKUSYOKU
Oct. 1994
/////////////////////////////////////////////////////////////////
C
C
Main Program
parameter (ngbank=80000, nhbook=10000)
common /gcbank/q(ngbank)
common /pawc/h(nhbook)
call gzebra(ngbank)
call hlimit(-nhbook)
call uginit
call grun
call uglast
stop
end
#################################################################
subroutine uginit
C
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /gconst/ pi,twopi,piby2,degrad,raddeg,clight,big,emass
common /gckine/ ikine,pkine(10),itra,istak,ivert,ipart,itrtyp,
napart(5),amass,charge,tlife,vert(3),pvert(4),ipaold
+
common/udata/ pbeam,itype,esum
call ginit
pbeam=10.0
itype=8
call ffkey('mome',pbeam,1,'real')
8
2 プログラムリストの詳説
call ffkey('type',itype,1,'inte')
ikine=itype
pkine(1)=pbeam
call
call
call
call
call
call
call
gffgo
gzinit
gpart
gmate
ugeom
gphysi
uhinit
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine ugeom
C
common /gctmed/ numed,natmed(5),isvol,ifield,fieldm,tmaxfd,
stemax,deemax,epsil,stmin,cfield,prec,iupd,
istpar,numold
+
+
common /udata/ pbeam,itype,esum
dimension a(2),z(2),wmat(2),par(3)
data a /132.91,126.9/
data z /55.0,53.0/
data wmat /1.0,1.0/
call gsmixt(21,'CsI',a,z,4.510,-2,wmat)
call gstmed(1,'CsI',21,0,0,0.0,0.0,0.1,0.2,0.01,0.2,0.0,0)
call gstmed(2,'VACUUM',16,0,0,0,0.0,0.1,0.2,0.01,0.2,0.0,0)
call vzero(par,3)
par(1)=5.0
par(2)=5.0
par(3)=15.0
call gsvolu('CALO','BOX ',1,par,3,ivolu)
call vzero(par,3)
par(1)=100.0
par(2)=100.0
par(3)=100.0
call gsvolu('VACU','BOX ',2,par,3,ivolu)
call gspos('CALO',1,'VACU',0.0,0.0,10.0,0,'ONLY')
call gsord('VACU',3)
call ggclos
C
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine uhinit
2.1
GEANT
のプログラム全行
common /udata/ pbeam,itype,esum
call hbook1(10,'Energy-Deposit in CsI',100,0.0,1.0,0.0)
return
end
#################################################################
subroutine gukine
C
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /gckine/ ikine,pkine(10),itra,istak,ivert,ipart,itrtyp,
napart(5),amass,charge,tlife,vert(3),pvert(4),ipaold
+
common /udata/ pbeam,itype,esum
dimension vert(3),plab(3)
esum=0.0
call vzero(vert,3)
vert(1)=0.0
vert(2)=0.0
vert(3)=-6.0
call gsvert(vert,0,0,0,0,nv)
call vzero(plab,3)
plab(1)=0.0
plab(2)=0.0
plab(3)=pkine(1)
call gskine(plab,ikine,nv,0,0,nt)
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine gutrev
C
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
call gtreve
C
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine gutrak
call gtrack
return
end
9
10
2 プログラムリストの詳説
C
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine guhadr
call gheish
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine guphad
C
call gpghei
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine gustep
C
parameter (maxmec=30)
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /gcking/ kcase,ngkine,gkin(5,100),tofd(100)
common /gckine/ ikine,pkine(10),itra,istak,ivert,ipart,itrtyp,
napart(5),amass,charge,tlife,vert(3),pvert(4),ipaol
+
common /gctmed/ numed,natmed(5),isvol,ifield,fieldm,tmaxfd,
stemax,deemax,epsil,stmin,cfield,prec,iupd,
istpar,numold
+
+
common /gctrak/ vect(7),getot,gekin,vout(7),nmec,lmec(maxmec),
namec(maxmec),nstep,maxnst,destep,destel,safety,
sleng,step,snext,sfield,tofg,gekrat,upwght,ignext,
inwvol,istop,igauto,iekbin,ilosl,imull,ingoto,nldown,
nlevin,nlvsav,istory
+
+
+
+
common /udata/ pbeam,itype,esum
if(numed.eq.1) then
if(destep.gt.0.0) then
esum=esum+destep
end if
end if
if(ngkine.gt.0) then
do i=1,ngkine
call gsking(i)
end do
end if
return
2.2
Geometry(検出器の配置)
11
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine gudigi
C
return
end
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
subroutine guout
C
common /udata/ pbeam,itype,esum
call hf1(10,esum,1.0)
return
end
#################################################################
subroutine uglast
C
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ideorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /udata/ pbeam,itype,esum
call histdo
call hrput(0,'exam.hst','n')
call glast
return
end
いかがですか?これは「これ以上簡単なシミュレーションはない!」と言い切れるほど
の稚拙なシミュレーションなのですが、GEANT を理解するにはこういう簡単なものから
入るのが一番早道でしょう。
2.2
Geometry(検出器の配置)
では、これはいったい何のシミュレーショ
10cm
ンをしているのでしょうか?次の図1を見て
+
10GeV π
下さい。つまり、真空中に 10cm 10cm
30cm の大きさを持ち、CsI( ヨウ化セシウム)
Calorimeter(CsI)
10cm
という物質からできている Cal or i met er と呼
ばれる検出器を置いておき、その Cal or i me30cm
t er に向かって 10GeV のエネルギーを持つ
+ 中間子を打ち込んで、Cal or i met er 中で
図 1: Calorimeter
+
のエネルギーがどれだけ減少するか、言
い換えれば、Cal or i met er 中にどれだけのエネルギーを残していくか、ということを例えば
2
2
12
2 プログラムリストの詳説
1000 個の + について GEANT にシミュレーションしてもらい、その統計を見るのです。
こういうのを
中での
を見る、と言います。
CsI
Energy Deposit
このように、検出器を配置することを GEANT では Geometry と呼び、マニュアルで
は GEOM というページがこれに該当します。ですからさらに詳しい解説が必要なときに
は GEOM のページを開いて英語とにらめっこしてください。
何のシミュレーションをやっているかわかったところで、では、それを GEANT にどの
ようにやらせるのか、細かく見ていくことにしましょう。先の図1を参照しながら読んで
いくとよいでしょう。
2.3
タイト ル
では、まずはプログラムの 1 行から 5 行までを見てみましょう。
C
C
C
C
C
/////////////////////////////////////////////////////////////////
Energy Deposite Simulation
in case a pion incidents into the BOX-type Calorimeter
programed by TEIOU OF GAKUSYOKU
Oct. 1994
/////////////////////////////////////////////////////////////////
この部分はただのタイトルです。誰が、いつ、何のプ ログラムを作ったのかはっきり分か
るように書きましょう。おもいっきり目立つように。ご存知でしょうが、左端の C はコメ
ント行で人間には見えますが、コンピュータには無視される行です。
あとから見て分かりやすいプ ログラムにするために、コメント 行はこまめに入れまし
ょう。
2. 4
メインプ ログラム
8 行から 22 行までを見てみましょう。
C
Main Program
parameter (ngbank=80000, nhbook=10000)
common /gcbank/q(ngbank)
common /pawc/h(nhbook)
call gzebra(ngbank)
call hlimit(-ngbook)
call uginit
call grun
call uglast
stop
end
2.4
13
メインプログラム
「実は GEANT のプログラムはこれだけである」、と申し上げたならおそらくクレーム
がつきそうなので、もう少し丁寧に言いましょう。
Main Program
といってプログラムの実行の手順 (順番) を示している部分で
この部分は
す。この部分から必要な GE ANT のサブルーチンが呼び出されます。そして最も重要なこ
とは、何を呼び出すかは User (本書を読んで GE ANT を走らせようともくろんでいる あ
なた) が指定しなければならないということです。
Main Program
いきなり選択を迫られました。しかし困った困ったどうしようと悩むことはありません。
なぜなら
に書くことはほぼ決まっていて、たいていの場合上の
通りに書いておけばよい
からです。安心しましたか?というわけで、もしまた別のシミュレーションをやろうと言
うときにも、
は上の通りに書いておけばよいのです。
Ma i Pn rog ar m
ですが、念のために一行づつ説明していきます。
parameter
( ngban k=800 0 n
0h
,boo k =1 0 0 0 0 )
定数を定める
あまり大した意味はありません。ngbank と nhbook という変数にある値を代入する文
です。ngbank と nhbook は後ほど出てきます。
common
/gcbank/
q( n g b a n k )
GEANT のデータを格納する commo nblock
n gb an 適当な整数
k:
(800 0 な
0 ど)
FORTRAN でお馴染みの common
文 が出てきました。ご存知とは思いますがプログラ
ム中のすべてのサブルーチンを通じて共有される変数群です。この gc bankという co mmo n
b lock は GEANT のシミュレーションに必要なデータや、シミュレーションで得られたデー
タなどの格納に必要な変数群を提供します。そのあとの q(ngbank) は配列です。q ( 1 ) , q (
111 q ( n g b a n
k)
までの変数が用意されます。
0
で、なぜ n g b a n=k 8 0 0 0なのか?と聞かれても著者にも分かりません。マニュアルに
書いてあるかも知れませんし、書いてないかもしれません。ここはひとまずこう書いてお
2) ,
2 プログラムリストの詳説
14
いて下さい。
commo n/pawc /
h(nhbook)
HBOOK のデータを格納する commo n block
n hboo k 適当な整数
:
(100 0 0など)
また common block です。しかし今度の c ommon bl ock はおそらく GEANT のマニュア
というものを紹介しましょう。
ルには載っていません。ここで
HBOOK
GEANT
でシミュレーションした結果はヒストグラムにして出力することが多いのです
が、そのときに自分でいちいちヒストグラムを生成するサブルーチンを書いていては面倒
という便利なサブルーチン集を使って、求めたい頻度分布をヒス
くさいので、
トグラムにしてもらいます。どのようにして HBOOK にヒストグラムを生成させるかはあ
とになって出てきます。
HBOOK
pawc
HBOOK
という c ommon bl ock は
のためのデータを格納しておく変
それでこの
数群を提供します。で、例によってなぜ nhbook = 10000 なのかと尋ねられても著者には
分かりません。詳しくは HBOOK のマニュアルに載っているかも知れませんし載っていな
いかも知れません。とりあえずここもこう書いておいて下さい。
c a llgzebra
( ngbank)
ZEBRA で管理するメモリを割り当てるサブ ルーチン
n gb an k適当な整数
:
( 80 0 0ぐ
0 らい)
さて、FOR TRAN でお馴染みの call 文が出てきました。分かっているとは思いますが、
サブルーチンを呼び出す命令です。以後、この cal l 文がやたらと出てきます。そう、
GEANT
は cal l 文のプログラムである。
と言っても過言ではありません。
gzebra
とは何者でしょう。実は著者もよくわかっていません。何かメ
では、そのあとの
モリを割り当てるサブ ルーチンらしいですが、その詳しい動作は知らないのです。そもそ
というのが何かよく分かっていません。GEANT や HBOOK などは
も
と呼ばれている一連の便利な tool 集で、他にも
(グラフの描画) や
(
グラフや図形の描画) などといったものがよく使われるのですが、それらのメモリ管理を
引き受けているのが
らしいということしか言えません。
ZEBRA
Lib r a r y
PAW
ZEBRA
CERN
HPLOT
2.4
15
メインプログラム
ですからここも申し訳ありませんが、この「よいこの ぢゃーんと にゅうもん」では
深く立ち入らずに先に進むことにします。
ちなみに
gzebra の g は GEANT の G です。
GEANT
の提供するサブルーチンには頭に
んどです。
g の付いているものがほと
例外もありますが、それは後ほど出てきます。
call hlimit
(-ngbook)
HBOOK のメモリを管理するサブ ルーチン
ngboo k:適当な整数 (100 0 0ぐ らい)
今度は
HBOOK
h で始まるサブルーチンが出てきました。この hlimi t は、先ほど出てきました
のためのメモリを管理するサブ ルーチン なのです。ちなみに詳しい動作原理は
分かっていません。ですから、これも真似をしておきましょう。
HBOOK
gzebra
の提供するサブルーチンには頭に
んどです。
h の付いているものがほと
hl i mi t
ところで
も
もメモリを初期化するサブルーチンですが、基本的には
の用意したメモリをさらに
が使う、という形式をとっていますので、
h limi t
を
gzebra
hl i mi t
g zebra より先に書いてはいけない!
ということを頭に入れておいて下さい。もしも順番を入れ換えたなら GEANT
が走らない
2 プログラムリストの詳説
16
だけでなく、最悪の場合ワークステーションが爆発する危険性があります。
call uginit
GEANT の初期設定をするサブ ルーチン
call grun
GEANT のシミュレーションを司るサブ ルーチン
call uglast
GEANT の終わり処理をするサブ ルーチン
さて、3 行まとめて出てきましたが、これにはわけがあります。
GEANT
は3つ局面から成り立っていることをここで説明します。
初期化 (uginit)
どんな検出器を使うか (物質・大きさ・形) 、検出器をどこに配置するか、何の粒子を
打ち込むか (+ ・ など) 、などといったシミュレーションのお膳立てをする局面で
す。また GEANT
で使うデータのためのメモリの初期化も行います。
シミュレーションの実行 (grun
)
配置の終わった検出器に向かって粒子を繰り返し打ち込む局面です。その際の粒子と
検出器の原子との相互作用は GEANT
が決めます。User は自分の調べたい値 (Energy
Dep osit など) をこの局面で取得し、HBOOK に送ります。
終わり処理 (uglast
)
粒子を打ち込み終わって、その結果をヒストグラムなどに出力する局面です。また、
シミュレーションで得られたいろいろな値を出力します。
以上の 3 つの局面が順番に実行されて初めてシミュレーションが成功するわけです。とい
うわけで、初期化 ! 実行 ! 終わり処理の順番でプ ログラムが流れて行くように
内で指定するわけです。それがこの uginit 、grun 、uglast なのです。ですから
これも真似をしてこのまま書いておいて下さい。
Main
Program
ところで u で始まるサブルーチンが現れましたが、GEANT
では
2.4
17
メインプログラム
babababababababababababababababababababab
ug もしくは gu で始まるサブ ルーチンは User が書かなければな
らない!
という識別方法をとっています。ですから最初の 2 文字の中に
要注意です。
Mainprogram
u のあるサブルーチンは
の説明です。今のところはこの程度の知識があれば十分使えます。
以上が
というか真似ばっかりです。ある先生がこうおっしゃいました。
「 GEANT 上達の早道は他
人の書いたプログラムをよく見ることだ」と。こういうことを指すのでしょう。
2 プログラムリストの詳説
18
練習問題
は Conseil Europ
e en pour l aRecherche Nucleai re の略である。日本語訳は何
という?
1. CERN
2.
フェルミ国立加速器研究所 (通称 Fermi lab. ) 周辺に、放射光をたっぷり浴びたバッファ
ローがうようよしているのは有名な話である。これに対して CERN では、ZEBRA
というメモリ管理の tool 集があることから想像がつくとおり、しまうまが多数生息
している。Tr ue or Fal se?
2.5
初期化のためのサブルーチン
19
初期化のためのサブルーチン
2.5
メインプログラムの説明で出てきた 3 つの局面のうち、まず初期化を司るサブルーチン
について見てみましょう。
サブ ルーチン
2.5.1
uginit
uginit
の中身を説明します。このサブルーチンは ug で始まっているので user が書か
なければなりません。24 行から 54 行までを見てみましょう。
subroutine uginit
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /gconst/ pi,twopi,piby2,degrad,raddeg,clight,big,emass
common /gckine/ ikine,pkine(10),itra,istak,ivert,ipart,itrtyp,
napart(5),amass,charge,tlife,vert(3),pvert(4),ipaold
+
common/udata/ pbeam,itype,esum
call ginit
pbeam=10.0
itype=8
call ffkey('mome',pbeam,1,'real')
call ffkey('type',itype,1,'inte')
ikine=itype
pkine(2)=pbeam
call
call
call
call
call
call
call
gffgo
gzinit
gpart
gmate
ugeom
gphysi
uhinit
return
end
2 プログラムリストの詳説
20
以上が uginit の内容です。あっさりしていますが、ここもお決まり通りに書くことが多い
のです。しかし重要なことも少々含んでいますので丁寧に見ていきましょう。
commo n/gc ag /
idebug,etc.. .
ag
のための
commo nblock
には ag という概念があるのですが、説明しづらいです。本書ではそこまで立
ち入らないつもりなのですが、簡単に言えば、自分の好みに合わせてシミュレーションを
実行させるための目印 (旗=ag) なのです。シミュレーション過程は普通 GEANT が勝手
に行いますが、そのところどころを自分の好みに合わせたい・
・
・
・
・
・、という場合です。ま
あ、そんなものがある、ということを心に止めておいて下さい。
GEANT
c o mmo /n g c o n st/
pi , et c. . .
自然定数のための
c o mmo bn l ck
o
いろいろな自然定数です。例えば pi= 3:1415 1 1 1 などです。まあこれはここでごちゃご
ちゃ書くよりマニュアルを参照して頂いた方が早いです。ただ big というのはちょっと気に
留めておいて下さい。十分に大きな数として採用されるのですが、デフォルトでは 1:0 2 10 10
に設定されています。これが気にくわない場合がもしかしたら出てくるかも知れません。
まあ、これもそんなものがあるという程度です。
c o mmo /n g kin
c e/
i ki ne, et c. . .
入射粒子の値のための
common
bl ock
でシミュレーションをしている際には、対象となる粒子を少し動かしては検出
器の物質との相互作用を見て、少し動かしては相互作用を見て・
・
・
・
・
・ということを繰り返
しています。この過程を trac king と呼ぶのですが、その際に使われる様々な変数のため
の common blo ck です。いろんな変数が出てきますが特に重要と思われるものを挙げてお
きます。
G
EA
N
T
整数):入射粒子の型です。例えば = 1; +
ルの gpart のところに書いてあります。
ikine(
pkine(1)(
実数):入射粒子の運動量です。単位は
= 8
G
ev/c
などです。詳しくはマニュア
です。
2.5
21
初期化のためのサブルーチン
pkine(2)(実数):入射粒子の z 軸上での最初の位置です。単位は cm です。(図1でも
分かるとおり z 軸を、普通 beam line と一致させることが多いです。)
vert(1)( 実数):入射粒子の x 軸上での最初の位置です。単位は
c mです。
vert(2)( 実数):入射粒子の y 軸上での最初の位置です。単位は c mです。(図1でも
分かるとおり y 軸を、普通重力の働く向きと逆にとることが多いです。)
vert(3)( 実数):入射粒子の z 軸上での最初の位置です。単位は c mです。(図1でも
分かるとおり z 軸を普通 be a ml i nと一致させることが多いです。
e
)
さて3つほど
出てきます。
c ommo n
b l ck
o
が出てきましたが、このあともいろいろな c
o mmo bn l ck
o
が
babababababababababababababababababababab
とのサブルーチンにどの
commo nblock が必要なのか?
ということはとても重要なことです。これを誤ると GEANT が走らない原因となりま
す。実は著者もこの点には今だに苦労しており、明確な選別ができない状態です。
ですが
babababababababababababababababababababab
この「よいこの ぢゃーんと にゅうもん」で取り上げら
れた common bl ock は最低限必要なものである!
ので、自分で何かシミュレーションをする際にも、本書で取り上げられた c o mmo bn l ck
o
は必ず書いておいて下さい。
こういうことはマニュアルを詳しく読めば分かることなのでしょうが、著者はそれがど
こに書かれてあるのか見つけることができませんでした。他力本願で申し訳ありませんが、
読者が捜して頂けたなら幸いです。
commo n/udata /
pbe a m,e tc .. .
user が使う common
bl ock
これは GEANT の提供する c o mmo bn l ck
o ではなく「学食の帝王」氏がプログラムを作
る際に、全てのサブルーチンで共有したい値をまとめたものです。ですから名前は udata
2 プログラムリストの詳説
22
で無くても構いません。お好きなようにどうぞ。なお、udata の中の変数は以下のような
意味を持っています。
pbeam(実数):入射粒子の運動量です。単位は GeV/c です。
itype(整数):入射粒子の型です。入れるべき整数は i ki neに準拠しています。
esum(
実数): Calorimeter 中での
用意された変数です。
Ener gy Deposi t
を
t r acki ng
の際に取得するために
call ginit
commo nblock をデフォルト の値に設定するサブルーチン
には様々な common bl ock が出てきます。それらの common block の値をデ
フォルト 値にしてくれるサブルーチンです。デフォルト値が何か?についてはマニュアル
を参照して頂くのがよいです。Data Records というところにのっています。しかしまあ
今はこう書いておいて下さい。書かなければ走りませんので。
GEANT
pbeam=10.0
入射粒子の運動量を 10 GeV/c にする
itype=8
入射粒子の型を + にする。
ただ単に値を代入しているだけです。
call key
call k ey
('m
om
e' ,pb eam
, 1, ' r eal ' )
(' t
yp e' , iyp
t e, 1, ' itn
e' )
data c a rdを取り込むのサブ ルーチン
gi ni tで設定されたデフォルト値を us er が用意した値に変更するため、GEANT で
は data card というものを使います。詳しくは第 3.1節で述べますが、ここでは key の
上の
2.5
初期化のためのサブルーチン
23
使い方を示しておきます。key は FFREAD packa ge と呼ばれ、da ta c a rd に記され
た値を取得する働きがあります。で、その記述方法は以下の通りです。
c a llke y('keys',var,nvar,'t yp e')
ke ys:4文字のキーワード です。4文字以上はどんなに長いキーワード を付けたとし
ても認識されません。GEANT で指定されているもの (マニュアルの Da t aRe c or d
を参照) はそれに準拠したキーワード でなければなりません。ここでは mo me は運
動量を示すキーワード、type は入射粒子の型を示すキーワード です。
va r:キーワード に対応した変数名です。ここでは mo me というキーワード に対応し
て pbe a mという変数名が、また type というキーワード に対応して itype という
変数名が与えられています。なおここの変数は配列でも構いません。ただしその際に
は、例えば 10 個の配列 i s wi t (10)
は i s wi t ( 1と書かずに
0)
i s wi とだけ書いておい
t
て下さい。
nva r:var
に入る変数の数です。例えば上の i s wi だったら
t
10 個の変数が存在するこ
とになりますので 10 です。pbe a m,i y
t pe はもちろん1個です。
type:変数の型です。実数の場合 r e a、整数の場合
l
i nt e、両方が混ざっている場合
mi xe dと書いておいて下さい。
call ggo
key で取得した値を解釈するサブ ルーチン
ke y で取り込まれた値を「使われ方」によって選別するサブルーチンです。「使われ方」
については、これもマニュアルの Da t aRe c o r dのところを参照して頂くのがよいのです
が、例えば、粒子を何回打ち込むかとか、ここから下のエネルギーは無視するとか (Energy
E
A
N
T
Cut) 、粒子の座標を表示させるとかそういう別々の使われ方をする値を解釈して G
に渡し、g i ni で設定されたデフォルト
t
値を ke y で取り込んだ値と入れ換える働きがあ
ります。まあ、これも書いておくだけで結構です。ただ
babababababababababababababababababababab
ggo を gini tの前に書いてはならない!
24
2 プログラムリストの詳説
ということはよく覚えておいて下さい。
call gzinit
ZEBRA のメモリに割当をつけるサブ ルーチン
ZEBRA で管理されているメモリをいろいろな部分にわけます。例えばシミュレーショ
ンを行う部分だとか、データを格納する部分などにです。まあ、これも書いておいて下さ
い。書かなければ走りません。ところで
babababababababababababababababababababab
gzinit を ggo
の前に書いてはならない!
という規制がこの gzinit にもあります。気を付けましょう。
call gpart
粒子の性質を決める値を管理するサブ ルーチン
例えば + を入射させる場合は 8 と指定するだけで GEANT は+ であると判断します
が、その + の質量、電荷、寿命などはこの gpart によって値が導き出されます。どんな
値になっているかはマニュアルの gpart のところを参照して下さい。
call gmate
検出器に使われる物質の性質を決める値を管理するサブルー
チン
上の gpart の場合と同じく、検出器に使われる物質の原子量、原子番号、密度、放射長
などの値はこの gmate によって導き出されます。どんな値になっているかはマニュアル
2.5
初期化のためのサブルーチン
25
の gmate のところを参照して下さい。
call ugeom
検出器の物質・形状・配置を決めるサブ ルーチン
でもっとも大切なサブルーチンの一つです。自分のやりたいシミュレーション
に使う検出器に使われる物質、大きさ、配置をこのサブルーチンで全部指定します。ug で
始まるサブルーチンなので user が書かなければならないのですが、
GEANT
babababababababababababababababababababab
エラーは ugeom
で多発します!
!
シミュレーションがうまくいかない場合はまずここから疑ってよいほどです。まあ、ugeom
につきましては 2.5. 2節でその詳しい内容を説明しますので、ここでは ugeom を ugini t
のどこに置かなければならないか、を覚えておいて下さい。
call gph ysi
断面積とエネルギー損失を計算しデータへ貯める
入射粒子と検出器の相互作用の計算を引き受けるサブルーチンです。結果はデータとし
てメモリに蓄えられます。
call uhinit
HBOOK のヒストグラムの初期化をするサブ ルーチン
のヒストグラムの準備をするサブルーチンです。ヒストグラムのタイトル、横
軸の最小値・最大値、横軸を何個の bin に分けるかなどを決めます。uh で始まるサブルー
チンですがこれも us er が書かなければなりません。詳しい内容につきましては 2 . 5 .節で
3
HBOOK
26
2 プログラムリストの詳説
説明します。
以上が uginit の説明です。ほとんど真似をして書いておけばよいことばかりですが、サ
ブルーチンの順番は重要ですので注意して下さい。
サブ ルーチン
2.5.2
ugeom
先ほど uginit の説明で出てきた ugeom
ンなので気を付けて見ていきましょう。
の説明します。ここは特に重要なサブ ルーチ
common /gctmed/ numed,natmed(5),isvol,ifield,fieldm,tmaxfd,
stemax,deemax,epsil,stmin,cfield,prec,iupd,
istpar,numold
+
+
common /udata/ pbeam,itype,esum
dimension a(2),z(2),wmat(2),par(3)
data a /132.91,126.9/
data z /55.0,53.0/
data wmat /1.0,1.0/
call gsmixt(21,'CsI',a,z,4.510,-2,wmat)
call gstmed(1,'CsI',21,0,0,0.0,0.0,0.1,0.2,0.01,0.2,0.0,0)
call gstmed(2,'VACUUM',16,0,0,0,0.0,0.1,0.2,0.01,0.2,0.0,0)
call vzero(par,3)
par(1)=5.0
par(2)=5.0
par(3)=15.0
call gsvolu('CALO','BOX ',1,par,3,ivolu)
call vzero(par,3)
par(1)=100.0
par(2)=100.0
par(3)=100.0
call gsvolu('VACU','BOX ',2,par,3,ivolu)
call gspos('CALO',1,'VACU',0.0,0.0,10.0,0,'ONLY')
call gsord('VACU',3)
call ggclos
return
end
2.5
27
初期化のためのサブルーチン
commo n/gc tmed
/numed,etc.. .
検出器に使われている媒体のための
commo nblock
ここで GEANT で使われる material(物
質) と me di um(媒体) のニュアンスの違いに
ついて説明しておきます。右の図2を見て
下さい。図2で Si と CsI からできているむ
ちゃくちゃな検出器が描かれていますが、例
えばこういう言い方をするのです。
Si
CsI
1
図
2: material
2
と
medi um
シリコンという物質で1の部分の検出器の媒体とする。ヨウ化セシウム
という物質で2の部分の検出器の媒体とする。
なんか変な感じですが、ある「物質」を検出器に組み入れたときに「媒体」と呼ぶようで
す。少なくとも私はそう理解しました。この「物質」と「媒体」は始めの内は混同し易い
のでまあ、こんな見分け方をしていると思って下さい。
それでもってこの gctmed は「媒体」のための変数を用意する common block なので
す。中身については今はあまり気にしなくてよいです。ただ numed につきましては「媒
体の番号」を示しています。図2の例でいけば Si が1番で Cs I が2番です。
dime nsi on
a( 2) , z( 2) , wmat ( 2) , par ( 3)
配列の定義
配列を定義しているだけです。ちなみに a(2) は原子量、z(2) は原子番号、wmat(2) は
化合物での原子の配合の割合 (例えば Cs I は1分子にセシウム1:ヨウ素1の割合、H2O
ならば1分子に水素2:酸素1といった具合)、par(3) はこの場合検出器の媒体の x; y; z
軸方向の長さを示しています。これらの値はこのサブルーチン ugeom 内でのみ有効です。
2 プログラムリストの詳説
28
data a
dat a z
dat a wmat
/132.91,126. 9/
/55. 0, 53. 0/
/1. 0, 1. 0/
データの代入
上で示した a(2),z(2), wmat(2) に値を代入しているところです。132. 91 はセシウムの
原子量、126. 9 はヨウ素の原子量、55. 0 はセシウムの原子番号、53. 0 はヨウ素の原子番号
です。wm
at の /1. 0, 1. 0/はセシウムとヨウ素が1:1の割合で分子を作っているという
ことです。
call gsmixt
(21, etc. . . )
化合物を定義するサブ ルーチン
検出器に使われている物質を定義するサブ ルーチンなのですが、その物質がもし単体で
できているならば、gsm
ate というサブルーチンを通して定義されるのですが、化合物か
ixt を使用します。今回のシミュレーションでは CsI を使い
らできているならばこの gsm
ますので、このサブルーチンで定義されます。書式は以下の通りです。
call gsm
i xt
( imat e, 'nam
at e' , a, z, dens , nlm
at , wm
at )
i mate( 整数):物質の番号です。1 番から 16 番までは GEANT が使っていますので (
gm
ate 参照) 、それ以降の番号を付けるとよいでしょう。ここでは Cs I に 21 番を与
えています。
namate( 文字列):物質の名前です。20 文字まで許されています。まあ無難に
いっています。
Cs I
で
a( 実数の配列):原子量です。
z( 実数の配列):原子番号です。
dens( 実数):物質の密度です。理科年表などで調べて下さい。
nl mat( 整数): nl mat < 0 ならばその物質は原子の数に従って化合物の構成の割合が
決まります。nl mat > 0 ならばその物質は個々の原子の質量によって化合物の構成の
2.5
29
初期化のためのサブルーチン
割合が決まります。例えば CsI は数に従う場合は1:1、質量に従う場合は 132.91:
126. 9 の割合で CsI が構成されることになります。よって今の場合数に従うので適当
に 2 という0より小さい値を設定しています。
0
wmat(実数):構成の割合です。
call gstmed(1,'CsI ' , etc. . . )
call gstm
ed (2, ' VACUUM' , etc. . . )
検出器に使う媒体の定義をするサブ ルーチン
検出器に使う媒体の定義をするサブルーチンです。gsmixt を通して定義された「物質」
を使って、ここで検出器の「媒体」としてさらに定義します。書式は以下の通りです。
ca ll
g s t med
(itmed,natmed,nmat,isv
ol,ield,eldm,tmaxfd,stemax,deemax,
epsil,stmin,ubuf,nwbuf )
このうち今回使うものについて説明します。というのは、今回のシミュレーションでは磁
場をかけていません。そのため磁場に関係のある変数はすべて0にしてあります。磁場を
かけるシミュレーションをする場合にはマニュアルとにらめっこして下さい。
i t me整数
d ( ):媒体の番号です。物質の番号と混同しないで下さい。ここでは
CsI を
1番、真空を2番にしてあります。なぜいきなり真空が出てきたのかはのちほど説明
します。
na t me 文字列
d ( ):媒体の名前です。20 文字まで許されています。物質の名前と同じ
にしなければいけないことはありません。
n ma t整数
( ):物質の番号です。g s mi の
x ti ma tと一致させる必要があります。つま
e
りここで i ma t番の物質を使って
e
i t me番の媒体を作る、という作業が行われるの
d
です。ちなみに 21 番は先ほど g s mi で
x tCsI に与えた番号ですが、16 番は g ma t e
で GEANT によって与えられた真空のための番号です。
あとの変数については著者もよく理解していません。学食の帝王氏も「真似をした」とあっ
さり白状しています。そこで本書では申し訳ありませんがこのまま先に進ませてもらいま
2 プログラムリストの詳説
30
す。詳しくはマニュアルを見て下さい。
call vzero
(par,3)
par(3) の値を全部0にする。
そもそも変数というのは使い始める前に何らかの初期値に設定しておくのが普通だ
というのはご存知でしょうが 、例えば par ( 100) の中身を全部0にするのにいちいち
par ( 1) =0, par ( 2) =
0, .. . , par ( 100) =
などと書いていては面倒くさいので、この
0
vzero とい
うサブルーチンを使って一行で 100 個の配列なら 100 個の中身を全部0にしてしまうとい
う便利なものです。
par(1)=5.0
par(2)=
5.0
par(3)=
15.0
にそれぞれ値を代入しているだけです。図1を思い出して下さい。
Calor imeter の大きさを x; y; z についてそれぞれ 10cm
10cm
30cm にしていました。
これがその値です。GEANT では直方体の検出器の大きさをそれぞれの軸についての半
分の長さで指定するようになっています。だから値がそれぞれ半分になっているのです。
par ( 1) , par ( 2) , par ( 3)
2
2
call gsvolu
検出器の名前・大きさ・形・媒体名を定義するサブ ルーチン
さてこれまで定義されてきた媒体に大きさと形を与えるサブルーチンです。媒体は大き
さと形を与えられて「体積 ( vol ume) 」と呼ばれるようになります。書式は以下の通りです。
call gsvolu ( 'chname' , ' chshap' , nmed, par , npar , iol
v u)
chname( 文字列):体積の名前です。注意してもらいたいのは必ず4文字にして下さ
い。4文字より多いのはもちろんのこと、4文字より少ない場合も GEANT が走ら
ない原因となります!さらに「体積」の名前は1つ1つ変えて下さい。同じ名前の体
積が存在するとエラーになります。
2.5
初期化のためのサブルーチン
31
chshap(文字列):検出器の形の名前です。GEANT で指定されているものを使って
下さい!user が勝手に名前を付けてはいけません。名前と形はマニュアルの GEOM
のページに載っています。そしてこれも必ず4文字にして下さい!4文字より多くて
も少なくてもエラーの原因となります。
nmed(整数):この「体積」に使われている「媒体」の番号です。gs tme d で付けた
it me d に一致させて下さい。
par(実数の配列):体積の大きさです。x; y; z 軸方向の長さを指定して下さい。
npar (整数):par の配列の数と思って下さい。'BOX ' という形の検出器は
すみますが、他の形の検出器ではもっと必要なこともあります。
par(3)
で
i volu(整数):よく分かりません。おそらく GEANT が内部で処理する変数だと思わ
れますので、このまま書いておいて下さい。
以上が gs vol uの説明ですが、学食の帝王氏はこのサブルーチンで痛い目に遭っています
のでそれをでかでかと記しておきます。
babababababababababababababababababababab
にしていたせい
で GEANT が走らなかった!正しく
は ' BOX ' である。
chshap
を
'BOX'
これに気づかなくて彼は貴重な時間を無駄に過ごしてしまったのです。くわばらくわば
ら・
・
・
・
・
・。読者のみなさんはそんなミスをなさならいようくれぐ れもご注意下さい。
c a ll vzero(par,3)
pa r (1)=1 00 .0
pa r ( 2) =1 0 0 . 0
pa r ( 3) =1 0 0 . 0
c a l lgs vo l u
('VACU','B
O X ',etc...)
真空に対して
200cm
2
200cm
C
sI
2
と同じことを繰り返しています。余裕をもって CsI を包み込めるよう
200cm
の大きさをもたせてあります。こうして真空という仮想的な「検
2 プログラムリストの詳説
32
Calolimeter
出器」中に
call gspos
を置くという状況を作り出しています。
('chname',etc...)
検出器の配置を決めるサブ ルーチン
さて、媒体も決まり、形も大きさも決まったらあとは空間座標中のどこにその体積を配
置するかです。ここで GEANT で使われる座標系について説明しておきます。
G
E
A
N
T
は
(MA
RS)
という座標系に全てのデータを格納
します。打ち込む粒子の位置や検出器の位置もです。
ところが検出器が複雑な構造をしている場合、例えば検出器の中にさらに検出器がある、
などという場合 user はそれらの相対的な位置関係のみをサブルーチンの中に記していけ
ば、あとは G
E
A
N
T
がその相対的位置を理解して座標変換をしてくれる、というシステ
ムがあるのです。それが
(M
R
S)
と
です。
(DR
S)
今回のシミュレーションではこの
に真空を当てています。そして
は
です。
MAster Reference System
Mother
System
Reference
System
Daugh ter Reference
Mother
CsI
y
Daugh ter
y
y
y’
y’
y"
z
0
z’
0
z
z
z " z’
0
x"
x’
x
x’
x
MARS
x
MARS
図
MARS
3:
MRS
MARS
MRS
DRS
M
A
R
S,M
R
S,D
R
S
MARS
Mother
まず
があります。この
の中にまず
(M
R
S)
を置きます。たい
ていの場合
の原点と
の原点を一致させておきます。つまり
上の座
標と
上の座標は同じ点を示すことになります。この
の中にさらに
を置きます。この場合
の原点と
の原点は一致するとは限りません。今回のシ
ミュレーションでは
の原点と
の原点は z 軸の方向に 10cm だけずらすことに
します。すると下のようになるでしょう。以上のようなことを頭に入れて
の書式を
見ていくことにします。
MRS
MARS
MRS
MRS
MRS
DRS
DRS
MRS
MARS
Daugh ter
gsp os
2.5
初期化のためのサブルーチン
33
call gspos('chname' ,nr, ' hm
c oth' , x, y, z, ir ot , honly'
'c
)
chname( 文字列):今考えている体積 (Daugh ter ) の名前です。gsv olu の chnam
e
一致させて下さい。もちろんこれも必ず4文字です。
と
nr( 整数):体積を何回コピーするかという回数です。あんまりよく使い方が分かって
いません。今は1回で間違いないはずです。
chm
oth(
文字列):今考えている体積 (D
augh ter ) がどの Mother の体積の中にある
か、ということを指定する文字列です。今の場合真空の中に CsI を置いていますの
で、M
other
は真空、つまり真空の方の gsv olu の chnam
e
、VACU が入ることに
なります。
x(実数):今考えている体積 (D
augh ter ) を M
other
の中のどこに置くか x 軸上での
A
RS
と M
R
S
は同じ座標系ですので、この x 座標は
値をいれます。今の場合 M
M
R
S
での値と思って頂いて結構です。
y(実数):同様に y 軸上での値です。
z(実数):同様に z 軸上での値です。
irot( 整数): GEANT には回転行列 ( Rot at i onMat r i x)というものがあります。それの
番号なのですが、今は使わないので0です。
chonly( 文字列):「 ONL Y 」か「 MANY 」かどちらかが入ります。
「 ONL Y」の場合、
今考えている体積 (D
augh ter ) が他の体積 (M
other
を除く) と重なっていないこと
を示しています。詳しい使い方はよく分かっていません。
このサブルーチンでめでたく検出器の配置が終了するわけです。が、ひとつ気になること
U に対する gsp os はいらないのか?と。それに対する答は
があるでしょう。そう、VAC
2 プログラムリストの詳説
34
gspos
もし
を書かなかったら
点に勝手に配置する
GEANT はその体積を MARS
での原
のです。ですから今の場合真空を MARS での原点に置いているので心配ないわけです。
call gsord
仮想的な境界を決めるサブ ルーチン
実はこれもよく意味が分かっていません。多分の話をしますと、シミュレーションをど
こまですればよいかという限界を決めるサブルーチンだと思われます。つまり、今の場合
z 軸方向に粒子を打ち込んでいるわけですが、実際シミュレーションをやってほしいのは
検出器の部分だけで、その検出器を通り抜けたその先の話には興味がないわけです。そう
いうどこまでをシミュレーションの対象とするかを決めるサブルーチンだと・
・
・
・
・
・。いえ、
余計なことは言わないようにしましょう。他力本願、読者がマニュアルを読まれて理解さ
れることを期待します。
でもまあ一応書式をば少々。
call gsord('chname',icord)
chname( 文字列):境界を決めたい体積の名前です。
icord( 整数):境界をどの軸の向きに向けて捜すかを指定する数字です。1は x 軸方
向、2は y 軸方向、3は z 軸方向などとなっています。詳しくはマニュアルを。
cal l ggcl os
検出器の配置を終了するサブ ルーチン
これで検出器の配置が終了しました、おめでとうございます、というサブルーチンです。
あとはこのサブルーチンが GEANT に検出器のあらゆる情報を与えてくれます。まあ、書
いておいて下さい。
以上が ugeom の説明です。多少解説不足のところもありますが、本書ではこのくらい
知っていればよいはずです。重ねて申し上げますが、エラーの多発するサブルーチンです。
2.5
初期化のためのサブルーチン
35
念には念を入れて記述しましょう。単純なタイプミスだけでも GEANT はすぐ にだだをこ
ねます。
それから、もし次に新たなシミュレーションをする際に一番書き換えなければならない
のもこのサブルーチンです。そういうわけでこの ugeom はマニュアルをよく読んでほし
いところでもあります。
2.5.3
サブ ルーチン uhinit
さきほど uginit の説明で出てきた uhinit
見てみましょう。
の中身を説明します。90 行から 97 行までを
subroutine uhinit
common /udata/ pbeam,itype,esum
call hbook1(10,'Energy-Deposit in CsI',100,0.0,2.0*pbeam,0.0)
return
end
call hbook1
(10,etc.. . )
1 次元のヒストグラムを用意するサブ ルーチン
さて前々から出てくる HBOO
K の準備をするサブ ルーチンです。このシミュレーショ
ンでは、例えば 1GeV のエネルギーを失った粒子は何個あるか、5GeV のエネルギーを失っ
た粒子は何個あるか・
・
・
・
・
・、といった統計を見るわけですから、エネルギーと個数の関係
を見るヒストグラムが必要になります。
「縦軸は個数・横軸はエネルギー」という1次元ヒ
ストグラムが必要になるわけです。それを H
B
O
O
K
というサブルーチン集の助けを借り
てヒストグラムを出力することになるわけです。
このサブルーチンではどんなヒストグラムにするか (タイトル、横軸の範囲など) を予め
決めておきます。それでは書式を。
call hbook1 ( id, 't i t le' , bi n, mi n, max,
ei gh
wt )
id(整数):ヒストグラムの番号です。整数なら何でもどうぞ。ちなみに今回は1つの
ヒストグラムしか用意しませんが、たくさん用意するときにはこの番号がだぶらない
ように。
title( 文字列):ヒストグラムのタイトルです。お好きなように。字数の制限は忘れま
した。
36
2 プログラムリストの詳説
bin(自然数):横軸を何個の区間に分けるかということです。例えば 10GeV を 100 個
の区間で区切ると、0.1GeV ごとの統計を見ることになります。ま、100 個くらいが
見やすいのでは?
min( 実数):横軸の最小値です。自分の見たい統計が最低でどのくらいになるかを見
積もってこの値を決めましょう。今の場合 10GeV の粒子を打ち込むわけですから、
0G
eV より小さい粒子を見てもしようがないでしょう。
m
ax( 実数):横軸の最大値です。これはどうなるか予想をするのは難しいです。まあ
10G
eV より大きくなることはないという予想はつきますが、果たしてどのくらいの
値の粒子が多いのか・
・
・
・
・
・
?始めは 10GeV でやって見るとよいですが、出力されたヒ
ストグラムがあまりにも見にくいことに気がつくでしょう。ここはひとつ 1GeV に
しておいた方がお得ですよ、読者の方。
以上が uhinit の説明です。そして uginit 、ugeom とあわせて GEANT の初期化の局面
が終了しました。これからいよいよ実際に粒子を入射させる局面へと移っていくわけです。
もうこれからがダイナミックな局面です。
2.5
37
初期化のためのサブルーチン
練習問題
1.
高エネルギー物理学研究所の次期プロジェクト「 B-Factry 」。今度はルミノシティが
高いため従来3つあった検出器を1つだけしか残さない計画である。では、その検出
器の名前は?
(a) SUZU
( b) KANE
( c) BELLE
2.
建設がようやく決定した CERN の LHC( Lar ge Hadr on Coll ider )。陽子と反陽子を加
速させて衝突させるリングのことだが、重心系で陽子・反陽子合わせてどのくらいの
エネルギーを持つ予定であるか?
38
2 プログラムリストの詳説
シミュレーション過程
2.6
GEANT の3つの局面のうちの実行を司るサブルーチンについて見ていきます。
サブ ルーチン
2.6.1
Main Program 中の
gukine
grun
の説明で出てきた
gukine
の中身を説明します。
ところで grun がプ ログラム中のどこにも見当たらない!と思っているかもしれません
が、grun は GE ANT によって自動的に呼ばれます。で、その grun がさらに gukine を
を書き始めて構わないわけです。で、この
呼びに来るのです。ですからいきなり gukine
gukine
では
打ち込む粒子を「どの位置から、どれだけの運動量をもって、どの方向
に打ち込むか」
という入射粒子の初期状態を決めます。それでは 99 行から 13 6行までを見てみましょう。
subroutine gukine
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /gckine/ ikine,pkine(10),itra,istak,ivert,ipart,itrtyp,
napart(5),amass,charge,tlife,vert(3),pvert(4),ipaold
+
common /udata/ pbeam,itype,esum
dimension vert(3),plab(3)
esum=0.0
call vzero(vert,3)
vert(1)=0.0
vert(2)=0.0
vert(3)=-6.0
call gsvert(vert,0,0,0,0,nv)
call vzero(plab,3)
plab(1)=0.0
plab(2)=0.0
plab(3)=pkine(2)
call gskine(plab,ikine,nv,0,0,nt)
return
end
2.6
シミュレーション過程
39
dimension vert(3),plab(3)
配列の定義
配列を定義しています。ちなみに vect(3) は粒子を打ち込む位置、plab(3) は粒子の持っ
ている運動量です。
esum
=0.0
esum
を 0.0 に初期化
esum 、つまり
Energy Deposit
call vzero(v
vert(1)=
0.0
vert(2)=
0.0
vert(3)=
-10.0
を初期化しています。
ert,3)
入射粒子の発生点を代入
0
call gsv ert
y
+
π
CsI
10cm
10cm
まず cal l vzero で vect(3) の値を全て0に初
期化したあと、粒子をどの位置から打ち込むかを
MRS 上の座標で指定します。今の場合 x 座標
0.0 、y 座標 0. 0、z 座標
10:0 にしてあります。
yz 平面でみると右のような図になっています。
30cm
入射粒子の発生点をデータに格納するサブ ルーチン
入射粒子を座標上のどの位置からうちこむかを vect(3) の値に従って GEANT に送り、
座標のデータとし蓄えられます。書式は以下の通りです。
z
2 プログラムリストの詳説
40
call gsvert(vect,ntbeam, nttarg, ubuf, n ubuf , n vtx)
vect( 実数の配列):入射粒子の頂点の座標です。
実は、あとの変数の使い方がいまいちよく分かりません。というか今回は使いません。最
後の nvtx は GEANT が内部的に処理する変数のようですので、これは書いておかなけれ
ばなりませんが。
call vzero(plab,3)
plab(1)=0.0
plab(2)=
0.0
plab(3)=
pkine(1)
入射粒子の最初の運動量を代入
まず call vzero で plab(3) の値を全て0に初期化したあと粒子を打ち込む一番最初の時
点での運動量を x; y; z 方向について代入しています。言うまでもありませんが plab(1) は
x 方向、p
lab(2) は y 方向、plab(3)
は z 方向です。beam は z 方向を向いていますので
z 方向のみ p
kine(1)
にしてあります。お忘れかも知れませんが pkine(1)
は uginit (2.5. 1
節参照) 内で pb eam 、つまり 10GeV/c の値を代入済みです。
call gskine
入射粒子の運動量をデータに格納するサブ ルーチン
plab(3)
で決まった入射粒子の運動量の初期値をそれぞれ
に送り、データとして蓄えます。書式は以下の通りです。
call gskine
x
; y; z
方向について
GEANT
(plab, iki ne, n v, ubuf , n ubuf , n t)
plab( 実数の配列):入射粒子の運動量です。
ikine( 整数):入射粒子の型です。お忘れかも知れませんが uginit
ikine に itype が代入されています。ですから今は8です。
(2. 5. 1節参照)
で
2.6
41
シミュレーション過程
実はこれもあとの変数の使い方がよく分かりません。というか使いません。ただ、nv と
nt は GEANT が使うようなので書いておきましょう。
以上まことにあっさりしていますが、gukine の説明を終わります。とにかく入射粒子の
最初の位置と運動量を GE ANT に送るのが仕事と思っていただければ結構です。
サブ ルーチン
2.6. 2
gut re v
guki neのあとに呼ばれるサブルーチン gut r e vについて説明します。ここでは guki ne
で初期設定の終わった粒子を実際に打ち込みます。1個の粒子についてずっと面倒を見続
けるのがこの gut r e vです。まだもう少し先まで説明しないとよくわからないでしょうが。
それでは 1 38行から 1 4 5行までを見てみましょう。
subroutine gutrev
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
call gtreve
return
end
call gtreve
入射粒子を tracking するサブ ルーチン
なんと gut r e vに書いてあるのはこのサブルーチンだけです。役目は入射粒子を実際に打
ち込んで見ることですが、この gt r e v
e は一つ高い視点 ( イベントレベル) からシミュレー
ションを見守っています。というのは、gut r e vの下に gut r akというサブルーチンがまだ
控えているからです。実際に粒子の面倒を見るのは gut r a kの方であるといえます。それ
を次に説明します。ですから今はこれだけで gut r e vの説明を終わります。
2. 6. 3
サブ ルーチン
gut r a k
gut r e vのあとに呼ばれるサブルーチン gut r a kについて説明します。が、不審に思って
いるのではないでしょうか?gut r e vには gut r a kを呼ぶような命令は書いてなかったは
ず、と。これは GE ANT の gr un がすべて面倒を見ているせいです。gut r e vも gut r a k
も必要なときに自動的に呼ばれます。
さて gut r a kでは guki ne gut r e vと流れてきて打ち込まれた粒子に付いて、検出器
との相互作用を細かく調べます。
!
2 プログラムリストの詳説
42
先に tracking という過程を申し上げましたが、まず真空から CsI 中へ飛び込み、Cs Iか
らまた真空中へ抜けていくという過程を細かく区切って、その都度、検出器との相互作用
を調べるのです。それが gutrak です。
そして真空
Cs I
真空と通り抜けてやっと1イベント 終わるわけですが、そこで
gut r ev が登場し、t r akci n g
が全て終了していることを見届けると、また gukine に粒子
の初期値をもらいに行き、そして gut r ak に渡して細かく相互作用を調べる・・・
・・・、と
いうことを例えば 100 0個なら 1 0 0 0回繰り返すのです。高いレベル (イベントレベル) から
t r akci n g
を見ているのが gut r ev で低いレベル (トラックレベル) から t r akci n gを見ている
のが gut r ak であるという意味が分かって頂けたでしょうか。それでは 1 4 7行から 1 52行
までを見てみましょう。
!
!
subroutine gutrak
call gtrack
return
end
call gtrac k
入射粒子を tracking するサブ ルーチン
申し上げました通り低いレベルから粒子を見ているサブルーチンです。
以上で gut r ak の説明を終わりますが、gut r ev も gut r ak も普段は余り気にせずに通
り過ぎてしまうサブルーチンです。GEANT がせっせと自動的にこの2つのサブルーチン
を呼んでいるからですね。いやー、便利なものです。
2.6. 4
サブ ルーチン
guhadr
まだ地味なサブルーチンが続きます。本当はよく働いてくれているのですが、プログラ
ム中ではあまりにも短いので無視されがちです。1 5 4行から 1 5 8行を見てみましょう。
subroutine guhadr
call gheish
return
end
2.6
43
シミュレーション過程
call gheish
Hadronic interaction
を決めるするサブ ルーチン
GEANT はハド ロンのシャワーについての物理的な過程を GHEISHA という package
で行っているそうです。著者もこの辺はさっぱり分からないのですが、この gheish とい
うサブルーチンはその GHE I S HA
を使って Hadronic i nter act i onを決めていくようです。
まあ、書いておいて下さい。実際必ず使われているようです。
2.6. 5
サブ ルーチン
g uph ad
もう一つ地味なサブルーチンを説明しましょう。これも Hadr oni c i nt er act i on関係です。
160 行から 167 行を見てみましょう。
subroutine guphad
call gpghei
return
end
call gpghei
次の
チン
Hadronic
interaction
までの距離を決めるサブルー
これもよく分かりません。GHE I S HA
で断面積を計算して、次の Hadr oni c i nt er act i on
が起こるところまでの距離を決めるサブルーチンらしいです。まあ、これも書いておいて
下さい。必ず使われているようです。
以上が Hadr oni c i nt er act i on関連のサブ ルーチンの説明、というか書き方です。地味で
すが必ず書いておいて下さい。
2 . 6 . サブ
6
ルーチン g u s te p
しばらく地味なサブルーチンが続きましたが、これは派手です。とても大事なサブルー
チンです。この g u s t e
で自分が調べたい値、今の場合
p
E ne rg y
De pos i を取得します。
t
2 プログラムリストの詳説
44
で、ここが ugeom についでエラーの起こり易いサブ ルーチンです。出力したヒストグラ
ムがおかしな結果を与えている場合はまずここから疑いましょう。
この gustep は gt rack によって呼び出されます。tracking の際には必ずこの gus t ep
を通るということです。167 行から 205 行までを見てみましょう。
subroutine gustep
parameter (maxmec=30)
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ieorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /gcking/ kcase,ngkine,gkin(5,100),tofd(100)
common /gckine/ ikine,pkine(10),itra,istak,ivert,ipart,itrtyp,
napart(5),amass,charge,tlife,vert(3),pvert(4),ipaol
+
common /gctmed/ numed,natmed(5),isvol,ifield,fieldm,tmaxfd,
stemax,deemax,epsil,stmin,cfield,prec,iupd,
istpar,numold
+
+
common /gctrak/ vect(7),getot,gekin,vout(7),nmec,lmec(maxmec),
namec(maxmec),nstep,maxnst,destep,destel,safety,
sleng,step,snext,sfield,tofg,gekrat,upwght,ignext,
inwvol,istop,igauto,iekbin,ilosl,imull,ingoto,nldown,
nlevin,nlvsav,istory
+
+
+
+
common /udata/ pbeam,itype,esum
if(numed.eq.1) then
if(destep.gt.0.0) then
esum=esum+destep
end if
end if
if(ngkine.gt.0) then
do i=1,ngkine
call gsking(i)
end do
end if
return
end
commo n/gc trak/
vect (7),et c.. .
tracking のための common block
t r acki ng の際に必要となる変数群を集めた common block
く使うものを説明します。
です。かなりの数ですが、よ
2.6
シミュレーション過程
45
vect(7)(実 数):tracking の 際 の 粒 子 の 位 置 や 運 動 量 を 貯 め て お く 配 列 で
す。vect(1),vect(2), vect(3) はそれぞれ x; y; z 座標を表します。その他について
はマニュアルを参照して下さい。
destep( 実数):エネルギー損失です。今回はこの値を取得することを目的としています。
以上の2つはとりあえず覚えておいて下さい。他のものに付きましてはやはりマニュアル
を参照して頂くのがよいでしょう。
そしてその destep を取得しているアルゴリズムを説明します。190 行から 194 行まで
がそれです。
if(numed.eq.1) then
if(destep.gt.0.0) then
esum=esum+destep
end if
end if
numed.eq. 1 というのは「媒体」の番号が1のとき、ということです。CsI
が1番に割り当てられていますので、CsI の中に粒子がいるときという意味に
なります。
destep. gt. 0. 0 というのはエネルギー損失 destep が0より大きいときは、
という意味です。マイナスになることがあるのかどうか確認したことはありま
せんが、エラーを防ぐ 意味でも必要です。
は trac king の度に esum の値に destep の値を加
えていくという意味です。こうして粒子が媒体中を通り抜けていく間に失った
エネルギーを取得することができます。
esum
=esum
+destep
以上のようにしてエネルギー損失を取得し、のちに出てくる guout で HBOOK にその
値を渡してヒストグラムとして出力するのです。
今回は Energy Dep osit しか見ていませんが、他の値を取得する場合もたいていこの
gustep 内で行います。
call gsking
発生した2次粒子によるデータを貯める
入射した粒子によって検出器内で2次粒子が発生したときに、その2次粒子と検出器の
相互作用を調べながら2次粒子を trac king していき、そのデータを GEANT に送って蓄
える働きをするサブルーチンです。
2 プログラムリストの詳説
46
という変数は発生した2次粒子の数で、その数だけ gski ngを働かせるように書
かれています。もし、2次粒子によってどんなことが起こっているのか知りたければこの
gs ki ngを使って調べることができます。
ngkine
以上が gus te p の説明です。ここはシミュレーションの結果を取得する場面ですので、
よくアルゴリズムを見当して、
本当に自分の調べたい値が取得できているかをよく確認することが大事
です。
サブ ルーチン
2.6. 7
gudi gi
これも地味なサブルーチンです。で、今回はこのサブルーチンのお世話にはなりません。
このサブルーチンは検出器の応答を見て、そのデータを GEANT に送る役割をするのです
が、今回は応答は見ていませんので詳しい説明はしません。プログラムを見ればお分かり
の通り中身もありませんし。でも、まあ書いておいて下さい。というのは、なぜか使われ
ているのです。その理由は調べていませんが。くわしくはマニュアルの HITS のところを
どうぞ。
2. 6. 8
サブ ルーチン
guout
シミュレーション過程もいよいよ終わりです。tracking が終わったことを gut re vが確認
すると、guki neに行く前に今度はこの guout を呼んで gus t e pで取得した値を HBOOK
に渡します。それでは 210 行から 217 行までを見てみましょう。
subroutine guout
common /udata/ pbeam,itype,esum
call hf1(10,esum,1.0)
return
end
call hf1
(10,esum, 1.0)
1次元ヒストグラムに値を入れていく
の登場です。gus t e pで得られたエネルギー損失
り込みます。書式は以下の通りです。
HBOOK
e s um をヒストグラムに取
2.6
47
シミュレーション過程
call hf1(id,var,weight)
id(整数):ヒストグラムの番号です。hbook1 (2.5.3 節参照) で決めた id と合わせて下
さい。
var( 整数・実数):ヒストグラムにしたい変数を書いて下さい。今はもちろん esum で
す。これが横軸になります。
weigh t(実数):統計的な重みです。著者もよく意味を理解していません。こういうの
は GEANT のマニュアルでなく HBOO
K のマニュアルでもなく、確率・統計の本を
読みましょう。今の場合は統計的な重みはどの粒子についても一様に 1.0 です。
以上で guout の説明は終わりです。そしてシミュレーション過程も終了ということです。
もう一度おさらいをしておくと大まかには
gukine
trac king
!
終了
gutrev
!
!
gutrak
!
gutrak
111
この間
trac king
111
gutrak
!
guout
で1イベントが終了するわけです。そしてまた gukine で新たな粒子を入射させてシミュ
レーションをする・
・
・
・
・
・ということを繰り返すわけです。この1連の作業を G
EA
N
T
がおそ
るべき早さでこなしてくれるのです。便利な世の中になったものですねぇ。書式さえ間違っ
ていなければ文句一ついうことなくシミュレーションをしてくれるのですから、G
EA
N
T
があまりにだだをこねるからといってむやみにとがめるわけにもいきませんね。
2 プログラムリストの詳説
48
練習問題
1.
高エネルギー物理学研究所にある衝突リング
た場合の運転費用はおよそどのくらいか?
TRISTAN。一日 24
時間フル稼働させ
2 . 1 99 8年に立ち上がる B-Factory 。1 9 9 4
年度に認められた予算はいくらか?
2.7
終わり処理のためのサブルーチン
49
終わり処理のためのサブルーチン
2.7
メインプログラムの説明で出てきた 3 つの局面のうち、最後の1つ終わり処理をするサ
ブルーチンについて見てみましょう。
サブ ルーチン
2.7.1
uglast
このサブルーチンではヒストグラムを画面とファイルの両方に出力することと、シミュ
レーションで得られたいろいろな値を画面に表示することが行われます。それでは 219 行
から 232 行までを見てみましょう。
subroutine uglast
common /gcflag/ idebug,idemin,idemax,itest,idrun,idevt,ideorun,
ieotri,ievent,iswit(10),ifinit(20),nevent,nrndm(2)
+
common /udata/ pbeam,itype,esum
call histdo
call hrput(0,'exam.hst','n')
call glast
return
end
call histdo
ヒストグラムを画面に出力するサブ ルーチン
で値を入れられたヒストグラムを画面に出力するサブルーチンです。が、ご承知の
通り FORTRAN にはグラフィックスの関数は用意されていません。そこで HBOO
K は
文字を画面に並べることでヒストグラムを出力しています。涙ぐ ましい努力です。GEANT
を走らせてみれば分かりますが確かに最後に'I' という文字でヒストグラムの形が出てきま
す。しかし・
・
・
・
・
・見にくいのです。グラフィックスの発達した現在ではこのような大技を使
わなくてすむようになりました。それはあとで紹介する PAW というグラフ描画 tool で
hf1
2 プログラムリストの詳説
50
す。ですが、この
histdo は書いておいて下さい。
call hrput
(0,'exam.hst' , ' n' )
ヒストグラムをファイルに出力するサブ ルーチン
先ほど PAW の話をしましたが HBOOK で作成したヒストグラムを PAW に渡すた
めのファイルを作らなければなりません。それがこの h rput です。最初の0の意味がいま
だに分かっていません。exam.h s tはファイルの名前です。お好きなようにどうぞ。n は
n e wle のことです。こうして作られた e x a m. hは
s tPAW の上で綺麗に処理されて出
力されます。
call glast
GEANT の終わり処理をするサブ ルーチン
ようやく最後にきました。これで GEANT は終わり!というサブルーチンです。具体的
には画面にシミュレーションの情報を表示しています。あまりよく見たことがないので何
の情報を表示しているのか知りませんが、まあ書いておかないと GEANT はいつまでたっ
ても終われませんので、かわいそうだから書いてあげましょう。
以上で u gl a sの説明を終わるとともに、
t
G
EANT
のプログラム全行の説明もおわりで
す。お疲れさまでした。大部分は真似や分からないサブルーチンばかりで申し訳ないです
が、必要最小限のことはきちんと押さえてあるつもりです。そしてくどいほど丁寧に説明
したつもりです。
さあ、プログラムの打ち込みが終わったら適当なファイル名を付けてセーブしましょう。
思いつかなかったら e x a m.とでもしておいて下さい。そして、これからいよいよコンパ
f
イルと参ります。が、このプログラムをそのまま FORTRAN でコンパイルしても GEANT
は動いてくれません。あと2、3準備がいります。
2.7
51
終わり処理のためのサブルーチン
練習問題
1. top quark
確認の報道で一躍有名になった
内部に収める建物の色は何色か?
2. 1998
3.
年に立ち上がる
対称性の破れの検証
( b)
ズボンの破れの検証
( c)
マスカットサブレの検証
惜しくも計画中止となった
子に座っていたのは誰か?
ワシントン
( b)
クリントン
( c)
掃除のおばさん
の検出器
CDF。その CDF
を
B-Fact or y。その最大の研究目的は何か?
(a)
( a)
Fer mi lab.
SSC 。計画中止を決定したとき、オーバルオフィスの椅
3
52
3
GEANT の走らせ方
GEANT の走らせ方
この節では、プログラムの記述の仕方以外の、GEANT を走らせヒストグラムを出力す
るまでの手順を示してあります。本当に必要な部分しか説明してありませんので、GE ANT
以外で役に立つ内容はあまり含まれていません。
3.1
data card
を作る
さて 2 .5 .節で出てきた
1
data card について説明します。data ca rdはシミュレーション
のコントロールをする値を書いておくファイルです。シミュレーションのコントロールと
いえば、例えば粒子を 1 00 0個打ち込むとか、対消滅を起こさせようとか、無視していいエ
ネルギーはカットしてしまおう・
・
・
・
・
・などといったことです。詳細はマニュアルの Data
Record のところに載っています。
今回は初心者向けのシミュレーションですので、難しいことは抜きにして、
1 .
イベントの回数。何回粒子を入射させるかです。
2 .
入射粒子の運動量。
3.
入射粒子の型。
を data card 内に書いておきましょう。とりあえず
て、その中に以下のように書き込みます。
exam.dat というファイルを用意し
LIST
TRIG 1000
MOME 10.0
TYPE 8
END
LIST:data card の始まりを告げる言葉です。
TRIG
MOME
イベントの回数を示すキーワード。今は
:
にしましょう。
1 0 0 0
入射粒子の運動量を示すキーワード。1 0 GeV/cにしときましょう。
:
TYPE :入射粒子の型を示すキーワード。8 で + です。
キーワード は4文字です。TRIG は GE ANT がもともと持っているコントロールのため
の値です。M
OME,TYPE
は use r があとからつけ加えたコントロールのための値です。
これは 2 2ページの key で取り込まれ、GE ANT で使えるように解釈されます。
ま、とにかく上のように記述した exam. dat をセーブ して下さい。そして、これは
を実行させる際に
あとで説明します。
GE ANT
UNIX
のリダ イレクトの機能をつかって取り込みます。それは
3.2
make
3.2
でコンパイル&リンク
make
53
でコンパイル&リンク
さて、これまでせっせと書いてきたプログラムはそのままセーブしただけでは動かない
ことはご存知でしょう。実行形式のファイルにしなくてはいけないからです。人間には読
めてもコンピュータには読めない、という説明が直感的に分かりやすいでしょうか。
そこで exam.f を FORTRAN コンパイラーを使ってコンパイルするわけですが、この
GEANT の場合 exam. f をコンパイルしただけではまだ動いてくれません。ライブラリーと
いうものをくっつけなくては無くてはならないのです。このくっつける作業をリンクと呼
びます。で、ライブラリーとは FORTRAN で用意されている関数以外の便利な機能を持っ
たサブルーチンや関数を、いろんなプログラムに取り込めるようにしたファイルです。こ
れを exam. f とくっつけて一緒にすることで始めて GEANT が動くようになるのです。
で、このライブラリーはいろんなものがあります。このうち今回のシミュレーションに
必要なのは以下の7つです。
geant315
mathlib
kernl i b
packl i b
grai b
graf X11
X11
なぜこの7つなのかは残念ながら知りません。GEANT を使いこなそうと思えばライブラ
リーのことも知っておかなければなりませんが、いかんせんマニュアルには載っていない
のです。というわけで学食の帝王氏はどうしたかというと、
「真似した。」といってました。
ここはひとつ読者も真似をして下さい。
で、実行形式のファイルの作り方ですが、もし UNIX のコマンド ラインから直接打ち込
むとすれば以下のようにしなければならないでしょう。
okasun(teiou)-1-% frt77 -c exam.f
okasun(teiou)-2-% frt77 -o exam exam.o -l/local/utility/cern
lib/v93c/lib/mathlib -l/local/utility/cernlib/v93c/lib/geant
315 -l/local/utility/cernlib/v93c/lib/kernlib -l/local/utili
ty/cernlib/v93c/lib/packlib -l/local/utility/cernlib/v93c/li
b/graflib -l/local/utility/cernlib/v 93c/lib/grafX11 -l/usr/
local/X11R5/usr/lib/X11
これをコンパイル&リンクする度に打ち込むのははっきりいって面倒くさいです。ミスタ
54
3
GEANT の走らせ方
イプも続出するでしょう。ライブラリーの名前やデ ィレクトリも忘れてしまうかも知れま
せん。
そこで make の登場です。ma ke とは何か?詳しくは ma ke の本を見て頂きたいので
すが、いろんな使い方ができるようです。奥が深いのです。で、その内の一つの機能とし
て、コンパイル&リンクの面倒くささをなくすという機能があるのです。
具体的な使い方を説明しましょう。
まず、Ma ke leという名のファイル名を持ったファイルを用意して下さい。他の名前で
e
は ma ke が動作しませんのでご注意下さい。そしてその Ma ke l に以下のようなことを
書き込んで下さい。
exam:
exam.o
f77 -o exam exam.o
-L/local/utility/cernlib/v93c/lib -lmathlib
-lgeant315 -lkernlib -lpacklib -lgraflib
-lgrafX11 \
-L/usr/local/X11R5/usr/lib -lX11
# compilation
exam.o: exam.f
f77 -c exam.f
e xa m:というのは ma ke によって最終的に生成される実行型ファイルのことです。その
下の f77 -o e x a m
e x a m.o
は先ほど申し上げたリンクを行うときの書式です。実際にコ
マンド ラインから書き込まなければならないことを、Ma ke l の中に書いておくのです。
e
このとき注意して欲しいのは f 7 7
- oe x a m
e x a m.の一文を行の先頭から離しておく必
o
要があるということです。ここでは TAB を使って空けてあります。
y/ ic te rnl i b/ v93c
はライブラリーのあるディレクト
/l i b
リ名
そのあとの - L/lcao l / util
を示しています。そして - l ma t hl
- l i gebt a3n15. . と今度はライブラリーのファイル名を
.
書き連ねていきます。つまり - Lのあとにデ ィレクトリ名を - lのあとにデ ィレクトリ名を
e
記していくのです。これが Ma ke l におけるリンクの書式です。
それから下の方の e x a m. は
o e: x a m.をコンパイルして得られるオブジェクトファイ
f
という
f FORTRAN
ルのことです。リンクの場合と同様 10 文字空けてから f 7 -7 ce x a m.
のコンパイル命令を書いてあります。
e
これで Ma ke l の内容は終わりです。そして実際にコンパイル&リンクをする場合に
は、コマンド ラインから
okasun(teiou)-1-% make
と打ち込むだけでよいのです。先ほどのコンパイル&リンク時の煩わしさやミスタイプか
ら逃れられます。
それでは読者のみなさんも e x a m.
と fMa ke l を同じデ
e
ィレクトリにおいて ma ke と
3.3
GEANT
55
を走らせる
打ち込んで下さい。exam.f と
るはずです。
Makele に間違いが無ければ以下のように画面に出てく
f77 -c exam.f
exam.f:
MAIN:
uginit:
ugeom:
uhinit:
gukine:
gutrev:
gutrak:
guhadr:
guphad:
gustep:
gudigi:
guout:
uglast:
f77 -o newtest newtest.o
-L/local/utility/cernlib/v93c/lib -lmathlib
-lgeant315 -lkernlib -lpacklib -lgraflib
-lgrafX11
-L/usr/local/X11R5/usr/lib -lX11
20 秒も待てばコンパイル&リンクが終わるはずです。そして l s でファイル一覧を見ると確
かに exam ができているはずです。うまくいきましたか?うまくいかない場合は exam. f
とM
ak el e に間違いがあるはずです。タイプ ミスがないか FORTRAN の書式が間違っ
ていないかもう一度確認して下さい。
3.3
GEANT
を走らせる
いよいよ GEANT を走らせるときが来ました。これまでの苦労はすべてここで報われる
のです。
同じデ ィレクトリに exam と exam. dat があることを確認して次のようにコマンド ラ
インから打ち込んで下さい。
okasun(teiou)-1-% exam < exam.dat
無事に走りましたでしょうか。無事に走っていれば以下のような画面が現れるはずです。
************************************************************
*
*
* G E A N T Version 3.1590
DATE/TIME 941116/1525 *
*
*
*
RUN
1
*
*
*
************************************************************
*
*
*
Data structure Date Ti me GVERSN
ZVERSN
*
*
|||
|
{
|
|
|
|
||
*
*
*
3
56
GEANT の走らせ方
*
INIT
941116 1525
3.1590
3.71
*
*
*
*
KINE
941116 1525
3.1590
3.71
*
*
*
*
HITS
941116 1525
3.1590
3.71
*
*
*
*
DIGI
941116 1525
3.1590
3.71
*
*
*
*
Random number seeds:
9876
54321
*
*
||
|
|
|
|
{
*
*
*
*|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-*
*
*
*
Standard TP AR for this run are
*
*
|
|
|
|
|
|
|
|
|
|
*
*
*
* CUTGAM=
1.00 M
eV CUTELE=
1.00 M
eV CUTNEU=
10.00 M
eV *
* CUTHAD=
10.00 M
eV CUTM
UO=
10.00 M
eV
*
* BCUTE = 1.00 M
eV BCUTM
= 1.00 M
eV
*
* DCUTE
= 10.00 TeV DCUTM
= 10.00 TeV PPCUTM
=
10.00 M
eV *
* IPAIR =
1. ICOM
P
=
1. IPHOT =
1. *
* IPFIS =
0. IDRA Y =
0. IANNI
=
1. *
* IBREM =
1. IHADR =
1. IM
UNU
=
1. *
* IDCA Y =
1. ILOSS =
2. IM
ULS
=
1. *
* IRA YL =
0.
*
*
*
*
Sp ecial TP AR for TM
ED
2 VACUUM
*
*
|
|
|
|
|
|
|
|
*
* CUTGAM
=
1.00 M
eV CUTELE=
1.00 M
eV CUTNEU=
10.00 M
eV *
* CUTHAD=
10.00 M
eV CUTM
UO=
10.00 M
eV
*
* BCUTE
= 1.00 M
eV BCUTM
= 1.00 M
eV
*
* DCUTE
= 10.00 TeV DCUTM
= 10.00 TeV PPCUTM
=
10.00 M
eV *
* IPAIR =
0. ICOM
P
=
0. IPHOT =
0. *
* IPFIS =
0. IDRA Y =
0. IANNI
=
0. *
* IBREM =
0. IHADR =
0. IM
UNU
=
0. *
* IDCA Y =
1. ILOSS =
0. IM
ULS
=
0. *
* IRA YL =
0.
*
*
*
*
*
************************************************************
今回のシミュレーションを 1000 個の + についてやってみたところ実行時間は 1 分もあれ
ば十分でした。あまりに長い時間待たされるようであれば、どこかにバグがある可能性が
あります。もう一度 exam.f を見直して下さい。
うまくいった方はもう一度 ls でディレクトリ内のファイル一覧を見て下さい。exam. hs t
というファイルが新たに作られているでしょうか?これがこれから PAW(グラフ描画 tool)
で処理するヒストグラムを記したファイルです。早速 PAW で結果を見てみましょう。
3.4
PAW
でヒストグラムの出力
さて、シミュレーションはうまくいっているでしょうか?とりあえず
てみましょう。コマンド ラインから
okasun(teiou)-1-% paw
と打ち込むだけで以下の画面が現れます。
***************************************************
*
*
*
W E L C O M E
to
P A W
*
*
*
*
Version 2.04/15
14 March 1994
*
*
*
***************************************************
PAW
を立ち上げ
3.4
PAW
でヒストグラムの出力
57
Workstation type (?=HELP) <CR>=1 :
Workstation type を聞かれますが、今はただ単にリターンキーを押して下さい。すると
以下のような PAW のコマンド を受け付ける表示になります。
PAW>
さらに、画面の左上にこれからヒストグラムを描画する真っ白な窓が開いていますね?
HIGZ 01@okasun というタイト ルが付いた窓です。そこで次のような PAW のコマン
ド を次々に打ち込んでいって下さい。
PAW>opt stat
PAW>hist/file 1 exam.hst
PAW>hist/plot 10
最後の hi st/plot 10 を打ち込んだところで左上の窓に次のページのようなヒストグラム
が現れるでしょう。
58
3
図 4: ランダウテール
GEANT の走らせ方
3.4
PAW
でヒストグラムの出力
59
どうでしょうか?0.2GeV のあたりにピークがあり、そのあと急激に減少しながらもだら
だらとした尾をひくヒストグラムが画面に現れましたか?このような画面が現れたなら見
事 GEANT でのシミュレーションは成功です!おめでとうございます。このヒストグラム
の意味するところは、
+ は
CsI
中でほとんどエネルギーを失わずに通り抜けていく
ということです。なおだらだらと尾をひいている部分はランダウテールと呼ばれる部分で
す。これは検出器の本を参照して下さい。
|
以上で「よいこの ぢゃーんと にゅうもん」で説明したい内容は終わりです。前にも述
べましたが、今回のシミュレーションはこれ以上簡単なものはない!と言い切れるほど稚
拙な内容です。ですが、GE ANT に慣れるという初期の目的は達せたはずです。これから
あとは読者自身がやりたいシミュレーションにあわせて GE ANT を細かく変更していくこ
とになります。例えば ugeom を変えて Geometry を変更するだとか、gustep を変えて検
出器の Resolution を見てみる・
・
・
・
・
・などです。
基本的なことは頭に入っているはずなので、臆せず分厚いマニュアルと対峙してくださ
い。読者の健闘を祈ります。
3
60
GEANT の走らせ方
あとがき
疲れました。
こんな長い文章を組版したのは初めてだったので、TEX による出版のよい練習になりま
したが、まさかこんなに長くなろうとは思いもよりませんでした。始めの内は、GEANT
に初めて携わろうとする人が「こういう本が欲しかったんだ!」と思えるような本を目指
して書き始めたのですが、著者自身 GEANT のド 素人であるので肝心なことが分からずじ
まいで、結局あとから読み返してみると「長いだけでなんにも中身のない」文章になって
しまった感が拭えません。
さらに、本来なら Drawing Pa cka g eの立ち上げ方について説明するはずだったのですが、
なまけぐ せのある著者の性格が災いして、この初版はここで打ち切りになってしまいまし
た。だからといって第2版が出る可能性はまったくありません。願わくば、どなたかに書
いて頂けると良いのですが。著者はもう疲れました。
さて、今回の執筆で気がついたことは、普段物理学の参考書などを読んでいて「なんで
もっとわかりやすく書けないんだ!」と思うことがしばしばありますが、書いている方か
らするとだんだん長くなるにつれて詳しく説明するのが面倒くさくなってきて、
「あとは読
者に任せよう」という安易な気持ちが働いてくるということでした。
これは著者自身がもっとも恐れていたことで、
「分かりやすい本を望む側」にたった視点
で本を書くということがどれほど難しいことか思い知らされました。まあ、今後文章を書
き散らかすことがあるでしょうが、ずっと付きまとう課題となるでしょう。
さらに本書の致命的な特徴として、
「厳格」な人が読むと腹が立つ内容になっているとい
うことがあげられます。これにつきましては平にご容赦下さい。著者のさがです。こんな大
切なことを説明する本の中に低レベルなギャグを並べるという前代未聞の編集ですが、肩
の力を抜いて欲しいという著者のささやかな配慮であると受け取って頂ければ幸いです。
さて、最後にひとつ大切なことを。本文中のいろいろなサブルーチンの説明は著者の解
釈によるものです。従って間違った解釈をしている箇所が多数見受けられると思います。そ
ういう場合は
babababababababababababababababababababab
見つけた人がすぐに修正して下さい!
わざわざ著者に知らせて修正の許可をとるようなことはしなくてよいです。私の中学校
時代「みすか」運動というのがありました。私たちはこれを
(喫煙を)
みつかったらすぐ にかくれよう
運動と呼んでいましたが、正式な意味はこうです。
3.4
PAW
(ゴミを)
61
でヒストグラムの出力
みつけたらすぐ にかたずけよう
というわけで、著者は本書の著作権を放棄します。あとの改変、コピーは読者が自由に行っ
て下さって結構です。
なお、本書に関する感想などありましたら
[email protected] . jp 山本
昌亘 宛
までどうぞ。ですが苦情につきましては JARO(日本広告審査機構) の方へどうぞ。著者の
方ではいっさい関知致しません。
62
索引
索 引
call 文, 14
CERN, 18
CERN Library , 14
common 文, 13
Compiler, 2
data, 28
data card, 22, 52
Data Record, 23, 52
Daugh ter, 32
dimension,
27
DRS, 32
Energy Cut, 23
Energy Dep osit, 12, 22, 39, 43
esum, 22, 39
Fermi lab., 18
key, 22
FFREAD
pac kage, 23
ag, 20
gcbank, 13
gcag, 20
gc kine, 20
gconst, 20
gctmed,
27
gctrak, 44
GEOM, 12, 31
Geometry , 2, 11, 12
ggo, 23
ggclos, 34
gheish, 43
GHEISHA,
43
ginit, 22
glast, 50
gmate, 24
gpart, 24
gpghei, 43
gph ysi, 25
grun, 16, 38
gskine, 40
gsking, 45
gsmixt, 28
gsord, 34
gsp os, 32
gstmed, 29
gsv ert, 39, 40
gsv olu, 30
gtrac k, 42
gtrev e, 41
gudigi, 46
guhadr, 42
gukine, 38
guout, 46
guphad,
43
gustep, 43
gutrak, 41
gutrev, 41
gzebra, 14
gzinit, 24
Hadronic
interaction,
HBOOK,
14, 15, 35
hbook1, 35
hf1, 46
histdo, 49
HITS, 46
hlimit, 15
HPLOT,
14
hrput, 50
43
63
索引
ikine, 20, 22, 40
itype, 22, 23, 40
keys, 23
workstation
typ e, 57
ZEBRA, 14, 24
Main Program, 13
M
ainprogram,
17
m
ak e, 54
M
ak ele, 54
M
ARS, 32
m
om
e,
23
M
other, 32
M
RS, 32
終わり処理, 16
高エネルギー物理学, 2
高エネルギー物理学研究所, 6
コメント行, 12
初期化, 16
神童, 2
実行, 16
ngbank, 13
nh book, 14
nvar, 23
ヒストグラム, 14
param
eter,
13
PAW, 14, 49, 56
pa wc, 14
pb eam
, 22, 23
pkine(1), 20
pkine(2), 21
plab(3), 39
trac king, 20, 42, 44, 46
typ e, 23
udata, 21
ugeom
,
25,
uginit, 16,
uglast, 16,
uhinit, 25,
UNIX, 2
vzero, 30
26
19, 26
49
35
var, 23
vert(1), 21
vert(2), 21
vert(3), 21, 39
フェルミ国立加速器研究所, 18
メインプログラム, 12
山本 昌亘, 3
ライブラリー, 53
リダ イレクト , 52
リンク, 53
64
索引
著者略歴
山本 昌亘
1972 年大分県大分市に生まれる。1991 年大分県立大分豊府高等学校普通科卒業。同年岡
山大学理学部物理学科入学。1995 年 3 月、岡山大学理学部物理学科卒業。OUHEPL 名誉
会員。
主な著書:
「めくるめく陶芸の世界」
babababababababababababababababababababab
よい子の ぢゃーんと にゅうもん 定価
1995 年 3 月 27 日初版印刷
1995 年 3 月 30 日初版発行
著者 山本 昌亘
発行所 岡山大学核物理学研究室出版
印刷 Apple Laser Wr iter
組版 NTT jTEX v1.52 on okas un
100
円 (税抜き)
誤字、脱字、印刷ミス等について著者は一切責任を持ちません。勝手にご修正下さい。
また無断複製・複写はご自由に行って下さい。