Geant4的安装和入门
引言
Geant4是由CERN(欧洲核子研究委员会)开发的蒙特卡罗应用软件包, 主要用于模拟高能粒子在探测器中输运的物理过程. 它采用面向对象的C++语言编写, 可以构造复杂的探测器几何结构,定制感兴趣的粒子与物理过程模型, 并且能够跟踪粒子的过程, 显示粒子径迹, 处理在输运过程中产生的大量数据.
一. Geant4的发展
Geant4最初的发展可以追溯到CERN(European Organization for Nuclear Research)和K EK(High Energy Accelerator Research Organization Japan)在1993年的两个研究,他们都是研究如何在Geant3程序中使用现代化的计算技术。最后CERN DRDC(Detector Research and Development Committee)听取了他们的建议,组织了来自欧洲、俄罗斯、加拿大、日本和美国的几十个实验室、学校和研究所的超过100位科学家和工程师进行了合作,基于C++语言,利用面向对象设计技术对已有的模拟程序进行了重新构造。这项工程被称之为RD44,初步研究阶段在1998年12月完成,随后在1999年2月Geant4建立了起来,并且在不断的发展和完善的过程中得到了用户的支持和维护。
Geant4已经可以在多种常用操作系统下安装使用,如UNIX、Linux和Windows,需要注意的是在安装Geant4之前需要确定已经安装了相应的C++编译器。目前正在开发对在MacOs 系统下的使用版本。Geant4最新的版本是Geant4.6.2.p01,而且Geant4在不断升级的同时,科学家和工程师们也推出了很多基于Geant4,像MULASSIS(多层防护模拟工具)和GEMAT (Geant4微剂量学分析工具)的应用程序。通过无数人的共同努力,Geant4已经发展成为核物理和空间物理等许多学科方面研究不可或缺的蒙特卡罗模拟工具。
二. Geant4的安装
1. 程序代码的获得
Geant4是一个开放源代码的蒙特卡罗模拟程序, 用户可以自由的在http://www.cern.ch/geant4/download 网页中下载到Geant4源代码, 目前最新的版本是Geant4.7.0.p01. 该网页还提供了一个ftp地址, 从该地址可以下载到一个完整的Geant4的安装盘, 里面不仅包含了Geant4的在各种操作系统下的源代码, 还有各种用于分析Geant4运行结果的软件.
2. 系统要求
1) 操作系统
Linux (作者的Linux版本为Fedora2)
2) C++编译器
g++
Geant4可以在各种操作系统下安装, 例如Windows2000/XP, Linux, Sun等, 本文中仅介绍其在Linux操作系统下的安装, 因为它自带了C++编译器, 安装过程中可以省略C++编译器安装这个步骤.
3. 编译安装Geant4代码
1) 设置bash操作环境
从上面提供的网页上下载Geant4.7.0, (从该网页提供的ftp上的G4CD的中Geant4的版本是Geant4.6.4p01) 解压缩到/home/username/目录下. 把下面的代码拷贝到/home/username/.bash_profile(username 表示当前的用户名, 下同)文件中, 这样做之后, 在操作系统刚刚启动的时候就能对Geant4的运行环境进行设置.
///////////////////////////////////////////////////////////////////////////////
source /home/username/geant4.7.0/env/g4env
source /home/username/geant4.7.0/env/aidaenv
source /home/username/geant4.7.0/env/dawnenv
source /home/username/geant4.7.0/env/javaenv
source /home/username/geant4.7.0/env/wiredenv
///////////////////////////////////////////////////////////////////////////////
下面是g4env的代码.
///////////////////////////////////////////////////////////////////////////////
//g4env
#export G4SYSTEM=Linux-g++ (#表示注释该行, 下同)
export G4INSTALL=/home/username/geant4.7.0
export G4INCLUDE=/home/username/geant4.7.0/include
export G4LIB=/home/username/geant4.7.0/lib
export G4BIN=./
export G4LEVELGAMMADA TA=/home/username/geant4.7.0/data/PhotonEvaporation
export G4RADIOACTIVEDA TA=/home/username/geant4.7.0/data/RadiativeDecay
export G4LEDATA=/home/username/geant4.7.0/data/G4EMLOW2.3
export NeutronHPCrossSections=/home/username/geant4.7.0/data/G4NDL3.7
export G4ELASTICDATA=/home/username/geant4.7.0/data/Elastic
export CLHEP_BASE_DIR=/home/username/CLHEP
export CLHEP_INCLUDE_DIR=/home/username/CLHEP/include
export CLHEP_LIB_DIR=/home/username/CLHEP/lib
export CLHEP_LIB=CLHEP
#export G4DEBUG=1
export G4ANAL YSIS_USE=1
#export G4UI_BUILD_XAW_SESSION=1
#export G4UI_USE_XAW=1
#export G4UI_BUILD_XM_SESSION=1
#export G4UI_USE_XM=1
#export G4UI_USE_TCSH=1
#export G4VIS_BUILD_DAWN_DRIVER=1
#export G4VIS_BUILD_OPENGLX_DRIVER=1
#export G4VIS_BUILD_OPENGLXM_DRIVER=1
#export G4VIS_BUILD_OIX_DRIVER=1
#export G4VIS_BUILD_VRML_DRIVER=1
#export G4VIS_USE_DAWN=1
#export G4VIS_USE_OPENGLX=1
#export G4VIS_USE_OPENGLXM=1
#export G4VIS_USE_OIX=1
#export G4VIS_USE_VRML=1
#export G4LIB_BUILD_G3TOG4=1
#export G4USE_G3TOG4=1
#export G4LIB_BUILD_SHARED=1
#export G4LIB_BUILD_STATIC=1
#export G4LIB_USE_GRANULAR=1
#export CLHEP_BASE_DIR=/usr/local
export G4VIS_BUILD_OPENGLX_DRIVER=1
export G4VIS_USE_OPENGLX=1
export OGLHOME="/usr/local"
export OGLFLAGS="-I/usr/local/include"
export OGLLIBS="-L/usr/local/lib -lGLU -lGL"
export G4UI_USE_TCSH=1
///////////////////////////////////////////////////////////////////////////////
下面是aidaenv的代码.
///////////////////////////////////////////////////////////////////////////////
//aidaenv
export AIDAJNI_HOME=/home/username/addsoftware/AIDAJNI-3.2.2/ export JAIDA_HOME=/home/username/addsoftware/JAIDA-3.2.2/ export JDK_HOME=/home/username/addsoftware/j2sdk1.4.2_05/ source /home/username/addsoftware/JAIDA-3.2.2/bin/aida-setup.sh
export G4ANAL YSIS_USE=1
export
G4ANAL YSIS_AIDA_CONFIG_CFLAGS="-I/home/username/addsoftware/AIDAJNI-3.2.2//inc lude"
export
G4ANAL YSIS_AIDA_CONFIG_LIBS="-L/home/username/addsoftware/AIDAJNI-3.2.2//lib/Lin ux-g++ -lAIDAJNI -lFHJNI -L/home/username/addsoftware/j2sdk1.4.2_05//jre/lib/i386/client -ljvm"
source /home/username/addsoftware/AIDAJNI-3.2.2/bin/Linux-g++/aidajni-setup.sh
///////////////////////////////////////////////////////////////////////////////
下面是dawnenv的代码
///////////////////////////////////////////////////////////////////////////////
//dawnenv
export G4VIS_USE_DAWNFILE=1
export G4VIS_BUILD_DAWNFILE_DRIVER=1
#export G4VIS_USE_DAWN=1
#export G4VIS_BUILD_DAWN_DRIVER=1
export PATH=/usr/local/ActiveTcl/bin:$PA TH
export DAWN_PS_PREVIEWER=gs
export DAWN_BATCH=0 #/1/a (GUI/batch/batch+append)
export DAWN_DEVICE=1 #/2/3/4/5 (PS/X/PS2/X2/GL)
export DAWN_UP_DIRECTION=Y #/Z
export DAWN_BFC_MODE=0 #/1 (Backface-culling mode off/on)
export DAWN_USE_STENCIL=0 #/1 (Skip/do drawing edges in OpenGL mode)
#export G4DAWNFILE_DEST_DIR=/home/xhg/embfour/dawnfile/dawn
///////////////////////////////////////////////////////////////////////////////
下面是javaenv的代码
///////////////////////////////////////////////////////////////////////////////
//javaenv
export PATH=/home/xhg/geantfour/addsoftware/j2sdk1.4.2_05/bin/:$PATH
///////////////////////////////////////////////////////////////////////////////
下面是wiredenv的代码
///////////////////////////////////////////////////////////////////////////////
//wiredenv
export WIRED_HOME=/home/xhg/geantfour/addsoftware/Wired
export PATH=$PATH:/home/xhg/geantfour/addsoftware/Wired/bin
///////////////////////////////////////////////////////////////////////////////
2)安装CLHEP
从上面提供的网页上下载CLHEP, 目前的版本是CLHEP.1.8.1.0.a, 解压缩到/home/username/目录下, 如下就是安装CLHEP的命令.
cd /home/username/CLHEP
./configure -prefix=/home/username/CLHEP
make
make install (需要用root用户执行)
cp /home/username/CLHEP/lib/libCLHEP-g++.1.8.1.0.a /home/username/CLHEP/lib/libCLHEP.a
3)安装Geant4.7.0
如下为安装Geant4的命令, 逐条执行即可.
cd Geant4.7.0
mkdir data
cd data/
tar -xzvf G4CD/Geant4Software/DataFiles/Elastic.1.0.tar.gz
tar -xzvf G4CD/Geant4Software/DataFiles/G4EMLOW2.3.tar.gz
tar -xzvf G4CD/Geant4Software/DataFiles/RadiativeDecay.3.0.tar.gz
tar -xzvf G4CD/Geant4Software/DataFiles/G4NDL3.7.tar.gz
tar -xzvf G4CD/Geant4Software/DataFiles/PhotonEvaporation.2.0.tar.gz
cd ..
./Configure -build (阅读安装程序提供的信息, 按需要回答它的问题)
./Configure -install
cd source
make
cd visualization/OpenIventor
make
cd ../../../physics_list/hadronic
make
4. 安装一些外加的软件
从G4CD/AdditionSoftware目录下各种外加软件的Linux版本拷贝到/home/username/addsoftware/目录下.
1)安装Dawn.
tar -xzvf dawn_3_85e.taz
cd dawn_3_85e
make
make install (需要root用户权限)
2)安装Java
chmod a+x j2sdk-1_4_2_05-linux-i586.bin
./j2sdk-1_4_2_05-linux-i586.bin
3)安装Wired
java -cp . install
4)安装AIDA
tar -xzvf AIDAJNI-3.2.2-Linux-g++.tar.gz
tar -xzvf JAIDA-3.2.2.tar.gz
mv AIDAJNI-3.2.2-src.tar.gz AIDAJNI_3.2.2
cd AIDAJNI_3.2.2
tar -xzvf AIDAJNI-3.2.2-src.tar.gz
export FREEHEP=/home/username/addsoftware/AIDAJNI_3.2.2
export JDK_HOME=/home/username/addsoftware/j2sdk1.4.2_05
export
PATH=/home/username/addsoftware/AIDAJNI_3.2.2/bin:$/home/username/addsoftware/j2sdk1.4. 2_05/bin:$PATH
export OS=Linux
export COMPILER=g++
chmod +x tools/ant
tools/ant -Djar=aidajni
gmake -f GNUmakefile-src
gmake -f GNUmakefile-src dist (将会产生一个AIDAJNI-3.2.2-Linux-g++.tar.gz 文件, 表示已经安装成功.)
5)安装ActiveTcl
tar -xzvf ActiveTcl8.4.5.0-linux-ix86.tar.gz
cd ActiveTcl8.4.5.0-linux-ix86
./install.sh //root privilege
5. 运行例子
Geant4自带许多例子程序, 可以执行其中一两个来观察Geant4是否安装成功.
cd /usr/bin
ln -s /home/username/addsoftware/jas3-0.7.6/jas3 jas3 (root用户权限)
cd /home/username/geant4.7.0/example/extend/analysis/A01/
make
./A01app
jas A01.aida
三. Geant4初级编程
1. 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等).
2. main()程序的定义
1) main()中应该包括的内容
Geant4是一个探测器模拟工具, 但它对于某个特定的模拟程序没有固定的main()函数, 用户在建立模拟程序的过程中需要提供自己的main()函数. 一个最基本的main()函数需要包括以下几个方面:
G4RunManager(模拟整个过程)
G4VUserDetectorConstruction(定义探测器材料, 几何形状, 灵敏区和读出方案)
G4VUserPhysicsList(定义粒子种类和物理过程, 还有截断参数)
G4VUserPrimaryGeneratorAction(定义了源粒子的种类, 能量, 出射方向等)
2) 一个最简单的main()函数如下:
////////////////////////////////////////////////////////////////////////////////////
#include "G4RunManager.hh"
#include "G4UImanager.hh"
#include "ExN01DetectorConstruction.hh"
#include "ExN01PhysicsList.hh"
#include "ExN01PrimaryGeneratorAction.hh"
int main()
{
// Construct the default run manager
G4RunManager* runManager = new G4RunManager;
// set mandatory initialization classes
runManager->SetUserInitialization(new ExN01DetectorConstruction);
runManager->SetUserInitialization(new ExN01PhysicsList);
// set mandatory user action class
runManager->SetUserAction(new ExN01PrimaryGeneratorAction);
// Initialize G4 kernel
runManager->Initialize();
// get the pointer to the UI manager and set verbosities
G4UImanager* UI = G4UImanager::GetUIpointer();
UI->ApplyCommand("/run/verbose 1");
UI->ApplyCommand("/event/verbose 1");
UI->ApplyCommand("/tracking/verbose 1");
// start a run
int numberOfEvent = 3;
runManager->BeamOn(numberOfEvent);
// job termination
delete runManager;
return 0;
}
////////////////////////////////////////////////////////////////////////////////////
3. 定义探测器几何形状
1) 基本概念
Geant4中探测器有大量的几何块组成, 其中最大的几何块被称为"World volume", 它包含了其他所有的几何块, 后定义的几何块被放置在前面的几何块中.
定义某一个几何块时, 必须提供它的形状和物理特征, 以及所处的位置. 当一个几何块被放置在另一个几何块中时, 前者被称为"daughter volume" , 后者被称为"mother volume". 根据"mother volume"来确定"daughter volume"的位置. 描述几何块形状时, 必须给出具体的数值, 如:边长为10cm的立方体和半径为30cm, 长75cm的圆柱体.
2) 定义一个简单的几何块
i) 选择一个形状
定义一个简单的长方体, 用户主要给出它的名字和三个轴向的长度. 如下:
////////////////////////////////////////////////////////////////////////////////////
G4double expHall_x=3.0*m;
G4double expHall_y=1.0*m;
G4double expHall_z=1.0*m;
G4Box* experimentalHall_box
= new G4Box("expHall_box", expHall_x, expHall_y, expHall_z);
////////////////////////////////////////////////////////////////////////////////////
上面这一段代码就定义了一个名为"expHall_box"的长方体, X轴方向从-3*m~3*m, Y轴从-1*m~1*m, Z轴从-1*m~1*m.
定义一个圆柱体也很简单, 需要G4Tubs类.
////////////////////////////////////////////////////////////////////////////////////
G4double innerRadiusOfTheTube=0*cm;
G4double outerRadiusOfTheTube=60*cm;
G4double halfhightOfTheTube=25*cm;
G4double startAngleOfTheTube=0*deg;
G4double spanningAngleOfTheTube=360*deg;
G4Tubs* tracker_tube
= new G4Tubs("tracker_tube",
innerRadiusOfTheTube,
outerRadiusOfTheTube,
halfhightOfTheTube,
startAngleOfTheTube,
spanningAngleOfTheTube);
////////////////////////////////////////////////////////////////////////////////////
上面这段代码就定义了一个名为"tracker_tube", 半径为60*cm, 长为50*cm的圆柱体.
ii) 创建一个逻辑块
在创建一个逻辑块之前, 首先需要定义形状和材料. 如上面所定义的长方体, 材料为氩气, 它的逻辑块定义为:
G4LogicalVolume* experimentalHall_log
= new G4LogicalV olume(experimentHall_box, Ar, "expHall_log");
这个逻辑块的名字为"expHall_log".
上面所定义的圆柱体, 材料为铝, 它的逻辑块为:
G4LogicalVolume* tracker_log
= new G4LogicalV olume(tracker_tube, Al, "tracker_log");
该逻辑块名为"tracker_log".
iii) 创建一个物理块
用户创建一个物理块来确定所定义的几何块的位置. 如下:
////////////////////////////////////////////////////////////////////////////////////
G4double trackerPos_x = -1*m;
G4double trackerPos_y = 0*m;
G4double trackerPos_z = 0*m;
G4VPhysicalV olume* tracker_phys
= new G4PVPlacement(0, //无旋转
G4ThreeVector(trackerPos_x,trackerPos_y,trackerPos_z),
//中心位置坐标
tracker_log, //逻辑块
"tracker", //名字
experimentalHall_log, //"mother volume"(逻辑块)
false, //no boolean operation
0); //复制数
////////////////////////////////////////////////////////////////////////////////////
对于"World volume"来说, 它是最大的几何块, 不可能被其他几何块所包含, 就需要用G4PVPlacement来创建一个无"mother volume"的物理块, 它必须是无旋转的, 而且中心在整个坐标系的原点. 如下:
////////////////////////////////////////////////////////////////////////////////////
G4VPhysicalV olume* experimentallHall_phys
= new G4PVPlacement(0,
G4ThreeVector(0,0,0),
experimentalHall_log,
"expHall"
0,
false,
0);
////////////////////////////////////////////////////////////////////////////////////
4. 定义材料
1) 基本概念
自然界中, 材料(化合物, 混合物)一般是由元素组成, 而元素由同位素组成. Geant4中有三个类用来定义探测器材料的.
类G4Element描述了原子属性:原子量, 原子核中质子数, 原子质量, 壳层能量, 还有每个原子的散射截面等.
类G4Material描述了材料的宏观属性:密度, 状态, 温度, 压强, 还有辐射长度, 平均自由程, dE/dx等.
2) 定义单质材料
如下例, 给出材料名称, 密度, 摩尔质量和原子量, 定义了液态氩.
////////////////////////////////////////////////////////////////////////////////////
G4double density = 1.390*g/cm3;
G4double a = 39.95*g/mole;
G4Material* lAr = new G4Material(name="liquidArgon", z=18., a, density);
////////////////////////////////////////////////////////////////////////////////////
这就可以用来确定所定义的逻辑块的材料:
G4LogicalVolume* myLbox = new G4LogicalV olume(abox, lAr, "Lbox", 0, 0, 0);
3) 定义化合物
如例, 定义水(H2O):
////////////////////////////////////////////////////////////////////////////////////
a = 1.01*g/mole;
G4Element* elH = new G4Element(name="Hydrogen", symbol="H", z=1, a);
a = 16.00*g/mole;
G4Element* elO = new G4Element("Oxygen", "O", z=8, a);
density=1.0*g/cm3;
G4Material* H2O = new G4Material("water", density, ncomponents=2);
H2O->AddElement(elH, natoms=2);
H2O->AddElement(elO, natoms=1);
////////////////////////////////////////////////////////////////////////////////////
4) 定义混合物
如例, 定义空气(Air):
////////////////////////////////////////////////////////////////////////////////////
a = 14.01*g/mole;
G4Element* elN = new G4Element("Nitrogen", "N", z=7, a);
a = 16.0*g/mole;
G4Element* elO = new G4Element("Oxygen", "O", z=8., a);
density = 1.290*g/cm3;
G4Material* Air = new G4Material("Air", density, ncomponents=2);
Air->AddElement(elN, fractionmass=70*perCent);
Air->AddElement(elO, fractionmass=30*perCent);
////////////////////////////////////////////////////////////////////////////////////
在/home/username/geant4.7.0/examples/novice/N03/https://www.sodocs.net/doc/9a5070947.html,文件中介绍了所有定义材料的方法.
5. 指定粒子
1) 一般概念
Geant4能够模拟多种粒子.
基本粒子:电子, 质子, 和gamma等.
短寿命的共振粒子:媒质介子和delta重子.
核子:氘, alpha粒子和重离子等.
夸克, D夸克和胶子.
G4ParticleDefinition类提供了粒子的定义, 而且每种粒子都有自己的类. 粒子主要分为6个大类:
轻子(lepton)
介子(meson)
强子(baryon)
波色子(boson)
短寿命粒子(shortlived)
离子(ion)
G4ParticleDefinition类包含了单个粒子的属性:名称, 质量, 带电电荷, 自旋等. 其中大部分的属性都不可修改, 除非重新建立库. Geant4定义了上百种粒子用于不同的物理过程, 在一般应用中, 用户不需要自己定义粒子. 粒子在连接的过程中注册启用了, 用户不须要(也不能)自行执行注册粒子.
2) 指定粒子和物理过程
G4VUserPhysicsList类让用户可以指定粒子以及它们的物理过程, 用户还可以指定截断参数.
一个用户从G4VUserPhysicsList中创建自己的类要利用以下几个步骤:
ConstructParticle(): 调用粒子
ConstructPhysics(): 调用粒子的物理过程
SetCuts(): 设置粒子的截断值
用户利用ConstructParticle()来调用所需要的粒子的函数, 如用户需要质子和geantino, 代码如下:
////////////////////////////////////////////////////////////////////////////////////
void ExN01PhysicsList::ConstructParticle()
{
G4Proton::ProtonDefinition();
G4Geantino::GeantinoDefinition();
}
////////////////////////////////////////////////////////////////////////////////////
Geant4中预先定义的粒子有100多个, 用户不可能用这种方法来调用每一个粒子的函数, Geant4中有一些类可以让用户调用一类粒子, 相对于6个粒子大类, 总共有6个类来调用这批粒子.他们是:
G4BosonConstructor
G4LeptonConstructor
G4MesonConstructor
G4BarionConstructor
G4IonConstructor
G4ShortlivedConstructor
使用方法如下例:
////////////////////////////////////////////////////////////////////////////////////
void ExN04PhysicsList::ConstructLeptons()
{
//Construct all leptons
G4LeptonConstructor pConstructor;
pConstructor.ConstructorParticle();
}
////////////////////////////////////////////////////////////////////////////////////
3) 设定截断值
用户必须为每个粒子设定截断值, 所谓截断值, 就是程序在粒子输运距离为截断值时记录粒子位置, 能量的信息. 在一般的模拟程序中, 用户可以为所有的粒子设定一个截断值. 如下:
////////////////////////////////////////////////////////////////////////////////////
void ExN04PhysicsList::SetCuts()
{
// the G4VUserPhysicsList::SetCutsWithDefault() method sets
// the default cut value for all particle types
SetCutsWithDefault();
}
////////////////////////////////////////////////////////////////////////////////////
系统默认的截断值为1*mm, 当然用户可以为自己调用的粒子和物理过程设定不用的默认值.如下:
////////////////////////////////////////////////////////////////////////////////////
ExN04PhysicsList::ExN04PhysicsList(): G4VUserPhysicsList()
{
// default cut value (1.0*mm)
defaultCutValue = 1*mm;
}
////////////////////////////////////////////////////////////////////////////////////
用户可以为gamma射线, 电子, 正电子, 或者为不用的几何区域设定不同的截断值. 这种情况下, 由于Geant4的物理过程(特别是计算能量损失的物理过程)是根据特定的截断值
编写的, 它们输出就会改变, 所以用户应该特别小心.
为不同粒子设定不同截断值的例子如下:
////////////////////////////////////////////////////////////////////////////////////
void ExN03PhysicsList::SetCuts()
{
// set cut values for gamma at first and for e- second and next for e+,
// because some processes for e+/e- need cut values for gamma
SetCutValue(defaultCutValue, "gamma");
SetCutValue(defaultCutValue, "e-");
SetCutValue(defaultCutValue, "e+");
// set cut value for proton and anti_proton before all other hadrons
// because some processes for hadrons need cut value for proto/anti_proton
SetCutValue(cutForProton, "proton");
SetCutValue(cutForProton, "anti_proton");
// set cut value for other particles
SetCutValueForOthers(defaultCutValue);
}
////////////////////////////////////////////////////////////////////////////////////
6. 指定物理过程
1) 物理过程
物理过程描述了粒子与材料的相互作用. Geant4中提供了电磁, 强子和其他的反应过程. 有7 个物理过程大类:
电磁物理过程(electromagnetic)
强子物理过程(hadronic)
输运过程(transportation)
衰减(decay)
光学过程(optical)
光轻子-强子过程(photolepton_hadron)
参数化过程(parameterisation)
G4VProcess是最基本的物理过程的类, 每一个物理过程有三个"DoIt"方式来描述: AtRestDoIt
AlongStepDoIt
PostStepDoIt
还有三个响应方式:
AtRestGetPhysicalInteractionLength
AlongStepGetPhysicalInteractionLength
PostStepGetPhysicalInteractionLength
下面给出了用于单个物理过程的基本的类:
G4V AtRestProcess (仅适合于"AtRestDoIt"方式的物理过程)
G4VContinuousProcess (仅适合于"AlongStepDoIt"方式的物理过程)
G4VDiscreteProcess (仅适合于"PostStepDoIt"方式的物理过程)
另外4个类(如G4VContinuousDiscreteProcess)用于复杂的物理过程.
2) 指定物理过程
用户通过G4VUserPhysicsList来调用模拟程序中的粒子以及它们的物理过程. 用户通过ConstructPhysics()方式利用G4VUserPhysicsList为每一个所调用的粒子创建自己的物理过程类.
i) 添加输运方式
如果没有添加粒子的输运方式, 程序就不能描述粒子在时空的输运, 以及不能记录粒子输运过程中的轨迹, 所以用户就必须为所有的粒子调用G4Transportation. 如下:
////////////////////////////////////////////////////////////////////////////////////
void G4VUserPhysicsList::AddTransportation()
{
// create G4Transportation
G4Transportation* theTransportationProcess = new G4Transportation();
// loop over all particles in G4ParticleTable and register the
// transportation process
theParticleIterator->reset();
while((*theParticleIterator)()){
G4ParticleDefinition* particle = theParticleIterator->value();
G4ProcessManager* pmanager = particle->GetProcessManager();
// adds transportation to all particles except shortlived particles
if (!particle->IsShortLived()){
pmanager -> AddProcess(theTransportationProcess);
// set ordering to the first for AlongStepDoIt
pmanager -> SetProcessOrderingToFirst(theTransportationProcess,
idxAlongStep);
}
}
}
////////////////////////////////////////////////////////////////////////////////////
ii) 调用物理过程
以ConstructProcess()方式为G4Geantino类调用输运物理过程如下:
////////////////////////////////////////////////////////////////////////////////////
void ExN01PhysicsList::ConstructProcess()
{
// Define transportation process
AddTransportation();
}
////////////////////////////////////////////////////////////////////////////////////
为gamma射线添加物理过程如下:
////////////////////////////////////////////////////////////////////////////////////
void MyPhysicsList::ConstructProcess()
{
// Define transportation process
AddTransportation();
// electromagnetic process
ConstructEM();
}
void MyPhysicsList::ConstructEM()
{
// Get the process manager for gamma
G4ParticleDefinition* particle = G4Gamma::GammaDefinition();
G4ProcessManager* pmanager = particle->GetProcessManager();
// Construct process for gamma
G4PhotoElectricEffect * thePhotoElectricEffect = new G4PhotoElectricEffect();
G4ComptonScattering * theComptonScattering = new G4ComptonScattering();
G4GammaConversion * theGammaConversion = new G4GammaConversion();
// Register process to gamma's process manager
pmanager->AddDiscreteProcess(thePhotoElectricEffect);
pmanager->AddDiscreteProcess(theComptonScattering);
pmanager->AddDiscreteProcess(theGammaConversion);
}
////////////////////////////////////////////////////////////////////////////////////
7. 产生初始事件
1) 初始事件
G4VUserPrimaryGeneratorAcrion可以让用户创建自己的初始事件类. 用户提供初始事件的状态, 如: 出射粒子的种类, 出射能量, 方向等. 如下:
////////////////////////////////////////////////////////////////////////////////////
#include "ExN01PrimaryGeneratorAction.hh"
#include "G4Event.hh"
#include "G4ParticleGun.hh"
#include "G4ParticleTable.hh"
#include "G4ParticleDefinition.hh"
#include "globals.hh"
ExN01PrimaryGeneratorAction::ExN01PrimaryGeneratorAction()
{
G4int n_particle = 1;//设定每次事件出射粒子的数量
particleGun = new G4ParticleGun(n_particle);
G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
G4String particleName;
particleGun->SetParticleDefinition(particleTable->FindParticle(particleName="geantino"));//设定出射粒子的种类
particleGun->SetParticleEnergy(1.0*GeV);//设定出射粒子的动能
particleGun->SetParticlePosition(G4ThreeVector(-2.0*m, 0.0, 0.0));//设定出射粒子的出射位置
}
ExN01PrimaryGeneratorAction::~ExN01PrimaryGeneratorAction()
{
delete particleGun;
}
void ExN01PrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
{
G4int i = anEvent->GetEventID() % 3;
G4ThreeVector v(1.0,0.0,0.0);
switch(i)
{
case 0:
break;
case 1:
v.setY(0.1);
break;
case 2:
v.setZ(0.1);
break;
}
particleGun->SetParticleMomentumDirection(v);//设定出射粒子的方向
particleGun->GeneratePrimaryVertex(anEvent);
}
////////////////////////////////////////////////////////////////////////////////////
2) G4VPrimaryGenerator
Geant4中有两个G4VPrimaryGenerator的独立的类, 一个是G4ParticleGun, 另一个是G4HEPEvtInterface. G4ParicleGun用来给用户确定出射粒子的动能和位置. 方式如下: void SetParticleDefinition(G4ParticleDefinition*)
void SetParticleMomentum(G4ParticleMomentum)
void SetParticleMomentumDirection(G4ThreeVector)
void SetParticleEnergy(G4doule)
void SetParticleTime(G4double)
void SetParticlePosition(G4ThreeVector)
void SetParticlePolarization(G4ThreeV ector)
void SetNumberOfParticles(G4int)
8. 创建可执行程序
以在$G4INSTALL/examples/novice/N01/目录下的程序代码为例, 使用GNUmake编译该程序代码, 生成可执行程序.
1) Geant4中的GNUmake
Geant4中GNUmake过程主要有以下几个GNUmake 控制(*.gmk在$G4INSTALL/config目录下):
acrchitecture.gmk (调用和定义$G4INSTALL/config/sys目录下所有确定了设置和路径的结构)
common.gmk (为建立obj和lib文件定义GNUmake规则)
globlib.gmk (为建立复合的lib文件定义GNUmake规则)
binmake.gmk (为建立可执行文件定义GNUmake规则)
GNUmakefile (每一个Geant4的目录下都有, 确定lib文件路径, 定义可执行程序)
2) 创建可执行程序
> cd $G4WORKDIR/examples/novice/N01
> gmake(make)
在bash下输入上面两行命令, 将在$G4BIN目录下建立可执行文件exampleN01.用以下命令执行该程序:
> $G4BIN/exampleN01
四. 执行模拟程序
1. 命令总目录
/control/ UI 控制命令.
/units/ 单位.
/geometry/ 几何形状控制命令.
/tracking/ 轨迹和步长控制命令.
/event/ 事件控制命令.
/run/ 运行控制命令.
/random/ 随机数状态控制命令.
/particle/ 粒子控制命令.
/process/ 物理过程控制命令.
/hits/ 灵敏区和采样
/gun/ 粒子源控制命令.
/vis/ 可视化命令.
2. 一些常用命令
1) /control/execute
说明:执行一个宏文件.
参数: filename
参数类型: s
可/否省略: 否
2) /control/loop
说明:多次执行宏文件
参数: macroFile