Geant4で重イオンを入射したいという欲求に駆られた。Geant4で標準で扱える入射粒子はZが2以上だとヘリウム-4のみである。それ以外の原子核はやや特殊な方法で作る。
class PrimaryGenerator : public G4VUserPrimaryGeneratorAction { public: PrimaryGenerator(); ~PrimaryGenerator(); public: void GeneratePrimaries(G4Event*); private: G4ParticleGun * fpParticleGun; };
G4VUserPrimaryGeneratorAction を継承したPrimaryGenerator クラスがあったとして、
PrimaryGenerator::PrimaryGenerator() : fpParticleGun(0) { fpParticleGun = new G4ParticleGun(); G4ParticleDefinition* particle = G4IonTable::GetIonTable()->GetIon(90, 232); fpParticleGun->SetParticleDefinition(particle); fpParticleGun->SetParticleEnergy(250 * MeV); }
PrimaryGeneratorクラスのコンストラクタ内で重イオン(Z=90、A=232のトリウム)を作ろうとすると、
-------- WWWW ------- G4Exception-START -------- WWWW ------- *** G4Exception : PART105 issued by : G4IonTable::CreateIon() Can not create ions because GenericIon is not ready *** This is just a warning message. *** -------- WWWW -------- G4Exception-END --------- WWWW ------- -------- EEEE ------- G4Exception-START -------- EEEE ------- *** G4Exception : Event0101 issued by : G4ParticleGun::SetParticleDefinition() Null pointer is given. *** Fatal Exception *** core dump *** **** Track information is not available at this moment **** Step information is not available at this moment -------- EEEE -------- G4Exception-END --------- EEEE -------
以上のようなエラーが出る。後半はNull pointerだよと言ってるだけであまり意味はなくて、前半のGenericIon がないよというのが本命のエラー。何らかの準備が必要なのだろう(注: コメントで /run/initialize の前ではGenericIonができていないので使えませんと教えてもらいました)。解決策は見つからなかったので、
void PrimaryGenerator::GeneratePrimaries(G4Event* anEvent) { G4ParticleDefinition* particle = G4IonTable::GetIonTable()->GetIon(90, 232); fpParticleGun->SetParticleDefinition(particle); fpParticleGun->SetParticleEnergy(250*A * MeV); //方向の設定など fpParticleGun->GeneratePrimaryVertex(anEvent); }
GeneratePrimaries内で作ってやるとエラーは出なかった。
Physicsが正しいかどうかは別にして、Geant4は重イオンも扱える(ターゲットが重い原子核だと反応して出てくるし)ので、Primaryに出来ないはずはないが、手元のコードではPrimaryGeneratorでは作れなかった。
正しい重イオンビームの作り方を知っている人はこっそり教えて下さい。(注: このやり方で正しいらしいです)