Geant4 程序编写中的常用代码

合集下载

Geant4基础知识

Geant4基础知识

Geant4基础知识G4模拟粒子过程:建立一次模拟,在G4 中称为一次Run;Run 建立后,需要对几何结构、物理过程进行初始化;初始化完成后就开始模拟过程了,首先发射一个粒子。

在G4 中,发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次Event 。

而每次发射的初始粒子则有粒子发射器进行控制。

而在每一个event 过程中,粒子与材料反应后会可能生成多个次级粒子,每个粒子都会有一条径迹,称之为track ;而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为step 。

G4模拟的基本算法:A Run Start -> 初始化物理模型/ 几何模型-> An Event Start -> 调用粒子发射器发射粒子-> A Track Start-> A Step Start-> A Step End-> Next Step Start- > ,,-> All Step End-> A Track End-> Next Track Start-> ,,-> All Track End-> An Event End -> Next Event Start- > ,,-> All Event End(All Primaries Shot) -> A Run End -> Next Run Start- > ,,1) main() 中应该包括的内容Geant4 是一个探测器模拟工具, 但它对于某个特定的模拟程序没有固定的main() 函数, 用户在建立模拟程序的过程中需要提供自己的main() 函数. 一个最基本的main() 函数需要包括以下几个方面:G4RunManager( 模拟整个过程)G4VUserDetectorConstruction( 定义探测器材料, 几何形状, 灵敏区和读出方案)G4VUserPhysicsList( 定义粒子种类和物理过程, 还有截断参数)G4VUserPrimaryGeneratorAction( 定义了源粒子的种类, 能量, 出射方向等)一个最简单的main() 函数如下:#include "G4RunManager.hh"#include "G4UImanager.hh"#include "ExN01DetectorConstruction.hh"#include "ExN01PhysicsList.hh"#include "ExN01PrimaryGeneratorAction.hh"int main(){// Construct the default run managerG4RunManager* runManager = new G4RunManager;// set mandatory initialization classesrunManager->SetUserInitialization(new ExN01DetectorConstruction); runManager->SetUserInitialization(new ExN01PhysicsList);// set mandatory user action classrunManager->SetUserAction(new ExN01PrimaryGeneratorAction);// Initialize G4 kernelrunManager->Initialize();// get the pointer to the UI manager and set verbositiesG4UImanager* UI = G4UImanager::GetUIpointer();UI->ApplyCommand("/run/verbose 1");UI->ApplyCommand("/event/verbose 1");UI->ApplyCommand("/tracking/verbose 1");// start a runint numberOfEvent = 3;runManager->BeamOn(numberOfEvent);// job terminationdelete runManager;return 0;}main() 首先生成一个G4RunManager类,这个类是在主程序中用以初始化模拟信息,用来连接子程序,连接方式是通过Set 函数来完成。

Geant4基础知识

Geant4基础知识

Geant4基础知识G4模拟粒子过程:建立一次模拟,在 G4 中称为一次Run;Run 建立后,需要对几何结构、物理过程进行初始化;初始化完成后就开始模拟过程了,首先发射一个粒子。

在G4 中,发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次 Event。

而每次发射的初始粒子则有粒子发射器进行控制。

而在每一个event过程中,粒子与材料反应后会可能生成多个次级粒子,每个粒子都会有一条径迹,称之为 track;而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为step。

