光学特性したい(G4MaterialPropertiesTable)
1// 素材:水(G4_WATER)
2auto nm = G4NistManager::Instance();
3auto water = nm->FindOrBuildMaterial("G4_WATER");
4
5// プロパティを設定(水のpre-defined値を使用)
6auto mpt = new G4MaterialPropertiesTable{};
7mpt->AddProperty("RINDEX", water); // pre-defined値(マテリアルのポインタを渡す)
8mpt->AddProperty("ABSLENGTH", ...);
9mpt->AddProperty("RAYLEIGH", ...);
10mpt->AddProperty("MIEHG", ...);
11
12// 水に屈折率を設定
13water->SetMaterialPropertiesTable(mpt);
G4MaterialPropertiesTableでマテリアルの光学特性を設定できます。
光学物理の物理モジュールを利用する場合は必須です。
OpticalPhysicsの物理プロセスを使う場合、
素材の屈折率(RINDEX)や
吸収長(ABSLENGTH)などの性質をユーザーが設定する必要があります。
それぞれの物理プロセスで必要なパラメーターの設定は
Configuration - Book For Application Developersを参照してください。
なお、Geant v11.0 から
Air(空気)、
Water(水)、
PMMA(アクリル樹脂/ポリメタクリル酸メチル)、
Fused Silica(石英ガラス)
に対して屈折率のpre-defined値が追加されています。
チェレンコフ光したい
1// AddProperty("キー名", std::vector配列, std::vector配列)
2// AddProperty("キー名", 配列, 配列, 配列の数)
3mpt->AddProperty("RINDEX", photon_energy, refractive_index, n_entries);
4mpt->AddProperty("ABSLENGTH", photon_energy, absorption, n_entries);
チェレンコフ光の生成には屈折率(RINDEX)の設定が必須です。
他の光学特性(ABSLENGTHなど)は省略可能ですが、
RINDEXが設定されていないとG4Cerenkovプロセスは光子を生成しません。
注釈
photon_energyの範囲が狭すぎると、その範囲外の波長のチェレンコフ光が生成されません。
可視光〜紫外域まで含めておくのが一般的です。
G4MaterialPropertiesTableの設定だけでは不十分で、
物理リストにG4Cerenkovプロセスを登録する必要があります。
詳細は光学物理したい(G4OpticalPhysics)を参照してください。
また、以下のようなメソッドで光子の生成量やトラッキング順序を制御できます。
1auto cerenkovProcess = new G4Cerenkov{};
2cerenkovProcess->SetMaxNumPhotonsPerStep(100); // 1ステップあたりの光子数の上限
3cerenkovProcess->SetTrackSecondariesFirst(true); // 光子を親粒子より先にトラッキング
SetMaxNumPhotonsPerStepを設定しないと、
荷電粒子の数が多い場合にシミュレーションが極端に遅くなることがあります。
シンチレーション光したい
1auto material = new G4Material{
2 "LXe",
3 54., // z
4 131.29 * g / mole, // a
5 3.020 * g / cm3 // density
6};
7
8std::vector<G4double> photon_energy = { 7.0 * eV, 7.07 * eV, 7.14 * eV };
9std::vector<G4double> scintillation = { 0.1, 1.0, 0.1 };
10std::vector<G4double> refractive_index = { 1.59, 1.57, 1.54 };
11std::vector<G4double> absorption_length = { 35. * cm, 35. * cm, 35. * cm };
12
13auto property = new G4MaterialPropertiesTable{};
14// 波長に依存するプロパティ
15property->AddProperty("RINDEX", photon_energy, refractive_index);
16property->AddProperty("ABSLENGTH", photon_energy, absorption_length);
17property->AddProperty("SCINTILLATIONCOMPONENT1", photon_energy, scintillation);
18property->AddProperty("SCINTILLATIONCOMPONENT2", photon_energy, scintillation);
19
20// 波長に依存しないプロパティ
21property->AddConstProperty("RESOLUTIONSCALE", 1.0);
22property->AddConstProperty("SCINTILLATIONYIELD", 12000. / MeV);
23property->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 20. * ns);
24property->AddConstProperty("SCINTILLATIONTIMECONSTANT2", 45. * ns);
25property->AddConstProperty("SCINTILLATIONYIELD1", 1.0);
26property->AddConstProperty("SCINTILLATIONYIELD2", 0.0);
27
28// 物質にプロパティを設定
29material->SetMaterialPropertiesTable(property);
examples/extended/optical/LXe/のサンプルを参照しました。
屈折率と吸収長の他に、シンチレーション光のプロパティ(光量や時定数)をいくつか設定しています。
SCINTILLATIONYIELDは「1 MeVあたりの光子数」で指定します。
SCINTILLATIONCOMPONENT1とSCINTILLATIONCOMPONENT2は、
速い成分(Fast)と遅い成分(Slow)の相対発光スペクトル(絶対強度ではない)です。
それぞれの減衰時定数がSCINTILLATIONTIMECONSTANT1とSCINTILLATIONTIMECONSTANT2、
全体に対する割合がSCINTILLATIONYIELD1とSCINTILLATIONYIELD2(合計が1.0になるように設定)です。
RESOLUTIONSCALEは光子数の統計ゆらぎを制御します。
1.0でポアソン統計相当のゆらぎ、0にすると光子数が決定論的(ゆらぎなし)になります。
注釈
チェレンコフ光と同様、G4MaterialPropertiesTableの設定だけでは不十分で、
物理リストにG4Scintillationプロセスを登録する必要があります。
注釈
重粒子(陽子やアルファ線)ではエネルギー損失に対して発光量が非線形になる
(Birksの消光則)ため、
G4EmSaturationとAddSaturationで補正することがあります。
省略すると重粒子の発光量が過大評価されることがあります。
OpticalSurfaceしたい
1auto surface = new G4OpticalSurface{"Surface"};
2surface->SetType(dielectric_dielectric);
3surface->SetFinish(ground); // rough surface
4surface->SetModel(unified); // UNIFIED model
5
6auto surfaceProperty = new G4MaterialPropertiesTable{};
7// surfaceProperty->AddProperty(...); // 表面の光学特性を設定
8surface->SetMaterialPropertiesTable(surfaceProperty);