読者です 読者をやめる 読者になる 読者になる

Geant4での可視光の散乱(2)

Geant4

G4MaterialPropertiesTableの設定には、"SPECULARLOBECONSTANT"、"SPECULARSPIKECONSTANT"、"BACKSCATTERCONSTANT"という名前を見ただけではよく分からない定数の設定項目があります。Geant4のdocumentやsource codeを読むだけでは直感的に分かりにくいのですが、UNIFIEDモデルの原著論文の図を見ると、一目瞭然です*1

これらの定数を与えない場合、"unified"で"ground"に設定しているときの散乱は全てランバート反射になります。図中の白い領域内です。"SPECULARLOBECONSTANT"は\sigma_\alphaに従って散乱する確率で、0〜1の値を取ります。もしこの値が1であれば、反射成分は全て図中の薄い灰色のようになります。"SPECULARSPIKECONSTANT"は平均的なツルツルの表面に対して鏡面反射をする確率で、図中の濃い灰色のうち右側の領域です。"BACKSCATTERCONSTANT"は180°後方に散乱される成分で、図中の濃い灰色の左側の領域です。

図中のCbsR、CslR、CssR、CdlRの値の合計は1にならなくてはいけません。ただし、何も設定しない場合には、CbsR=CslR=CssR=0、CdlR=1がdefaultで選ばれます。実際のsource codeの中では、以下のような単純な確率計算をしているだけです(反射・屈折・吸収のどれが起きるかは、その前に計算している)。

inline
void G4OpBoundaryProcess::ChooseReflection()
{
  G4double rand = G4UniformRand();
  if ( rand >= 0.0 && rand < prob_ss ) {
    theStatus = SpikeReflection;
    theFacetNormal = theGlobalNormal;
  } else if ( rand >= prob_ss &&
    rand <= prob_ss+prob_sl) {
    theStatus = LobeReflection;
  } else if ( rand > prob_ss+prob_sl &&
    rand < prob_ss+prob_sl+prob_bs ) {
    theStatus = BackScattering;
  } else {
    theStatus = LambertianReflection;
  }
}

屈折に関してはこれらの4つの確率は使われず、\sigma_\alphaが設定されている場合には、全て屈折角がそれに従って散乱されます。

*1:A. Levin and C. Moisan (1996), "A More Physical Approach to Model the Surface Treatment of Scintillation Counters and its Implementation into DETECT"