G4模拟的基本算法:A Run Start -> 初始化物理模型/几何模型-> An Event Start -> 调用粒子发射器发射粒子-> A Track Start-> A Step Start-> A Step End-> Next Step Start-> ……-> All Step End-> A Track End-> Next Track Start-> ……-> All Track End-> An Event End -> Next Event Start-> ……-> All Event End(All Primaries Shot) -> A Run End -> Next Run Start-> ……1) main()中应该包括的内容Geant4是一个探测器模拟工具, 但它对于某个特定的模拟程序没有固定的main()函数, 用户在建立模拟程序的过程中需要提供自己的main()函数. 一个最基本的main()函数需要包括以下几个方面:G4RunManager(模拟整个过程)G4VUserDetectorConstruction(定义探测器材料, 几何形状, 灵敏区和读出方案)G4VUserPhysicsList(定义粒子种类和物理过程, 还有截断参数)G4VUserPrimaryGeneratorAction(定义了源粒子的种类, 能量, 出射方向等)一个最简单的main()函数如下:#include "G4RunManager.hh"#include "G4UImanager.hh"#include "ExN01DetectorConstruction.hh"#include "ExN01PhysicsList.hh"#include "ExN01PrimaryGeneratorAction.hh"int main(){// Construct the default run managerG4RunManager* runManager = new G4RunManager;// set mandatory initialization classesrunManager->SetUserInitialization(new ExN01DetectorConstruction);runManager->SetUserInitialization(new ExN01PhysicsList);// set mandatory user action classrunManager->SetUserAction(new ExN01PrimaryGeneratorAction);// Initialize G4 kernelrunManager->Initialize();// get the pointer to the UI manager and set verbositiesG4UImanager* UI = G4UImanager::GetUIpointer();UI->ApplyCommand("/run/verbose 1");UI->ApplyCommand("/event/verbose 1");UI->ApplyCommand("/tracking/verbose 1");// start a runint numberOfEvent = 3;runManager->BeamOn(numberOfEvent); // job terminationdelete runManager;return 0;}main()首先生成一个 G4RunManager类,这个类是在主程序中用以初始化模拟信息,用来连接子程序,连接方式是通过 Set函数来完成。

.g4代码编程详解

.g4代码编程详解

G4代码编程详解G4 (ANTLR4 Grammar) 是一种语法规则定义语言,用于构建解析器和词法分析器。

它是由ANTLR (Another Tool for Language Recognition) 工具生成的。

ANTLR 是一个流行的语言识别工具,可用于创建用于解析和处理各种语言的解析器。

使用G4 编程可以让你定义自己的语法规则,并根据这些规则生成解析器和词法分析器。

这些解析器和词法分析器可以用来分析和处理符合你定义的语法规则的输入文本。

下面是一个简单的示例来说明如何使用G4 编写语法规则:```grammar MyGrammar;// 词法规则INT: [0-9]+;ID: [a-zA-Z]+;// 语法规则expression: INT '+' INT| INT '-' INT| ID;```以上是一个简单的计算器语法的示例。

其中,`INT` 是一个表示整数的词法规则,`ID` 是一个表示标识符的词法规则。

`expression` 是一个语法规则,它定义了三种可能的表达式:两个整数相加、两个整数相减,或者一个标识符。

在这个示例中,`INT` 和`ID` 是终结符,表示输入文本中的具体字符。

而`expression` 是非终结符,表示一个语法规则的组合。

非终结符可以由终结符和其他非终结符组成。

一旦你定义了你的G4 语法规则,你可以使用ANTLR工具生成相应的解析器和词法分析器的代码。

ANTLR会根据你的语法规则自动生成解析器和词法分析器的代码,你可以在自己的程序中使用这些代码进行文本分析和处理。

这只是一个简单的示例来介绍G4的基本概念。

G4支持更复杂的语法规则和语言特性,包括重复、选项、语义动作等。

如果你对G4感兴趣,我建议你查阅官方的ANTLR文档,其中包含了更详细的G4语法规则和示例。

Geant4程序编写中的常用代码

Geant4程序编写中的常用代码
{
public:
MyDataRecorder(G4double e1,G4double e2, G4int num,G4int numberofevent);
MyDataRecorder(G4int numberofevent);
}
for(int i=0;i<NCHN;i++)
{
MyData.push_back(0);
TData.push_back(0);
rerr.push_back(0);
sumD2.push_back(0);
<< (E1+i*dE)/MeV << " \t "
<< std::setprecision(5)
<< MyData[i]/NPS/factor << " \t "
<< std::fixed
<< std::setprecision(4)
TData[i]=0;
}
}
}
//cnscott的博客 void MyDataRecorder::OutputFile(G4String FileName)
{
CalErr();
while(true)
TData.clear();
rerr.clear();
sumD2.clear();
//G4cout << "~MyDataRecorder=2" << G4endl;
}
//Record tally data(multi-channel).

