pptx

Garfield++
2014/9/25
京大理 髙田淳史
Garfield++の出番。

Elmerで計算した電場を読み込んで
ガス検出器のシミュレーション

C++で記述

compile時にROOTと
Garfield++のライブラリをLink
⇒ makefileを作っておくと便利

計算には時間がそれなりにかかります
Makefile例
Source codeの流れ

Magboltz
ガスの定義 (組成・温度・圧力…)

ComponentElmer
geometry, 電場構造, 比誘電率の読み込み

Sensor
simulationするarea・電極の定義

AvalancheMicroscopic
増幅過程のシミュレーション
Magboltz部分
MediumMagboltz *gas = new MediumMagboltz();
gas->SetComposition("ar", 90.,
"c2h6", 10);
組成の定義
(6種まで)
gas->SetTemperature(293.15);
温度の定義
gas->SetPressure(760.);
圧力の定義
gas->EnablePenningTransfer(0.31, 0, "ar"); Penning効果の定義
gas->SetMaxElectronEnergy(200.);
gas->EnableDrift();
Cross section tableの最大値
電子のdrift領域として定義
gas->Initialise();
gas->LoadIonMobility(“file名”)
イオンのmobility
定義されているGas

Garfield++のUser Guide
Appendix Bにも記載
CF4, Ar, He, He-3, Ne, Kr, Xe, CH4, C2H6, C3H8, iC4H10, CO2,
neoC5H12, H2O, O2, N2, NO, N2O, C2H4, C2H2, H2, D2, CO,
Methylal, DME, Reid-Step, Maxwell-Model, C2F6, SF6, NH3,
C3H6, cC3H6, CH3OH, C2H5OH, C3H7OH, Cs, F2, CS2, COS,
CD4, BF3, C2HF5, C2H2F4, TMA, CHF3, CF3Br, C3F8, O3, Hg,
H2S, nC4H10, nC5H12, N2 (Phelps), GeH4, SiH4
Penning effect
 混合気体で起こる
 励起状態の分子が、低いイオン化電位を
もつ第二の気体分子に衝突して,イオン
化を起こし、自分は基底状態に戻る
 ガス増幅率の絶対値を計算したい場合は
必須
O. Sahin+, JINST (2010)
S. Dildick氏Slideより
Ar 90% + Ethane 10%
r : Penning Transfer Rate
□:No.10
2004/5/13 15:00
2004/5/13 23:40
▲:No.16
2005/10/11 21:00
■:イオンの数
●:電子の数
•
•
Avalanche Sizeの
平均値をplot
Penning Transfer
Rateの文献値は
0.31±0.01
(JINST 2010
P05002)
Ion Mobility

信号波形のシミュレーションには必須

Garfield++のSource Code内に

Ar中のAr+

Ne中のNe+

CO2中のCO2+
のデータは存在
ComponentElmer部分
ComponentElmer *elm
= new ComponentElmer(“gemcell/mesh.header”,
“gemcell/mesh.elements”,
“gemcell/mesh.nodes”,
“gemcell/dielectrics.dat”,
“gemcell/gemcel.result”,
“cm");
elm->EnablePeriodicityX();
elm->EnableMirrorPeriodicityY();
elm->SetMedium(0, gas); MediumMagboltzの情報とリンク
elm->SetWeightingField(“gemcell/gemcell_Wtlel.result”, “wtlel”);
重み付電場の読み込み
比誘電率data fileの作成

各物質の比誘電率をGarfield++に与える必要がある

金属に対しては”非常に大きな値”を入れることで近似
物質の数
物質のID
物質の比誘電率
重み付電場

信号を読み出す電極の電位を1 Vに
それ以外の電極の電位を0 Vに設定し
Elmerで電場を計算させる
⇒
重み付電場

電荷qの荷電粒子が速度vで動くとき
読み出し電極に生じる電流は
𝑑𝑄
= 𝑞𝑣𝐸𝑤
𝐸𝑤 : 重み付電場
𝑑𝑡

Gemcellのsampleでは gemcell_Wtlel.sif で計算
Sensor部分
Sensor *sensor = new Sensor();
sensor->AddComponent(elm);
sensor->SetArea(-axis_x, -axis_y, -axis_z,
axis_x, axis_y, axis_z);
Simulationするareaの範囲の定義
sensor->AddElectrode(elm, “wtlel”); 信号読み出し電極
sensor->SetTimeWindow(0, tEnd/nsBins, nsBins);
開始時刻
bin幅
bin数
増幅時の電子をトレース
AvalancheMicroscopic部分
AvalancheMicroscopic *aval = new AvalancheMicroscopic();
aval->SetSensor(sensor)
aval->AvalancheElectron( x, y, z, vx, vy, vz);
int ne, ni;
Seed電子の初期位置
aval->GetAvalancheSize(ne, ni);
Seed電子の初速
増幅で生じた電子とイオンの数
int nd = aval->GetNumberOfElectronEndpoints();
for (int i=0; i<nd; i++) {
double x0, y0, z0, t0, e0, x1, y1, z1, t1, e1;
int status;
電子の初期位置・時刻・エネルギー
aval->GetElectronEndpopint(i, x0, y0, z0, t0, e0,
x1, y1, z1, t1, e1, status);
}
電子の終着位置・時刻・エネルギー
イオンの方は…
AvalancheMC *ion = new AvalancheMC();
ion->SetSensor(sensor);
ion->SetDistanceSteps(2e-4);
int nd = aval->GetNumberOfElectronEndpoints();
for (int i=0; i<nd; i++) {
double x0, y0, z0, t0, e0, x1, y1, z1, t1, e1;
int status;
aval->GetElectronEndpopint(i, x0, y0, z0, t0, e0,
x1, y1, z1, t1, e1, status);
ion->DriftIon(x0, y0, z0, t0);
}
なだれ電子の発生点にイオンを作って
個々に追尾する
信号波形
gas->LoadIonMobility(“file名”);
elm->SetWeightingField(“file名”, “名前”);
sensor->AddElectrode(elm, “名前”);
sensor->SetTimeWindow(start, w_bin, n_bin);
aval->EnableSignalCalculation();
ion->EnableSignalCalculation();
for( ; ; ){
sensor->ClearSignal();
for(int j=0; j<n_bin; j++)
double w = sensor->GetSignal(“名前”, j);
}
イオン成分: GetIonSignal(“名前”, j)
電子成分: GetElectronSiganl(“名前”, j);