粒子生成したい(G4VUserPrimaryGeneratorAction

一次粒子(入射粒子)を定義するクラスは、必須クラスのひとつで、 G4VUserPrimaryGeneratorActionクラスを継承して作成します。

親クラス

1G4VUserPrimaryGeneratorAction();
2virtual ~G4VUserPrimaryGeneratorAction() = default;
3virtual void GeneratePrimaries(G4Event *aEvent) = 0;

親クラスのメンバー関数を抜粋しました。 コンストラクターとデストラクターは、この設定を引き継げばよさそうです。 GeneratePrimaries()は、イベントの一次粒子を設定するための関数です。 純粋仮想関数になっているため、自作クラスでoverrideが必要です。

PrimaryGeneratorクラス

クラス名をPrimaryGeneratorとしました。

 1// //////////////////////////////////////////////////
 2// include/PrimaryGenerator.hh
 3// //////////////////////////////////////////////////
 4
 5#ifndef PrimaryGenerator_h
 6#define PrimaryGenerator_h 1
 7
 8#include "G4VUserPrimaryGeneratorAction.hh"
 9
10namespace ToyMC
11{
12
13class PrimaryGenerator : public G4VUserPrimaryGeneratorAction
14{
15    public:
16        PrimaryGenerator() = default;
17        ~PrimaryGenerator() = default;
18
19        void GeneratePrimaries(G4Event *aEvent) override;
20};
21
22}; // namespace ToyMC
23
24#endif

GeneratePrimaries

 1void PrimaryGenerator::GeneratePrimaries(G4Event *aEvent)
 2{
 3    // 入射粒子の数を設定
 4    G4int n_particles = 1;
 5    G4ParticleGun *gun = new G4ParticleGun(n_particles);
 6
 7    // 入射粒子の種類を設定
 8    auto table = G4ParticleTable::GetParticleTable();
 9    auto particle = table->FindParticle("mu-");
10    gun->SetParticleDefinition(particle);
11
12    // 入射粒子の座標を設定
13    G4ThreeVector xyz{0., 0., 0.};
14    gun->SetParticlePosition{xyz};
15
16    // 入射粒子の方向を設定
17    G4ThreeVector direction{0., 0., 1.};
18    gun->SetParticleMomentumDirection(direction);
19
20    // 入射粒子のエネルギーを設定
21    G4double energy{1. * GeV};
22    gun->SetParticleEnergy(energy);
23
24    // イベントに追加
25    gun->GeneratePrimaryVertex(aEvent);
26}

G4ParticleGunを使ってミューオンを入射しています。 G4ParticleGunはGeant4標準の粒子生成クラスのひとつです。