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

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

Geant4

シンチレータの周りを反射材で覆ったような状況を考える場合には、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"の場合は鏡面反射です。ここでは\sigma_\alphaや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を呼ぶので\sigma_\alphaの設定が有効になります。

G4LogicalBorderSurfaceを使う上での注意点として、

G4LogicalBorderSurface(const G4String &name, G4VPhysicalVolume *vol1, G4VPhysicalVolume *vol2, G4SurfaceProperty *surfaceProperty)

コンストラクタの引数には順序があることです。光の伝播方向は、vol1からvol2の方向です。そのため、"front"と"back"はそれぞれvol1とvol2の側を指します。もしもvol2からvol1にも光が入射するような環境であれば、1つの境界面に対してG4LogicalBorderSurfaceを2つ用意する必要があります。