Reference

Geant4講習会
Geant4講習会(こっちの方が新しい)
Geant4 Installation Guide


  粒子生成

実装

G4VUserPrimaryGeneratorActionを継承すると、Event発生時にGeneratePrimaries()が呼ばれる。
この中で、G4ParticleGun *gunParticleに粒子の運動量や位置等の情報を渡す。
G4ParticleGunを複数作れば、それぞれの条件で複数の粒子を発生させることができる。
最後にGeneratePrimaryVertex(event)で、粒子を生成する。
gunParticle = new G4ParticleGun(n_particle); //ParticleGunをせいせい。n_particleは粒子発生数
gunParticle->SetParticleEnergy(Energy);
gunParticle->SetParticleDefinetion(particle); //粒子の名前
[particle->particleTable->FindParticle("e-") //kaon+, geantino, etc...]
gunParticle->SetParticleMomentum(Momentum); //運動量
gunParticle->SetParticlePosition(position); //発生位置
gunParticle->GeneratePrimaryVertex(anEvent); //粒子の生成
 
G4GeneralParticleSourceもあるが、ParticleGunよりも多様の関数が用意されており、 エネルギーや粒子発生を特殊な条件で生成できる


  データ取得

方法

1. 自分で検出器に印をつけておき、粒子が検出器を通ったかどうかを逐一確認する
2. Sensitive Detectorを論理物体に付与しておくと、ヒットがあったときに自動的にデータ取得用の関数が呼ばれる
通常は2の方法を利用する。
Sensitive Detectorに粒子が当たると、ProcessHits(G4Step* aStep, G4TouchableHiistory*)が呼ばれる。検出器内では、ステップごとにProcessHitsが呼ばれる。
ProcessHitsではstepが渡されるので、以下の関数でトラックもとってこれる。
G4Track *aTrack = astep->GetTrack();
trackから取ってこれる情報として、以下のものがある。
G4String ParticleName = atrack->GetDynamicParticle()->GetParticleDefinition()->GetParticleName(); //粒子名
G4String Charge = atrack->GetDynamicParticle()->GetParticleDefinition()->GetPDGCharge(); //粒子名
G4ThreeVector momentum = atrack->GetMomentum(); //運動量
G4double kinEnergy = atrack->GetKineticEnery(); //運動エネルギー
G4double globalTime = atrack->GetGlobalTime(); //世界時間(現イベントの開始時からの経過時間)
G4int trackID = atrack->GetTrackID(); // 一時粒子ならばTrackID=1


  Field (4.3 Electromagnetic Field p158-)

実装

磁場の表現
G4MagneticFieldを継承すると、GetFieldValue()が呼ばれる。
GetFieldValue()内に磁場の値をかく。
磁場の組込み
G4FieldManagerにG4MagneticFieldオブジェクトを渡す。
G4FieldManager *globalFieldMgr = G4TransportationManager::GetTransportationManager()->GetFieldManager();
globalFieldMgr->SetDetectorField(magField)
globalFieldMgr->CreateChordFinder(magField)
->各ステップごとにGetFieldValue()が呼ばれる

誤差について

電磁場中を進む粒子をトラックする場合、Geantではまず運動方程式を解くことで粒子軌道を決定する。これをreal trajectoryと呼ぶ。その後、この軌道をいくつかの直線(弦)に分解する。分解した後の弦は粒子軌道と物体境界の交差の決定に使用される。 一般的に、一つのstepには複数の弦が含まれている。 この時、real trajectoryと分解後の軌跡が違うことで様々な誤差が生じてしまう。
ユーザーがこの誤差を制御するために、"miss distance", "delta intersection", "delta one step"の3つのパラメータが用意されている。
まず、"miss distance"は、real trajectoryをいくつかの弦に分解する際、この二つにどれだけ距離があって良いかを規定する(Fig4.6参照)。
"delta intersection"は軌道が物体の境界を横切る時に使用される。 Guideでは詳しく記載されていないためよくわからないが、物体の境界を判断するアルゴリズムにおいて、粒子軌道がカクカクであるためにバイアスがかかってしまうらしい(Fig4.7参照)。""delta intersection"を許容誤差よりもずっと小さくすることでバイアスの効果を抑えることができる。 これに関しては、Guideよりも右のpdfの方が詳しい( Geant4_Sensitivity_Field.pdf
"delta one step"は、通常のステップ(境界がない場合)でのendpointの精度である。
"delta interscetion"は"delta one step"よりも重要である。"delta one step"による誤差は統計的なものに過ぎないが、"delta intersection"によるバイアスは物理量の系統誤差に陽に効いてしまう。特にtracking detectorを考慮する際には注意が必要である。
また、Guideでは"delta intersection"と"delta one step"はほぼ同じ値(少なくともorderは一緒)で使用することを推奨している。
初期値は、"miss distance"は0.25 mm, "delta intersection"は1 um, "delta one step"は0.01mm(合ってる?)。
さらに、位置や運動量の積分時にも数値誤差が生じてしまう。これを制御するのが"EpsilonMax"と"EpsilonMin"である。これは各ステップで積分する際の相対誤差の下限と上限を決める。