专栏首页人芳觅Geant4-怎样设置你的粒子源--精简注释+收藏版

Geant4-怎样设置你的粒子源--精简注释+收藏版

一个通用的粒子发生函数源文件,即MYPrimaryGeneratorAction.cc大致就是本文的全部了。同现实场景相符,你需要知道每个发射的模拟粒子的特点,即出射点在哪、发射方向、粒子类型、能量大小等参数。

给大家上个G4论坛帖子,我们G4模拟中的很多问题,该论坛几乎都会有人提问回答的。

http://hypernews.slac.stanford.edu/HyperNews/geant4/get/eventtrackmanage/13.html?inline=-1

#include "MYPrimaryGeneratorAction.hh"
#include "Randomize.hh"
#include "G4Event.hh"
#include "G4ParticleGun.hh"
#include "G4GeneralParticleSource.hh"
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"
#include "G4SystemOfUnits.hh"
#include "G4RunManager.hh"
#include "G4Run.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 
MYPrimaryGeneratorAction::MYPrimaryGeneratorAction()
{G4int n_particle = 1;
//particleGun = new G4GeneralParticleSource();
particleGun = new G4ParticleGun(n_particle); 
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
G4ParticleDefinition* particle = particleTable->FindParticle("opticalphoton");
//G4ParticleDefinition* particle = particleTable->FindParticle("gamma");
//我们找G4中现成的粒子源
particleGun->SetParticleDefinition(particle);
particleGun->SetParticleTime(0.0*ns);
//particleGun->SetParticlePosition(G4ThreeVector(-1*mm,1*mm,-1*mm));
// particleGun->SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.));
particleGun->SetParticleEnergy(3.*eV);
//particleGun->SetParticlePolarization(G4ThreeVector(1,0,0));
//particleGun->SetParticleEnergy(60*keV);
//我们可以在初始化这个源文件时,就设置好particleGun的默认值。
}
MYPrimaryGeneratorAction::~MYPrimaryGeneratorAction()
{
  delete particleGun;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void MYPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
{
const G4Run *nowrun=G4RunManager::GetRunManager()->GetCurrentRun();
G4int runid=nowrun->GetRunID();
// 在程序的任意cc源文件中,均可调用G4RunManager,在这个例子中,我们想得到当前RUN的RunID,即如果我在mac执行文件中,/run/beamOn 100 重复写了3次,表示有3个RUN,RunID分别是0,1,2。
G4int posx,posy,posz;
posx=int(floor(runid/64));
posy=int(floor((runid%64)/8));
posz=int(floor((runid%64)%8));
particleGun->SetParticlePosition(G4ThreeVector((posx-3.5)*3.2*mm,(posy-3.5)*3.2*mm,(posz-3.5)*3.2*mm));
//我们想依据不同的RUN依次设置放射源的不同位置。这样子处理,我就不必每跑一次RUN改一次放射源位置了,比较灵活。这其中很多的Set***成员函数,GPS是没有的(或许有但是还没找到),ParticleGun更灵活,而GPS在mac文件中更机智,看个人选择。
G4double rndmCosTheta,rndmTheta,rndmPhi,rndmLambda,px,py,pz,pol_x,pol_y,pol_z;
      rndmCosTheta = G4UniformRand()*2-1;
      rndmTheta = acos(rndmCosTheta);
      rndmPhi = G4UniformRand()*(2*M_PI);
      rndmLambda = G4UniformRand()*(2*M_PI);
      // Momentum direction (random)
      px=sin(rndmTheta)*cos(rndmPhi);
      py=sin(rndmTheta)*sin(rndmPhi);
      pz=cos(rndmTheta); particleGun->SetParticleMomentumDirection(G4ThreeVector(px,py,pz));
//我们定义一个动量方向矢量,随机为一个球面源,在此特别感谢唐光毅博后的数学指导。
      // Polarization direction (random)
      pol_x=cos(rndmLambda)*cos(rndmTheta)*cos(rndmPhi)-sin(rndmLambda)*sin(rndmPhi);
      pol_y=cos(rndmLambda)*cos(rndmTheta)*sin(rndmPhi)+ sin(rndmLambda)*cos(rndmPhi);
      pol_z= - cos(rndmLambda)*sin(rndmTheta);
      particleGun->SetParticlePolarization(G4ThreeVector(pol_x,pol_y,pol_z));
//定义光学光子的极化角,这个我现在还不懂,不知道到底有啥用,可能是考虑光子的偏振吧。
particleGun->GeneratePrimaryVertex(anEvent);
// GeneratePrimaryVertex(anEvent) 这函数运行的瞬间,就会产生一个模拟粒子,写两遍就可以发射两次,你也可以借此机智的设置为一个双源或者多源。
//G4cout<<"run ID is "<<runid<<G4endl;
//用好这个简单的G4cout,你的G4程序代入感和自主学习能力将会增强很多很多倍。哪里不懂就试试万能的G4cout吧。
}

喜欢的话,分享一下吧~^o^~

本文分享自微信公众号 - 人芳觅(lililiangzuozuo),作者:梁佐佐

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 回答某一个同学Geant4问题;建立了一个Geant4群聊,欢迎大家来踩

    要想熟练得使用Geant4,C++的基本知识是要掌握的,其学习参考教材可任意选,刚入门的同学推荐比较薄的谭浩强版本《C++面向对象程序设计》,网上资源也丰富,比...

    梁佐佐
  • 3D建模(Blender)+实例演示透明材质和5毛光晕特效

    不知道为什么,明明只想安安静静的科研(搬铅砖,一块22斤)。却发现自己,不会P图是不行的,毕竟你总想在自己的PPT里面突出点什么;不会视频剪辑、不会Gif动图,...

    梁佐佐
  • Geant4--G4ParticleGun定义射线源的发射能谱

    “ G4ParticleGun作为Geant4模拟中常用的粒子产生器,本文代码讲解怎样模拟发射符合自定义能量分布的粒子。”

    梁佐佐
  • linux设置目录权限命令

    sudo chmod 600 ××× (只有所有者有读和写的权限) sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限) ...

    NateHuang
  • 关于双主的一些说明【91洲际哥的笔记】

    A上同步到B,B上写,就会报duplicate,这还比较好,至少两边数据还是一致的

    二狗不要跑
  • python 高度鲁棒性爬虫的超时控制问题

    爬虫这类型程序典型特征是意外多,无法确保每次请求都是稳定的返回统一的结果,要提高鲁棒性,能对错误数据or超时or程序死锁等都能进行处理,才能确保程序几个月不停止...

    十四君
  • 什么是队列?

    与前面提到的数据结构相同,队列中的数据也呈线性排列。虽然与栈有些相似,但队列中添加和删除数据的操作分别是在两端进行的,就和队列这个名字一样,把它想象成排成一队的...

    武培轩
  • Css 实现多行文字截断

    看似十分简单的标题截断效果,但是竟然没有一个统一 CSS 属性实现标准,需要用到一些奇淫妙计来实现,一般来说,在做这样文字截断效果时我们更多是希望:

    grain先森
  • 深度学习三巨头齐聚AI「名人堂」,Bengio、Lecun「补选」2020 AAAI Felllow(附完整名单)

    AAAI(Association for the Advancement of Artificial Intelligence)是国际人工智能领域最权威的学术组...

    机器之心
  • 通过扩展让ASP.NET Web API支持W3C的CORS规范

    让ASP.NET Web API支持JSONP和W3C的CORS规范是解决“跨域资源共享”的两种途径,在《通过扩展让ASP.NET Web API支持JSONP...

    蒋金楠

扫码关注云+社区

领取腾讯云代金券