Geant4での可視光の散乱(3)
シンチレータの周りを反射材で覆ったような状況を考える場合には、G4OpticalSurface::SetFinishを使って"painted"の指定をする必要があります。いくつかの種類があって、"polishdedfrontpainted"、"polishedbackpainted"、"groundfrontpainted"、"groundbackpainted"の4通りです。
"polished"と"ground"の違いは、反射面がピカピカかザラザラかの違いです。また"frontpainted"と"backpainted"の違いは、シンチレータと反射材の間に(無限に薄い)空気層のようなものが存在するかの違いです。
G4OpBoundaryProcess::PostStepDoItを見てみると、"frontpainted"の場合は以下のような計算をしています。
else if (type == dielectric_dielectric) { if ( theFinish == polishedfrontpainted || theFinish == groundfrontpainted ) { if( !G4BooleanRand(theReflectivity) ) { DoAbsorption(); } else { if ( theFinish == groundfrontpainted ) theStatus = LambertianReflection; DoReflection(); } } else { DielectricDielectric(); } }
確率が反射率を上回った場合は屈折させずに吸収させ、"ground"の場合だけランバート反射にします。"polished"の場合は鏡面反射です。ここではやpolishの値は関係ありません。
"frontpainted"の場合は、シンチレータと反射材が何も挟まず、直接触れている状態だと言えます。
"backpainted"の場合は薄い誘電体層の存在を仮定しています。そのため、
if (aMaterialPropertiesTable) { if (theFinish == polishedbackpainted || theFinish == groundbackpainted ) { Rindex = aMaterialPropertiesTable->GetProperty("RINDEX"); if (Rindex) { Rindex2 = Rindex->GetProperty(thePhotonMomentum); } else { theStatus = NoRINDEX; aParticleChange.ProposeTrackStatus(fStopAndKill); return G4VDiscreteProcess::PostStepDoIt(aTrack, aStep); } }
G4OpticalSurfaceにSetMaterialPropertiesTableで"RINDEX"を設定しておかないと、強制的に全ての光子が吸収されてしまいます。シンチレータを布上の反射材で覆った場合などは空気層が入り込みますので、こういう場合は当然シンチレータと空気層の屈折率で計算する必要があるわけです。
"frontpainted"の場合は全てランバート反射でしたが、"groundbackpainted"の場合に限っては、
if ( theFinish == ground || theFinish == groundbackpainted ) { theFacetNormal = GetFacetNormal(OldMomentum,theGlobalNormal); } else { theFacetNormal = theGlobalNormal; }
GetFacetNormalを呼ぶのでの設定が有効になります。
G4LogicalBorderSurfaceを使う上での注意点として、
G4LogicalBorderSurface(const G4String &name, G4VPhysicalVolume *vol1, G4VPhysicalVolume *vol2, G4SurfaceProperty *surfaceProperty)
コンストラクタの引数には順序があることです。光の伝播方向は、vol1からvol2の方向です。そのため、"front"と"back"はそれぞれvol1とvol2の側を指します。もしもvol2からvol1にも光が入射するような環境であれば、1つの境界面に対してG4LogicalBorderSurfaceを2つ用意する必要があります。