Geant4基础知识

Geant4基础知识

Geant4基础知识G4模拟粒子过程:建立一次模拟,在G4 中称为一次Run;Run 建立后,需要对几何结构、物理过程进行初始化;初始化完成后就开始模拟过程了,首先发射一个粒子。

在G4 中,发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次Event。

而每次发射的初始粒子则有粒子发射器进行控制。

而在每一个event过程中,粒子与材料反应后会可能生成多个次级粒子,每个粒子都会有一条径迹,称之为track;而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为step。

G4模拟的基本算法:A Run Start -> 初始化物理模型/几何模型-> An Event Start -> 调用粒子发射器发射粒子-> A Track Start-> A Step Start-> A Step End-> Next Step Start-> ……-> All Step End-> A Track End-> Next Track Start-> ……-> All Track End-> An Event End -> Next Event Start-> ……-> All Event End(All Primaries Shot) -> A Run End -> Next Run Start-> ……1) main()中应该包括的内容Geant4是一个探测器模拟工具, 但它对于某个特定的模拟程序没有固定的main()函数, 用户在建立模拟程序的过程中需要提供自己的main()函数. 一个最基本的main()函数需要包括以下几个方面:G4RunManager(模拟整个过程)G4VUserDetectorConstruction(定义探测器材料, 几何形状, 灵敏区和读出方案)G4VUserPhysicsList(定义粒子种类和物理过程, 还有截断参数)G4VUserPrimaryGeneratorAction(定义了源粒子的种类, 能量, 出射方向等)一个最简单的main()函数如下:#include ""#include ""#include ""#include ""#include ""int main(){Geant4的类结构Geant4程序代码是根据这个类结构建立起来的, 类结构如下图所示. 下面就是Geant4中每个类的简单说明.1) Run 和Event这些类与模拟事件相关, 产生次级粒子, 为粒子径迹模拟器提供粒子.2) Tracking 和Track根据粒子在探测器材料中的物理过程模拟粒子运行的轨迹, 给出粒子特定时间段在空间的位置, 或者粒子空间时间的分布.3) Geometry, Magnetic Field 和CAD-Interface这三个类就是用来描述探测器几何结构和探测器中电磁场的分布. 为了使探测器几何结构可以在CAD系统中进行修改, Geant4的几何体模型完全与ISO STEP标准一致. 将来Geant4中几何结构的设计将从程序设计中独立出来. 面向对象设计的方法可以让用户在不影响程序其他部分的同时改变几何参数和场. 4) Particle Definition 和Matter这两个类用于定义粒子和探测器材料.5) Physics它提供了粒子与探测器材料相互作用时所发生物理过程的模型, 允许用户为每次反应或每个反应道添加物理模型. 用户根据粒子的种类, 探测器材料和能量范围选择不同的物理模型. Geant4有电磁物理过程和强子物理过程模型, 同时也提供了散射截面数据库.6) Hits 和Digitization这个两个类用于对用户定义的灵敏区内的响应进行采样和分析.7) Visualization它显示了探测器几何形状, 粒子轨迹和碰撞过程. 由于采用了面向对象设计技术来设计可视化部分, 这允许用户独立开发可视化工具, 如: OpenGL 和OpenInventor(为X11和Windows设计), DAWN, Postscript(via DAWN)和VRML.8) Interfaces支持可视化用户界面以及和外加程序的交流(OODBMS, reconstruction等).①User Verbose output class,定义了一个verbosity 变量;②Run manager,定义了一个运行管理器runManager;③User Initialization class es (mandatory),设置两个强制类ExN02DetectorConstruction 和ExN02PhysicsList;④User Action classes,设置用户干涉类ExN02PrimaryGeneratorAction、ExN02RunAction、ExN02EventAction和ExN02SteppingAction;⑤Initialize G4 kernel,“runManager->Initialize()”,初始化GEANT4 内核。

Geant4 程序编写中的常用代码

Geant4 程序编写中的常用代码

Geant4 程序编写中的常用代码2010-06-01 20:51:44| 分类:学习与工作| 标签:geant4 |字号订阅系个人原创,未经同意请勿转载。

