geant4 による カロリメータ...
TRANSCRIPT
Geant4 による
カロリメータのシミュレーション
信州大学理学部 物理科学科
高エネルギー研究室
02S2030E
堀越 健作
目次
第一章 ~はじめに~ ---------------------------------------------------- 1
1, 目的
第二章 カロリメータ内の現象 --------------------------------------------- 2
1, 電磁シャワー
第三章 シミュレーション ------------------------------------------------- 5
1, 概要 ~Geant4 とは~
2, Geant4 の特徴
3, exampleN03 のカロリメータ
4, カロリメータに空気を入れる(Gap の数を増やす)
5, 測定器
6, 入射粒子
7, 磁場
8, シミュレーションの流れ
第四章 シミュレーションの結果 ------------------------------------------- 12
1, Pb8mm.sci2mm
2, Pb8mm.sci2mm.Air1mm
3, Pb8mm.sci2mm.Air2mm
4, Pb8mm.Air1mm.sci2mm.Air1mm
5, Pb8mm.Air2mm.sci2mm
第五章 結果に基づいたデータ処理・考察 ----------------------------------- 19
1, カロリメータ 1、2について
2, カロリメータ 3、4、5について
第六章 まとめ ----------------------------------------------------------- 26
第七章 付録 ------------------------------------------------------------- 27
1
第一章 ~はじめに~
目的
カロリメータに粒子を入れ、その振舞いを観測する。またカロリメータに磁場をかけ、今
後実際の実験に備えてシミュレートする。理由として現実にメートル単位で磁場をかける
のは容易ではないことが挙げられる。そのためシミュレーションをすることが必要である。
そしてこの研究結果を今後の測定器開発に役立てる。
Geant4 の一般的なカロリメータについてシミュレーションする。Geant4 については三章で
触れる。
2
第二章 カロリメータ内の現象
電磁シャワー
物質に高エネルギーの電子や陽電子が入射し原子核のそばを通ったとき、原子核の電場に
よりγ線を放出する(制動放射)。放出されたγ線は、電子と陽電子を作る(電子・陽電子対
生成) 。
このように制動放射と電子対生成の繰り返しで、電子と陽電子がネズミ算式に増えていく
現象を電磁シャワーという。シャワーというのは粒子の飛散の様子から呼ばれている。
このシャワー現象は電子らのエネルギーが以下で表されるEc(臨界エネルギー)になるま
で続く。
(Zは物質の原子量)
●制動放射
高エネルギー荷電粒子が物質中の電場の影響を受け減速して 1個の光子を生成する。
100MeV 以上の電子、陽電子ではこの反応が主である。
●対生成
原子核による強い電場の影響で光子が消滅して電子、陽電子を生成する。電子と陽電子の
質量は 1.022MeV に相当するため対生成には 1.022MeV 以上のエネルギーが必要となる。
対生成
Z + 1.2
800
MeVEc =
制動放射 電子
光子(γ線)
陽電子
3
また、陽電子の速度が十分遅くなると周りの電子に引き寄せられ反応し、消滅して 2個の
光子を生成するという対消滅反応が起こりやすくなる。
シャワー粒子数が最大となる層の厚さは
ln(E0/Ec)
その粒子数は
0.3E0/Ec*(E0/Ec)**-1/2
シャワーの横方向の拡がり xは次のように表される。
<x**2>**1/2~0.8Es/Ec
E0 入射エネルギー、Ec臨界エネルギー、Es=21MeV である。
後述するが今回のシミュレーションの場合、
シャワーを起こすターゲットは鉛(原子量 207.2)、入射する電子は E0 = 4GeV であるから
Ec = 800/(207.2 + 1.2) = 3.83877159MeV およそ 3.8MeV 以上の電子がシャワーを起こす。
またシャワー粒子数が最大となる層の厚さは
ln(E0/Ec)=ln(4000 / 3.83877159) = 6.94889722 mm
粒子数は 0.3E0/Ec*(E0/Ec)**-1/2 =((0.3 * 4 000) / 3.83877159) * sqr(3.83877159 / 4
000) = 9.68400744
シャワーの横方向の拡がり xは<x**2>**1/2~0.8Es/Ec=(0.8 * 21) / 3.83877159 = 4.3764
で表される。
全断面積
これらの過程の起こりやすさを考える。全断面積σとは、入射粒子が衝突する物質の標的、
ターゲットの面積に相当する。この値σ と物質の密度により反応が起こる確率が求まり、
粒子の平均自由行程も求めることができる。
例えば粒子 Bからなる板に粒子 Aを衝突させるとする。
板の粒子数密度を n、厚さを d、よって単位面積あたり nd個の粒子がある
Bの拡がりをσとして衝突粒子 Aから板を見たとき、進路上に Bがある割合は P = σnd
この σ = P / nd を全断面積という。ここでは粒子 Bは鉛であり、密度は 11.34*g/cm3
粒子 Aは電子である。
4
平均自由行程
粒子が物質中で衝突せずに進む距離 x の平均値を平均自由行程 lといい、
l = 1 / nσ
である。(nは粒子の数密度)
鉛の数密度 nは密度 11340kg/m3 原子量 207.2 から
n = (11340 / 0.2072) * 6.02 * (10 ** 23) = 3.29472973 × 1028m-3
となる。
5
第三章 シミュレーション
概要 ~Geant4 とは~
Geant4 は C++言語を用いた高エネルギー大規模測定器シミュレータで、陽子・電子・中性
子・γ線・π粒子・μ粒子といった粒子と物質の複雑な相互作用をシミュレーションでき
る。多くの分野で役に立ち、実際に宇宙開発・放射線医療などでも本格的な使用が開始さ
れている。
Geant4 の特徴
・実験・観測結果との比較
・複雑な物理シミュレーションを行える
・目的に応じてユーザーがソースを作成、修正できる
exampleN03 のカロリメータ
exampleN03 のカロリメータは、正方形の層(layer)がサンドイッチ状に並んだ構造をしてお
り、鉛や鉄などを使う吸収層(Absorber)と、シンチレータを主とする検出層(Gap)がある。
カロリメータに入射した粒子は吸収層で前述の電磁シャワーを起こす。そして発生した荷
電粒子が検出層で出す光により、粒子の入射時刻やその種類・エネルギー値についての情
報を得ることが可能となる。
1layer(層)
鉛層
シンチレータ層
6
カロリメータに空気を入れる(Gap の数を増やす)
基本的にカロリメータは吸収層(Absorber)と検出層(Gap)の二つから成る。しかし現実にカ
ロリメータを作ろうとする時にはどうしても空気が入ることがある。そこで本研究ではこ
れを想定し、空気を含んだカロリメータも扱う。
そのために検出層(Gap)の数を増やすようソースを修正・作成する。具体的に述べると以下
のファイルである。
src/ExN03DetectorConstruction.cc
src/ExN03DetectorMessenger.cc
include/ExN03DetectorConstruction.hh
include/ExN03DetectorMessenger.hh
src/ExN03SteppingAction.cc
これらの中にある『Gap』と書かれた部分を、『Gap1』、『Gap2』として Gap1 をシンチレータ、
Gap2 を空気と定義する(逆の定義も可能)。
更に Gap3、Gap4・・・と加えれば必要に応じて複雑なカロリメータの作成が可能になる。
しかし src/ExN03SteppingAction.cc では以下に注意する。
if ((edep!=0.)) {
if (volume == detector->GetAbsorber()) eventaction->AddAbs(edep,stepl);
if (volume == detector->GetGap1()) eventaction->AddGap(edep,stepl);
if (volume == detector->GetGap2()) eventaction->AddGap(edep,stepl);
・・・以下略
この三行目と四行目
if (volume == detector->GetGap1()) eventaction->AddGap(edep,stepl);
if (volume == detector->GetGap2()) eventaction->AddGap(edep,stepl);
はどちらかだけを使う。例えば Gap1(シンチレータ)の結果が欲しいのなら Gap2(空気)の
行を無効にしないと値が得られない。
もう一つ必要な作業として、位置(position)の設定がある。
例として src/ExN03DetectorConstruction.cc 内の Gap1 を挙げる。
ここでは 1layer は
(鉛)Absorber/(シンチレータ)Gap1/(空気)Gap2
で構成されているとする。
7
//
// Gap1
//
solidGap1=0; logicGap1=0; physiGap1=0;
if (Gap1Thickness > 0.)
{ solidGap1 = new G4Box("Gap1",Gap1Thickness/2,CalorSizeYZ/2,CalorSizeYZ/2);
logicGap1 = new G4LogicalVolume(solidGap1,
Gap1Material,
Gap1Material->GetName());
physiGap1 = new G4PVPlacement(0, //no rotation
G4ThreeVector((AbsorberThickness-Gap2Thickness)/2,0.,0.), //its position
logicGap1, //its logical
volume
Gap1Material->GetName(), //its name
logicLayer, //its mother
false, //no boulean
operat
0); //copy number
}
この//its position と書かれた行に着目する。
1layer は Absorber/Gap1/Gap2 の順で並んでいる。
Gap1 の x軸の position が(AbsorberThickness-Gap2Thickness)/2 と表されるのは、Gap1 よ
りも前にあるものを正、後ろにあるものを負とすることで幾何学的に正しく層が配置され
るためである。従って他の場合、
Absorber/Gap1/Gap2/Gap3/Gap4
であれば、Gap2 の x-position は
(AbsorberThickness+Gap1Thickness-Gap3Thickness-Gap4Thickness)/2 となる。
これにより 1layer 内の構造が正しく設定され、必要とするカロリメータが用意できる。
8
測定器
カロリメータの断面は、一辺 100 cm の大きさをしている。
layer 数は、100layer である。これらは
src/ExN03DetectorConstruction.cc で変更可能。
入射粒子
エネルギー4GeV の電子を入射する。
N03/run1.mac で決める。
磁場
粒子の入射方向に対して、垂直に 0 tesla から 10 tesla の磁場をかける。
そのために、exampleN04 のプログラムをコピーする。
1、N03/src 内に以下を ExN04Field.cc というファイル名で保存する。
#include "ExN04Field.hh"
ExN04Field::ExN04Field()
{
Bz = 3.0*tesla;
rmax_sq = sqr(50.*cm);
zmax = 100.*cm;
}
ExN04Field::~ExN04Field()
{;}
void ExN04Field::GetFieldValue(const double Point[3],double *Bfield) const
{
Bfield[0] = 0.;
Bfield[1] = 0.;
if(abs(Point[2])<zmax && (sqr(Point[0])+sqr(Point[1]))<rmax_sq)
{ Bfield[2] = Bz; }
100cm
100cm 磁場
100layer(層) 電子が入射する
9
else
{ Bfield[2] = 0.; }
}
2、N03/include 内に以下を ExN04Field.hh というファイル名で保存する。
#ifndef ExN04Field_H
#define ExN04Field_H 1
#include "globals.hh"
#include "G4MagneticField.hh"
class ExN04Field : public G4MagneticField
{
public:
ExN04Field();
~ExN04Field();
void GetFieldValue( const double Point[3],
double *Bfield ) const;
private:
G4double Bz;
G4double rmax_sq;
G4double zmax;
};
#endif
3、以下を src/ExN03DetectorConstruction.cc に追加する。
#include "ExN04Field.hh"
#include "G4TransportationManager.hh"
10
#include "G4MaterialTable.hh"
#include "G4Element.hh"
#include "G4ElementTable.hh"
#include "G4Tubs.hh"
#include "G4ThreeVector.hh"
#include "G4Transform3D.hh"
#include "G4RotationMatrix.hh"
#include "G4FieldManager.hh"
以下を G4VPhysicalVolume* ExN03DetectorConstruction::Construct()に追加する。
//-------------------------------------------------------------------------
// Magnetic field
//-------------------------------------------------------------------------
static G4bool fieldIsInitialized = false;
if(!fieldIsInitialized)
{
ExN04Field* myField = new ExN04Field;
G4FieldManager* fieldMgr
= G4TransportationManager::GetTransportationManager()
->GetFieldManager();
fieldMgr->SetDetectorField(myField);
fieldMgr->CreateChordFinder(myField);
fieldIsInitialized = true;
}
これで ExN04Field.cc を使って磁場をかけることができる。
11
シミュレーションの流れ
1、カロリメータに電子を一つ入れて、
シンチレータ 100layer に吸収されたエネルギーを合計する
2、電子 1000 個分についてエネルギー合計のヒストグラムを作り、
3、それぞれ磁場 0 ~ 10 tesla でシミュレーションする
4、これをカロリメータ 1~5 でそれぞれ行なう
理由
・ランダム要素の大きい現象のため、1000event 分のデータを必要とする
・10tesla という値はかなり大きいが、どんな影響が出るか不明なので扱っておく。
・前述した通り、空気の浸入を考慮したカロリメータ 2~5 を用意した。
色々な位置に、厚さの違う空気が入っている。2mm という値はかなり大きいが、磁場と同
じく扱ってみることで、影響を観察する。
カロリメータ 1~5 は以下のように 1layer を構成する。
1、鉛(Pb)8mm ┃ シンチレータ(sci)2mm
2、Pb8mm ┃ sci2mm ┃ 空気(Air)1mm
3、Pb8mm ┃ sci2mm ┃ Air2mm
4、Pb8mm ┃ Air1mm ┃ sci2mm ┃ Air1mm
5、Pb8mm ┃ Air2mm ┃ sci2mm
シミュレーションで得た結果を次に示す。
12
第四章 シミュレーションの結果1、Pb8mm ┃ sci2mm のシンチレータ 100layer に吸収されたエネルギーの合計値
(電子 1000event)磁場の範囲は 0~10tesla 横軸【エネルギー合計値(MeV)】、縦軸【頻度】
■磁場 0tesla ■磁場 1tesla
■磁場 2tesla ■磁場 3tesla
■磁場 4tesla ■磁場 5tesla
13
■磁場 6tesla ■磁場 7tesla
■磁場 8tesla ■磁場 9tesla
■磁場 10tesla
これらガウス曲線の頂点の値を
表・グラフにしたものを次に示す。
14
1、Pb8mm ┃ sci2mm の磁場 0~10tesla の結果
磁場(tesla) 0 1 2 3 4 5 6 7 8 9 10
結果(MeV) 95.97 97.99 98.66 100.1 102.2 103.1 104.5 105.4 104.8 104.5 104.6
Sigma 0.34 0.33 0.34 0.3 0.3 0.3 0.3 0.4 0.3 0.4 0.4
■横軸【磁場(tesla)】、縦軸【結果(MeV)】■
15
2、Pb8mm ┃ sci2mm ┃ 空気(Air)1mm のシンチレータ 100layer に吸収されたエネルギー
の合計値 (電子 1000event) 磁場の範囲は 0~10tesla
■磁場 0tesla(1~10tesla のグラフは省略)横軸【エネルギー合計値(MeV)】、縦軸【頻度】
磁場(tesla) 0 1 2 3 5 6 7 8 9 10
結果(MeV) 96.95 98.15 101.6 105.1 110.8 112 113.7 112.6 114.3 112.2
Sigma 0.33 0.34 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.4
■横軸【磁場(tesla)】、縦軸【結果(MeV)】■
16
3、Pb8mm ┃ sci2mm ┃ Air2mm のシンチレータ 100layer に吸収された
エネルギーの合計値 (電子 1000event) 磁場の範囲は 0~10tesla
■磁場 0tesla(1~10tesla のグラフは省略)横軸【エネルギー合計値(MeV)】、縦軸【頻度】
磁場(tesla) 0 1 2 3 5 6 7 8 9 10
結果(MeV) 99.52 100.1 104.7 109.6 116.9 117.9 118.4 118.1 117.3 114.8
Sigma 0.33 0.3 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5
■横軸【磁場(tesla)】、縦軸【結果(MeV)】■
17
4、Pb8mm ┃ Air1mm ┃ sci2mm ┃ Air1mm のシンチレータ 100layer に吸収された
エネルギーの合計値 (電子 1000event) 磁場の範囲は 0~10tesla
■磁場 0tesla(1~10tesla のグラフは省略)横軸【エネルギー合計値(MeV)】、縦軸【頻度】
磁場(tesla) 0 1 2 3 5 6 7 8 9 10
結果(MeV) 96.92 97.57 100.5 103.3 106.9 106.9 106.3 104.5 102.6 100.1
Sigma 0.33 0.34 0.4 0.4 0.4 0.4 0.4 0.5 0.4 0.5
■横軸【磁場(tesla)】、縦軸【結果(MeV)】■
18
5、Pb8mm ┃ Air2mm ┃ sci2mm のシンチレータ 100layer に吸収された
エネルギーの合計値 (電子 1000event) 磁場の範囲は 0~10tesla
■磁場 0tesla(1~10tesla のグラフは省略)横軸【エネルギー合計値(MeV)】、縦軸【頻度】
磁場(tesla) 0 1 2 3 4 5 6 7 8 9 10
結果(MeV) 96.96 95.05 95.07 95.08 94.94 93.02 91.73 89.81 88.29 85.71 83.2
Sigma 0.33 0.33 0.33 0.37 0.38 0.35 0.39 0.39 0.40 0.42 0.4
■横軸【磁場(tesla)】、縦軸【結果(MeV)】■
19
第五章 結果に基づいたデータ処理・考察
■ 1、Pb8mm ┃ sci2mm 2、Pb8mm ┃ sci2mm ┃ Air1mm について
横軸【磁場】、縦軸【結果】
磁場の増加に伴ってエネルギーの値が増えていき、磁場がある程度大きさになると、あま
り変化は見られなくなった。
カロリメータに磁場をかけると荷電粒子の進行方向が曲がる。従って磁場がない時よりも
カロリメータ内を走る距離が長くなるためエネルギーが多く吸収された(下図参照)。
6 tesla 以降エネルギーが増えないのは、電子の走る距離に大きな変化がないものと推測
される。これらの裏付けとして、次にカロリメータ1を使って粒子の移動距離のデータを
とった。
Pb sci
0 tesla
2 tesla
磁場
1 2
20
src/ExN03SteppingAction.cc 内を修正して を出力させた。
■カロリメータ1(Pb8mm ┃ sci2mm)内を粒子の通過総距離 磁場の範囲は 0~10tesla
■磁場 0tesla(1~10tesla のグラフは省略)横軸【粒子の総距離(mm)】、縦軸【頻度】■
磁場(tesla) 0 1 2 3 4 5 6 7 8 9 10
総距離(mm) 3523 3533 3536 3537 3553 3557 3561 3563 3561 3561 3557
Sigma 1.7 1.5 1.7 1.6 1.6 1.7 1.7 1.7 1.8 1.8 1.8
■横軸【磁場(tesla)】、縦軸【総距離(mm)】■
21
この結果から、電子がカロリメータを通過する距離が、磁場の増加に比例していることが
確かめられる。
6 tesla 以降距離に大きな変化がない理由は、磁場によりUターンしている電子の数が増
えてきているためと考えられる。
電子のUターンについては次の考察で触れる。
22
■3、Pb8mm ┃ sci2mm ┃ Air2mm
■4、Pb8mm ┃ Air1mm ┃ sci2mm ┃ Air1mm
■5、Pb8mm ┃ Air2mm ┃ sci2mm について
横軸【磁場】、縦軸【結果】
4と5は磁場を強くすると値が大きく減少する結果を得た。また空気の位置が違うだけの
3と5の結果の差は注目したい。
3と5の違いの理由の一つとして、磁場を上げることで鉛を通過した電子がシンチレータ
に到達することなく空気層でUターンし、再び鉛に入ってしまったことが考えられる(次
の図を参照)。
3
4
5
23
電子がUターンするモデル図
運動量、円運動半径、磁場の間には次の関係がある。これを使って暫定ではあるがこの現
象を考察する。
P = 0.3 R B P 運動量(MeV/c)、R 半径(mm)、B 磁場(tesla)
例 R = 2mm(Air の厚さ)、B = 1tesla とする。
このとき
P = 0.3 x 2 x 1 = 0.6 MeV/c
となり、0.6MeV/c の電子はシンチレータ層に到達することができない。
この仮説の裏付けとして、第一 layer 目の鉛層に吸収されたエネルギーを測定した。
仮説が正しければ磁場でUターンした電子により、磁場に比例して値が増加すると予想さ
れる。
これに必要なシミュレーションを次に示す。
磁場
2mm
Pb Air sci
電子
24
layer 毎の値をとるためには次のことをする。
第一 layer 目の鉛層を Abs1 と呼ぶことにする。
1、src/ExN03EventAction.cc では、
// initialisation per event と書かれたところに次の行を加える。
EnergyAbs1 = 0.;TrackLAbs1 = 0.;
2、src/ExN03EventAction.hh では Abs1 の定義を加える。
3、src/ExN03SteppingAction.cc では、以下のようにする。
if ((edep!=0.)) {
if (volume == detector->GetAbsorber()) eventaction->AddAbs(edep,stepl);
// if (volume == detector->GetGap1())
eventaction->AddGap(edep,stepl);
if (volume == detector->GetGap2())
eventaction->AddGap(edep,stepl);
if(volume == detector->GetAbsorber() && -592 > track->GetPosition().x()
&& -600 < track->GetPosition().x()){
eventaction->AddAbs1(edep,stepl);
}
得るエネルギー値をファイルに出力する方法は付録を参照。
25
これによって、Abs1 の領域を定義してそこに吸収されたエネルギーが得られる。
一つの磁場に対して電子 1000event の結果を以下に示す。
■Abs1 に吸収されたエネルギー値 磁場の範囲は 0~10tesla
磁場(tesla) 0 1 2 3 5 6 7 8 9 10
結果(MeV) 51.67 57.89 56.28 57.92 60.5 67.98 67.75 76.25 77.63 82.28
Sigma 1.27 1.18 1.26 1.09 1.3 1.18 1.50 1.44 1.27 1.40
■横軸【磁場(tesla)】、縦軸【結果(MeV)】■
この結果から、磁場の増加に伴って第一 layer 目の鉛層に吸収されるエネルギーが増加す
ることが確かめられた。先程の式
P = 0.3 R B P 運動量(MeV/c)、R 半径(mm)、B 磁場(tesla)
から一定の運動量の時、磁場と回転半径は B = P / 0.3 R = K / R (K は定数)となり、
反比例している。磁場が増加すれば半径は小さくなり、Uターンしやすい。
従って磁場の影響からUターンする電子が多くあると言える。
なお、このUターン現象は空気層の有無に関わらず、物資中でも起こることが、前述の隙
間のないカロリメータ1、2の考察から言える。空気層を入れたことで鉛とシンチレータ
の間隔が大きくなったため、Uターン現象が顕著に現れるようになったのである。
26
第六章 まとめ
1、基本的に磁場をかけることで得るエネルギーが増加するが、空気の侵入と強すぎる磁
場はエネルギーの減少に繋がることが確認された。
2、鉛とシンチレータの間には、できる限り空気を入れないようにするべきである。
3、今回は扱った空気層の厚さは 1mm と 2mm だけだったが、今後 0.1mm、0.01mm オーダー
でシミュレーションを行えば、磁場により値が減少する臨界の厚さが求まるだろう。
4、これまでこのカロリメータに磁場をかけた実験は行なわれていない為、今回のシミュ
レーションを今後の測定器開発に役立てたい。
最後に、本研究に助言を下さった竹下先生、同研究室の小島君、中山さんに感謝します。
27
第七章 付録
値をファイルに落とす方法
src/ExN03EventAction.cc に以下を加える
ofstream fo;
fo.open("filename",std::ios::app);
if(!fo) {
G4cout << G4endl << " can't !!!! " << G4endl << G4endl;
exit(1);
}
if (evtNb%printModulo == 0) {
fo
<< std::setw(7)
<< EnergyAbs
<< " " << std::setw(7)
<< EnergyGap
<< G4endl;
fo.close();
}
これで EnergyAbs と EnergyGap の結果が filename に出力される。
fo を別名にして使い分ければ一度に様々なデータを出力させることが可能。