首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Geant4 4/GATE模拟校准较小源的输出(输出因子)

用Geant4 4/GATE模拟校准较小源的输出(输出因子)
EN

Stack Overflow用户
提问于 2022-02-16 18:24:34
回答 1查看 77关注 0票数 3

我使用栅极(它使用Geant4)对剂量输出进行MC研究。我使用圆柱形钴源在80厘米的SAD中测量水模中的PDD,剂量在10厘米的深度。

现在我想模拟一个较小的源(例如,r/2和h/2),并比较10厘米深度的剂量输出。除了几何,我看到我可以控制粒子的数量和时间的模拟。更改这两个参数以模拟较小来源的较低输出的最佳方法是什么?或者,是否还有其他参数可以更改以模拟较小的源?我试图计算较小的源w.r.t的输出因子。原来的来源。

EN

回答 1

Stack Overflow用户

发布于 2022-02-17 16:31:44

不确定它是否有用,这是带有Co60的柱面源

代码语言:javascript
复制
Source::Source():
    _particleGun{nullptr},
    _sourceMessenger{nullptr},
    _radius{-1.0},
    _halfz{-1.0},
    _nof_particles{10}
{
    _particleGun = new G4ParticleGun( 1 );

    G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
    G4String particleName = "gamma"; // "geantino"
    _particleGun->SetParticleDefinition(particleTable->FindParticle(particleName));

    _particleGun->SetParticlePosition(G4ThreeVector(0., 0., 0.));
    _particleGun->SetParticleMomentumDirection(G4ThreeVector(0., 0., 1.));
    _particleGun->SetParticleEnergy(1000.0*MeV);

    _sourceMessenger = new SourceMessenger(this);
}


Source::~Source()
{
    delete _particleGun;
    delete _sourceMessenger;
}


troika Source::sample_direction()
{
    double phi   = 2.0 * M_PI * G4UniformRand();

    double cos_z = 2.0 * G4UniformRand() - 1.0;
    double sin_z = sqrt( (1.0 - cos_z) * (1.0 + cos_z) );

    return troika{ sin_z * cos(phi), sin_z * sin(phi), cos_z };
}


double Source::sample_energy()
{
    return (G4UniformRand() < P_lo) ? E_lo : E_hi;
}


void Source::GeneratePrimaries(G4Event* anEvent)
{
    for(int k = 0; k != _nof_particles; ++k) // we generate _nof_particles at once
    {
        // here we sample spatial decay vertex uniformly in the cylinder
        double z   = _halfz * ( 2.0*G4UniformRand() - 1.0 );
        double phi = 2.0 * M_PI * G4UniformRand();
        double r   = _radius * sqrt(G4UniformRand());

        auto x = r * cos(phi);
        auto y = r * sin(phi);
        _particleGun->SetParticlePosition(G4ThreeVector(x, y, z));

        // now uniform-on-the-sphere direction
        auto dir = sample_direction();
        _particleGun->SetParticleMomentumDirection(G4ThreeVector(dir._wx, dir._wy, dir._wz));

        // energy 50/50 1.17 or 1.33
        auto e = sample_energy();
        _particleGun->SetParticleEnergy(e);

        // all together in a vertex
        _particleGun->GeneratePrimaryVertex(anEvent);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71147347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档