cnscott的博客1.各种常用源粒子的产生cnscott的博客G4ParticleTable* particleT able = G4ParticleTable::GetParticleT able();∙光子:G4ParticleDefinition* particle= particleTable->FindParticle("gamma");∙中子:G4ParticleDefinition* particle= particleTable->FindParticle("neutron");∙电子:G4ParticleDefinition* particle= particleTable->FindParticle("e-");∙Alpha:G4ParticleDefinition* particle= particleTable->FindParticle("alpha");∙质子:G4ParticleDefinition* particle= particleTable->FindParticle("proton");∙离子:G4ParticleDefinition* particle= particleTable->GetIon(6, 12, 0.0); //原子序数,质量数和激发能量(基态12C)源粒子的能量、位置、方向、电荷等相关信息要在ParticleGun中设置。

2.获取日期,记录程序开始运行的时刻cnscott的博客#include "time.h"#include "stdio.h"struct tm *ptr;time_t lt;lt =time(NULL);ptr=gmtime(&lt);printf(asctime(ptr)); //格林威治时间printf(ctime(&lt)); //本地时间3.记录程序运行所用时间cnscott的博客#include "G4Timer.hh"G4Timer myTimer;myTimer.Start();myTimer.Stop();G4cout << myTimer << G4endl;4.保存文件cnscott的博客#include <fstream>fstream dataFile(FileName, ios::out); //文件输出流G4String mydata=”Save my data.”;dataFile << mydata << G4endl; //数据可以是整数、浮点数或是字符串等。

Geant4程序的一点技巧总结

Geant4程序的一点技巧总结

Geant4程序的一点技巧总结Geant4程序的一点技巧总结1.使用IDE使用G4如果能有一个带代码提示功能的IDE,写程序的效率会高不少。

在Linux下,轻量级的IDE有Codelite、code::blocks等,重量一点的IDE如Eclipse和QtCreator这些。

我用过Codelite,后来改成Eclipse,配置方法大致相同,我在前面的Blog里写过。

QtCreator的配置可以参考cnscott的博客()。

我一直很建议学G4的朋友可以看看他写的一些东西,挺有用的。

2.自动配置G4环境因为G4要求每次运行G4编写的程序前都要手工配置G4WORKDIR变量和执行env.sh 配置其他环境变量。

有没办法省去这个步骤呢,办法是有的,我的方法如下:在用户目录下面建一个名叫g4env的文件,把下面的内容写进去:1export G4WORKDIR=$HOME/Geant4/g4work2export LD_LIBRARY_PATH=$HOME/Geant4/clhep/lib/:$LD_LIBRARY_PATH3exportLD_LIBRARY_PATH=$HOME/Geant4/geant4/geant4.9.3/lib/Linux-g++/:$LD_LIBRARY_PATH 4source$HOME/Geant4/geant4/geant4.9.3/env.sh保存,并将这个文件权限用chmod命令设成可执行。

然后在用户的.bashrc文件的末尾添上一行:5source~/g4env>~/.g4envsetting这样每次打开控制台就自动加载g4env脚本,并且把输出的内容存到一个隐藏的临时文件里。

不用每次输入这么多东西了,而且也不会在开启控制台时候显示一堆东西。

3.自定义常用的命令使用Linux的别名功能定义一些常用的“G4命令”,把这些想定义的命令写到上面提到的g4env文件后面,就可以在以后开启控制台直接用了。

geant4基础学习知识

geant4基础学习知识

Geant4基础知识G4模拟粒子过程:建立一次模拟,在G4 中称为一次Run;Run 建立后,需要对几何结构、物理过程进行初始化;初始化完成后就开始模拟过程了,首先发射一个粒子。

在G4 中,发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次Event。

而每次发射的初始粒子则有粒子发射器进行控制。

而在每一个event过程中,粒子与材料反应后会可能生成多个次级粒子,每个粒子都会有一条径迹,称之为track;而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为step。

