物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Geant4で重イオンをPrimaryGeneratorで入射する

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では作れなかった。

正しい重イオンビームの作り方を知っている人はこっそり教えて下さい。(注: このやり方で正しいらしいです)