猪头Geant4讲座第一讲——预备知识先来两句套话,本人知识有限,不当之处请大家多多指教:P~~~预备知识,不爱聊天兄已经说过了,C++这里我重点说一下,重点要学习C++中的类的使用,包括类的调用、类的初始化、类的重构等其次,基本物理概念和基本Linux基础也是必要的当然,Geant4是要安装好的,G4手册是要有的。从哪儿找,怎么装,这些我都不再具体叙述了大家自己翻前面的帖子吧。猪头Geant4讲座第二讲——模拟算法我们要学习Geant4首先应该学习G4是如何处理模拟过程的。在G4中一个典型的模拟算法是这样的。首先建立一次模拟,在G4中称为一次RunRun建立后,需要对几何结构、物理过程进行初始化初始化完成后就开始模拟过程了,首先发射一个粒子,每一步都按照蒙卡方法进行模拟,具体模拟方法请参阅裴鹿成或许淑艳老师的书这里不具体讲,因为不是重点在G4中,发射一个(或一系列)粒子到所有次级粒子死亡的过程成为一次Event。而每次发射的初始粒子则有粒子发射器进行控制。而在每一个event过程中,粒子与材料反应后会可能生成多个次级粒子,每个粒子都会有一条径迹,称之为track而每一个粒子(初始的或次级的)的径迹又是由很多步组成的,称之为step关于track和step的理解请参阅下图昀后总结一下,G4模拟的基本算法是ARunStart-初始化物理模型/几何模型-AnEventStart-调用粒子发射器发射粒子-ATrackStart-AStepStart-AStepEnd-NextStepStart-……-AllStepEnd-ATrackEnd-NextTrackStart-……-AllTrackEnd-AnEventEnd-NextEventStrat-……-AllEventEnd(AllPrimariesShot)-ARunEnd-NextRunStart-……猪头Geant4讲座第三讲——程序结构及基本类G4是采用的gcc编译器,因此其程序结构是和C++一样的。首先包括有一个主程序main,然后分别包含有子程序src和头文件include以及其他调用文件othersG4里面为了与C++相区别,程序后缀都是.cc,头文件后缀都是.hh其中头文件在.cc里面写也没问题,但是那样看起来不方便,建议还是按照c++的习惯一一对应比较好。那么,关键问题是要进行一个模拟我们都需要写哪些src和include的?下面我们首先看G4里面的几个基本类,这些基本类基本上是与src一一对应的。G4RunManager——对应主程序这个类在主程序中用以初始化模拟信息的,或者形象地说是用于连接子程序的,而连接方式是通过Set函数来完成的大家可以从$G4INSTALL/source/run/G4RunManager.hh里面查看各种Set函数,如public://withdescriptioninlinevoidSetUserInitialization(G4VUserDetectorConstruction*userInit){userDetector=userInit;}inlinevoidSetUserInitialization(G4VUserPhysicsList*userInit){physicsList=userInit;kernel-SetPhysics(userInit);}可以说G4RunManager类是贯穿整个程序模拟过程的总线,因此一般说来只能有一个而开始一次Run的信号则是通过BeamOn函数发出的,其格式是virtualvoidBeamOn(G4intn_event,constchar*macroFile=0,G4intn_select=-1);可以通过多次调用BeamOn来实现循环计算。其余子类包括几何结构类、物理设定类、粒子发射器类(源描述类)、事件处理类、径迹处理类等。这些类可以按照两种不同的分类方式分类,每种分类方式都可以分为两类。子类按照重要性分为强制类和可选类。其中几何结构类(DetectorConstruction)、物理设定类(PhysicsList)、源描述类(PrimaryGenerator)都属于强制类,是必须有的,缺少任一个程序都无法运行。而事件处理类(EventAction)、步数据处理类(SteppingAction)、径迹处理类(TrackingAction)、运行处理类(RunAction)都属于可选类,用户可以通过设定这些类来获取感兴趣的信息,虽然没有这些类程序一样可以运行,但是如果一个都没有的话,这样的模拟是没有意义的,除非是用来检验几何结构的完备性。子类按照调用过程分为初始化类和用户干涉类其中几何结构类(DetectorConstruction)、物理设定类(PhysicsList)属于初始化类,这两个类在每次Run开始后就对模拟过程进行初始化,之后在粒子发射开始后(BeamOn开始后)就不再继续调用了。而其余的类则是在每发射一个粒子后都需要调用的,具体调用过程请复习第二讲中的模拟算法。下面讲一个特殊的类。G4UImanager——UI(userinterface)管理器这个类的英文全名是userinterfacemanager,顾名思义是用于人机交互的,用户可以通过这个类来向模拟过程发出“命令”,这个类在一定程度上使用很简洁的命令语句代替了上述用户干涉类的功能。需要说明的是,上面所说的几个类并没有包括所有可选类,根据每个用户的需求,用户可以有很多其他类。下面以$G4INSTALL/example/novice/N01的例子为例看一下这些类,因为这个粒子仅为了说明Geant4的基本运用,所以这个例子里面只定义了3个强制类,没有使用可选类来输出感兴趣的信息。但是通过UI管理器查看了粒子输运过程中的一些信息。//Constructthedefaultrunmanager//首先是要创建一个运行管理器的实例,根据C++的知识我们知道每个类都必须通过他的实例来进行操作G4RunManager*runManager=newG4RunManager;//setmandatoryinitializationclasses//通过Set函数设置几何结构和物理过程,这两个类属于强制类,也属于初始化类G4VUserDetectorConstruction*detector=newExN01DetectorConstruction;runManager-SetUserInitialization(detector);//G4VUserPhysicsList*physics=newExN01PhysicsList;runManager-SetUserInitialization(physics);//setmandatoryuseractionclass//通过Set函数进行源描述,这个类属于强制类,也属于用户干涉类G4VUserPrimaryGeneratorAction*gen_action=newExN01PrimaryGeneratorAction;runManager-SetUserAction(gen_action);//InitializeG4kernel//Set完成后,通过Initialize()函数初始化G4内核runManager-Initialize();//GetthepointertotheUImanagerandsetverbosities//创建UI管理器,通过UI管理器设置运行、事件、径迹的可视化精细程度。G4UImanager*UI=G4UImanager::GetUIpointer();UI-ApplyCommand(/run/verbose1);UI-ApplyCommand(/event/verbose1);UI-ApplyCommand(/tracking/verbose1);//Startarun//通过BeamOn()函数开始模拟,这里macroFile和n_Select都是使用了默认值G4intnumberOfEvent=3;runManager-BeamOn(numberOfEvent);猪头Geant4讲座第四讲——基本单位在进行后续讲座之前,我们首先了解一下Geant4中的单位,在Geant4中的每个物理量虽然都有默认单位,但是每个物理量还可以带任意用户方便的单位,比如长度单位默认是mm,但用户可以改为m。物理量的默认单位是采用的Hep(High-EnergyPhysics)中的单位:millimeter(mm)nanosecond(ns)MegaelectronVolt(MeV)positroncharge(eplus)degreeKelvin(kelvin)theamountofsubstance(mole)luminousintensity(candela)radian(radian)steradian(steradian)G4中对每个单位都用常变量进行了定义,可以很方便地对物理量进行描述方法。而且大部分常用单位都有全名和缩写两种。比如定义一个10cm的长度可以用下述几种方法描述。G4doublelength=100.;G4doublelength=100.*mm;G4doublelength=100.*millimeter;G4doublelength=10.*cm;G4doublelength=10.*centimeter;这几种描述方法是等价的。具体的单位设置可以看$G4INSTALL/source/global/management/include/G4SystemOfUnits.hh,这个文件是引用的CLHEP的一部分,其来源是$CLHEP/Units/SystemOfUnits.h。猪头Geant4讲座第五讲——材料定义几何结构类(DetectorConstruction)属于强制初始化类,其主要功能是构建模拟问题的几何结构,包括各部分的材料、形状、尺寸、位置等信息。因此,在这个类里面我们就必须完成上述几个信息的设置工作。首先,材料定义。材料可以分为单质和化合物(混合物)两种。而不管是单质还是化合物都是由元素组成的,因此在定义材料前,必须首先定义元素。而元素的定义将决定在模拟过程中需要使用的截面库的选择(大部分是自动选择的,这里不重点讲)。那么下面我们来看如何定义元素。我们知道,每一种元素都可能有多个同位素,但是所有这些同位素的原子序数(核内质子数)都是相同的,其摩尔质量也可以根据各个同位素所占份额计算出来。因此,只需要有原子序数Z和摩尔质量A就可以定义出一个元素。这就是元素的直接定义法,参考$G4INSTLL/source/materials/include/G4Element.hh,如下://ConstructortoBuildanelementdirectly;noreferencetoisotopes//G4Element(constG4String&name,//itsnameconstG4String&symbol,//itssymbolG4doubleZeff,//atomicnumberG4doubleAeff);//massofmole其中元素名称和符号只是个标记,并不会影响元素的物理性质。$G4INSTALL/example/novice/N02中氮元素的定义就是采用的直接定义法。G4Element*N=newG4Element(Nitrogen,N,z=7.,a=14.01*g/mole);此外,既然每种元素都是由不同的同位素组成的,那如果事先定义了同位素,加上每个同位素所占份额不也可以确定一种元素,而不必麻烦地去计算摩尔质量吗?确实如此,在Geant4中同样提供了另一种定义元素的方法,我将之称为间接定义法。同样参考$G4INSTLL/source/materials/include/G4Element.hh,如下://ConstructortoB