G4模拟的基本算法:A Run Start -> 初始化物理模型/几何模型-> An Event Start -> 调用粒子发射器发射粒子-> A Track Start-> A Step Start-> A Step End-> Next Step Start-> ……-> All Step End-> A Track End-> Next Track Start-> ……-> All Track End-> An Event End -> Next Event Start-> ……-> All Event End(All Primaries Shot) -> A Run End -> Next Run Start -> ……1) main()中应该包括的内容Geant4是一个探测器模拟工具, 但它对于某个特定的模拟程序没有固定的main()函数, 用户在建立模拟程序的过程中需要提供自己的main()函数. 一个最基本的main()函数需要包括以下几个方面:G4RunManager(模拟整个过程)G4VUserDetectorConstruction(定义探测器材料, 几何形状, 灵敏区和读出方案)G4VUserPhysicsList(定义粒子种类和物理过程, 还有截断参数)G4VUserPrimaryGeneratorAction(定义了源粒子的种类, 能量, 出射方向等)一个最简单的main()函数如下:#include "G4RunManager.hh"#include "G4UImanager.hh"#include "ExN01DetectorConstruction.hh"#include "ExN01PhysicsList.hh"#include "ExN01PrimaryGeneratorAction.hh"int main(){// Construct the default run managerG4RunManager* runManager = new G4RunManager;// set mandatory initialization classesrunManager->SetUserInitialization(newExN01DetectorConstruction);runManager->SetUserInitialization(new ExN01PhysicsList);// set mandatory user action classrunManager->SetUserAction(new ExN01PrimaryGeneratorAction);// Initialize G4 kernelrunManager->Initialize();// get the pointer to the UI manager and set verbositiesG4UImanager* UI = G4UImanager::GetUIpointer();UI->ApplyCommand("/run/verbose 1");UI->ApplyCommand("/event/verbose 1");UI->ApplyCommand("/tracking/verbose 1");// start a runint numberOfEvent = 3;runManager->BeamOn(numberOfEvent);// job terminationdelete runManager;return 0;}main()首先生成一个G4RunManager类,这个类是在主程序中用以初始化模拟信息,用来连接子程序,连接方式是通过Set函数来完成。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Geant4 程序编写中的常用代码2010-06-01 20:51:44| 分类:学习与工作| 标签:geant4|字号订阅系个人原创,未经同意请勿转载。

1.各种常用源粒子的产生G4ParticleTable* particleT able = G4ParticleTable::GetParticleT able();•光子:G4ParticleDefinition* particle= particleTable->FindParticle("gamma");•中子:G4ParticleDefinition* particle= particleTable->FindParticle("neutron");•电子:G4ParticleDefinition* particle= particleTable->FindParticle("e-");•Alpha:G4ParticleDefinition* particle= particleTable->FindParticle("alpha");•质子:G4ParticleDefinition* particle= particleTable->FindParticle("proton");•离子:G4ParticleDefinition* particle= particleTable->GetIon(6, 12, 0.0); //原子序数,质量数和激发能量(基态12C)源粒子的能量、位置、方向、电荷等相关信息要在ParticleGun中设置。

2.获取日期,记录程序开始运行的时刻#include "time.h"#include "stdio.h"struct tm *ptr;time_t lt;lt =time(NULL);ptr=gmtime(&lt);printf(asctime(ptr)); //格林威治时间printf(ctime(&lt)); //本地时间3.记录程序运行所用时间#include "G4Timer.hh"G4Timer myTimer;myTimer.Start();myTimer.Stop();G4cout << myTimer << G4endl;4.保存文件#include <fstream>fstream dataFile(FileName, ios::out); //文件输出流G4String mydata=”Save my data.”;dataFile << mydata << G4endl; //数据可以是整数、浮点数或是字符串等。

5. 检查几何体是否重叠G4PVPlacement和G4PVParameterised提供了成员函数:G4bool CheckOverlaps(G4int res=1000, G4double tol=0., G4bool verbose=true)//当返回值为true时,表明几何存在重叠。

