Geant4でトラッキングに制限を課す

参考、検証に使った Geant4 のバージョンは 4.10.01 である。


Geant4 でシミュレーションを行っているとトラッキングに対して不満を持つことがある。 例えば、作成した Geomerty の大きさに対し粒子のステップ長が大きすぎて期待通り粒子が曲がらない、などである。こういった場合には User Limits が必要かもしれない。User Limits は G4UserLimits で利用できる。

User Limits と G4UserLimits の詳しい説明は以下のページにある。

5.7. User Limits

G4UserLimits(G4double uStepMax = DBL_MAX,
             G4double uTrakMax = DBL_MAX,
             G4double uTimeMax = DBL_MAX,
             G4double uEkinMin = 0.,
             G4double uRangMin = 0. );

G4UserLimits.hh を include して使う。 G4UserLimits のインスタンスは logical volume または region に登録する。 その logical volume か region のインスタンスが削除されるまではインスタンスを残しておく必要がある。

設定できる制限は次のものである。

  • ステップ長の最大値 (uStepMax)
  • あるトラックにおける総ステップ長の最大値 (uTrakMax)
  • あるトラックにおける時間経過の最大値 (uTimeMax)
  • あるトラックにおける運動エネルギーの最小値 (uEkinMin)
  • あるトラックにおける range cut の最小値 (uRangMin)*1

これらを設定することに加えて、PhysicsList に G4StepLimiterPhysics.hh を include し G4StepLimiterPhysics を追加する必要がある。

例として、example/basic/B5 のコードを見てみる(見やすさのために改変してある)。

src/B5DetectorConstruction.cc の136行目あたり:

// Tube with Local Magnetic field
fMagneticLogical = 
  new G4LogicalVolume(magneticSolid, air, "magneticLogical");

// set step limit in tube with magnetic field  
G4UserLimits* userLimits = new G4UserLimits(1*m);
fMagneticLogical->SetUserLimits(userLimits);

example5.cc の76行目あたり:

G4VModularPhysicsList* physicsList = new FTFP_BERT;
physicsList->RegisterPhysics(new G4StepLimiterPhysics());
runManager->SetUserInitialization(physicsList);

これがステップ長の最大値を1メートルにする User Limit になる。

*1:これは間違っているかもしれない。赤外発散を抑えるための range cut は Physics List の SetCuts() で定義されているはずであるから私が何か勘違いしている可能性が高い。