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

反射材の入れ方のまとめ。ここでGeant4のopticalをやっている中の人に教えて頂きました。

前にも書いたように、反射材の設定は、polishedかgroundか、frontpaintedかbackpaintedかの組み合わせで、合計4種類あります。

polishedfrontpainted

表面がツルツルに研磨された結晶の回りを、ツルツルの素材で塗った場合に相当します (結晶の中から外に光が向かうと考えた場合)。このとき、反射塗料と結晶の間に空気層のようなものは存在しません。もしくは、結晶の表面をツルツルの反射材で塗ってあり (もしくは覆ってあり) 、それが空気中に置かれている場合も相当するでしょう (空気側から反射材に向かって光が当たる) 。

乱数を振って表面の反射率に達しない場合は、境界面に達した光子は吸収か検出 (detect) されます。そうでなければ、表面がツルツルなので、鏡面反射を起こします。この過程では反射と吸収しか取り扱わないため、結晶や塗料の屈折率は一切計算に使われません。

groundfrontpainted

polishedfrontpaintedと同じですが、反射の仕方が常にランバート反射だという点だけ異なります。理想的には、反射材自体の屈折率と、塗料の屈折率が同じで境界面のフレネル反射が存在しないような特殊な場合でないと、このような境界を作るのは困難だと推測します。実際には屈折率はコードの中で計算に用いられていません。もしくは、結晶などの表面を乱反射する塗料で覆ってあり、それが空気中に置いてある状況でも良いでしょう。

groundとなっていはいますが、polishとsigma_alphaの両パラメータは無視されます。常にランバート反射です。

polishedbackpainted

ツルツルの結晶を、ツルツルなESRのような反射材で覆う場合に相当します。

backpaintedでは、無限に薄い空気層のようなものを考えるため、その屈折率が計算に用いられます。もともと光が存在した物質と、その外側の無限に薄い層の屈折率を使って、すねるの法則が反射と屈折の計算に使われます。後者の屈折率は、material property tableを使って、mother volumeとは別に設定する必要があります。

いったん結晶の外に光が出ると、反射材で鏡面反射を起こします。反射率の設定などが有効になります。

反射材で反射された光は、境界面で再度フレネル反射を起こす可能性があります。この場合、Geant4では再度反射材方向へ光を戻します。ここでさらに反射や吸収を起こす可能性があるわけです。この計算は光が結晶の内部へ戻るか、どこかで吸収されてしまうまで繰り返し行われます。

反射材に加えて、境界面もpolishedだと見なされるため、sigma_alphaやpolishの設定は計算に影響しません。

groundbackpainted

polishedbackpaintedと計算過程はほぼ同じですが、反射材での反射は常にランバート反射です。その一方で、境界面での反射や屈折にはpolishもしくはsigma_alphaが使われます。従って、この境界面での反射の分布は、反射材でのランバート反射と境界面での表面粗さの組み合わさったものになります。

他の条件

現状では以上の4種類しか反射材の選択ができません。そのため、表面を荒らした結晶を鏡面反射の反射材で覆うような場合には対応できません。空気層を自分で手で入れるなりしないと駄目なようです。

結晶の表面を白色の反射材塗料で塗る場合は、groundbackpainted を使い、sigama_alpha の値はゼロにし、塗料の溶剤の屈折率を与えるのが適切かと思います。

注意点

SPECULARLOBECONSTANT を 1 にして使わないと、polishedbackpainted と groundbackpainted でランバート反射をしてしまいます。反射のときに G4OpBoundaryProcess::ChooseReflection() が呼ばれて、default では全てランバート反射になるような重みづけがしてあるからです。後者は仕様なのですが、前者は bug です (ここを参照)。