6.获取相关类的指针G4RunManager* runManager= G4RunManager::GetRunManager();(MyRunAction *)runManager->GetUserRunAction();(MyEventAction *)runManager->GetUserEventAction();(MyStackingAction *)runManager->GetUserStackingAction();(MySteppingAction *)runManager->GetUserSteppingAction();(MyTrackingAction *)runManager->GetUserTrackingAction();G4Run* run = G4RunManager::GetRunManager()->GetCurrentRun();G4Event* event = G4RunManager::GetRunManager()->GetCurrentEvent();//版本号G4String version = G4RunManager::GetRunManager()->GetVersionString()7.随机数操作Geant4的随机数产生主要是使用CLHEP函数库。

http://proj-clhep.web.cern.ch/proj-clhep/manual/UserGuide/Random/Random.htmlCLHEP::HepRandom::setTheEngine(HepRandomEngine *theNewEngine); //设置随机数引擎,默认引擎为CLHEP::HepJamesRandom。

其他可选的引擎包括:CLHEP::DRand48Engine, CLHEP::DualRand, CLHEP::Hurd160Engine,CLHEP::Hurd288Engine, CLHEP::MTwistEngine, CLHEP::NonRandomEngine, CLHEP::RandEngine, CLHEP::RanecuEngine, CLHEP::Ranlux64Engine,CLHEP::RanluxEngine, CLHEP::RanshiEngine, and CLHEP::TripleRand.CLHEP::HepRandom::setTheSeed(long seed, int lux=3); //为默认引擎设置随机数种子,其他引擎可能使用不同函数G4UniformRand();//产生均匀分布随机数,等同于CLHEP::HepRandom::getTheEngine()->flat();G4RandGauss::shoot(double mean, double stdDev);//产生高斯分布随机数,等同于CLHEP::RandGaussQ::shoot(double mean, double stdDev);8.从G4Step中读取有用的信息void MySteppingAction::UserSteppingAction(const G4Step* stp){G4Track* theTrack = stp->GetTrack(); //获取G4Track指针theTrack->GetVolume()->GetName(); //获取当前几何体(PhysicalVolume)名称G4StepPoint* preStepPoint = stp->GetPreStepPoint();G4StepPoint* postStepPoint = stp->GetPostStepPoint(); //获取两个StepPoint的指针if (preStepPoint->GetStepStatus() == fGeomBoundary) //判断是否位于几何体边界std::cout << "Step starts on geometry boundary" << std::endl;if (postStepPoint->GetStepStatus() == fGeomBoundary) //判断是否位于几何体边界std::cout << "Step ends on geometry boundary" << std::endlif (theTrack->GetTrackID() == 1) //判断是否是初级粒子(初级粒子TrackID=1)std::cout << "Particle is a primary " << std::endl;if (theTrack->GetParentID() == 1) //判断当前粒子是否由初级粒子产生std::cout << "Parent was a primary " << std::endl;G4VProcess* creatorProcess= track->GetCreatorProcess();G4cout << creatorProcess->GetProcessName() << std::endl; //获取产生当前粒子的物理过程名称G4TouchableHandle theT ouchable = preStepPoint->GetTouchableHandle(); theTouchable->GetCopyNumber(); //当前几何体的Copy NumbertheTouchable->GetCopyNumber(1); //当前几何体母体的Copy NumbertheTouchable->GetCopyNumber(2); //当前几何体母体的母体的Copy Number,以此类推,前提是该母体是存在的,否则可能抛出异常}===========================================================================PS:自己写的一个按照MCNP格式来存储数据的类:使用方法://新建计数,能量上下限为Emin和Emax,中间插入n个能量值,总共的源粒子个数为numberofevent(G4Run的GetNumberOfEventToBeProcessed 函数可以获得该值,亦可手动输入对应的常数值)。

MyDataRecorder *pMDRCurrent = new MyDataRecorder(Emin, Emax, n, numberofevent);pMDRCurrent ->AddData(Energy,Weight); //多道计数//每个源粒子事件之后,在EndOfEventAction函数中更新数据,用于方差计算。

pMDRCurrent->UpdateThisEvent();//设置相关的参数并输出到文件pMDRFluence->SetMessage("your message"); //向文件中加入一个说明信息pMDRFluence->SetFactor(fac); //将数据除以一个因子,比如面积、体积等等。

相关文档
最新文档