蒙特卡洛模拟GEANT4例子exampleB4a源码解读.docx
- 文档编号:23005055
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:35
- 大小:271.45KB
蒙特卡洛模拟GEANT4例子exampleB4a源码解读.docx
《蒙特卡洛模拟GEANT4例子exampleB4a源码解读.docx》由会员分享,可在线阅读,更多相关《蒙特卡洛模拟GEANT4例子exampleB4a源码解读.docx(35页珍藏版)》请在冰豆网上搜索。
蒙特卡洛模拟GEANT4例子exampleB4a源码解读
Geant4ExampleB4a源码解读
今天继续简单讲一下exampleB4中的几个子例子,先是exampleB4a,仍然是采用SteppingAction一步一步抽取事件,这种方法的好处是能够很详细的考虑、输出每一步的信息,但有时候我们只希望对感兴趣部分(位置)进行事件抽取,则用SD和Hit要明显方便一些,例如在exampleB4c中用到的就是SD和Hit进行数据抽取。
exampleB4a和exampleB4c描述的是同一个几何、物理过程,只是数据抽取的方式不同,因此将这两个例子放在一起具有比较意义。
本次先对exampleB4a进行讲解。
exampleB4a计算了入射粒子(默认电子,能量50MeV,轴向方向)在多层铅-液氩材料中(由10个吸收体和间隙复制组成)的能量沉积及带电粒子(包括次级粒子)径迹长度。
图1.几何可视化及粒子输运可视化
exampleB4a.cc
#include"B4DetectorConstruction.hh"
#include"B4aActionInitialization.hh"
#ifdefG4MULTITHREADED
#include"G4MTRunManager.hh"
#else
#include"G4RunManager.hh"
#endif
#include"G4UImanager.hh"
#include"G4UIcommand.hh"
#include"FTFP_BERT.hh"
#include"Randomize.hh"
#include"G4VisExecutive.hh"
#include"G4UIExecutive.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
namespace{
voidPrintUsage(){
G4cerr<<"Usage:
"< G4cerr<<"exampleB4a[-mmacro][-uUIsession][-tnThreads]"< G4cerr<<"note: -toptionisavailableonlyformulti-threadedmode." < } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... intmain(intargc,char**argv) { //Evaluatearguments // if(argc>7){ PrintUsage(); return1; } G4Stringmacro; G4Stringsession; #ifdefG4MULTITHREADED G4intnThreads=0; #endif for(G4inti=1;i if(G4String(argv[i])=="-m")macro=argv[i+1]; elseif(G4String(argv[i])=="-u")session=argv[i+1]; #ifdefG4MULTITHREADED elseif(G4String(argv[i])=="-t"){ nThreads=G4UIcommand: : ConvertToInt(argv[i+1]); } #endif else{ PrintUsage(); return1; } } //Detectinteractivemode(ifnomacroprovided)anddefineUIsession // G4UIExecutive*ui=nullptr; if(! macro.size()){ ui=newG4UIExecutive(argc,argv,session); } //Optionally: chooseadifferentRandomengine... // //G4Random: : setTheEngine(newCLHEP: : MTwistEngine); //Constructthedefaultrunmanager // #ifdefG4MULTITHREADED autorunManager=newG4MTRunManager; if(nThreads>0){ runManager->SetNumberOfThreads(nThreads); } #else autorunManager=newG4RunManager; #endif //Setmandatoryinitializationclasses // autodetConstruction=newB4DetectorConstruction(); runManager->SetUserInitialization(detConstruction); autophysicsList=newFTFP_BERT; runManager->SetUserInitialization(physicsList); autoactionInitialization=newB4aActionInitialization(detConstruction); runManager->SetUserInitialization(actionInitialization); //Initializevisualization // autovisManager=newG4VisExecutive; //G4VisExecutivecantakeaverbosityargument-see/vis/verboseguidance. //G4VisManager*visManager=newG4VisExecutive("Quiet"); visManager->Initialize(); //GetthepointertotheUserInterfacemanager autoUImanager=G4UImanager: : GetUIpointer(); //ProcessmacroorstartUIsession // if(macro.size()){ //batchmode G4Stringcommand="/control/execute"; UImanager->ApplyCommand(command+macro); } else{ //interactivemode: defineUIsession UImanager->ApplyCommand("/control/executeinit_vis.mac"); if(ui->IsGUI()){ UImanager->ApplyCommand("/control/executegui.mac"); } ui->SessionStart(); deleteui; } //Jobtermination //Freethestore: useractions,physics_listanddetector_descriptionare //ownedanddeletedbytherunmanager,sotheyshouldnotbedeleted //inthemain()program! deletevisManager; deleterunManager; } 用户在终端输入字符串个数大于7则调用PrintUsage提示出错,并返回1,跳出main()函数。 通过for循环对输入字符串扫描识别,若程序名后字符串为“-m”给macro赋值该字符串后一个字符串;若程序名后字符串为“-u”给session赋值该字符串后一个字符串,否则调用PrintUsage提示出错,并返回1,跳出main()函数。 定义一个UI操作类对象,ui指针初始化空指针,若用户没有调用macro控制文件,则new一个ui指针,分内存空间辟。 初始化探测器、物理过程以及用户行为,其中,用户行为与探测器构造有关。 new一个可视化管理器并对其初始化。 定义一个UI管理类,通过判断条件macro是否为空,来决定执行交互式界面模式还是批处理模式。 最后delete所有管理类,释放内存。 B4DetectorConstruction.hh #ifndefB4DetectorConstruction_h #defineB4DetectorConstruction_h1 #include"G4VUserDetectorConstruction.hh" #include"globals.hh" classG4VPhysicalVolume; classG4GlobalMagFieldMessenger; classB4DetectorConstruction: publicG4VUserDetectorConstruction { public: B4DetectorConstruction(); virtual~B4DetectorConstruction(); public: virtualG4VPhysicalVolume*Construct(); virtualvoidConstructSDandField(); //getmethods // constG4VPhysicalVolume*GetAbsorberPV()const;//const修饰指针,指针的内存空间数据不能改变;函数重载 constG4VPhysicalVolume*GetGapPV()const; private: //methods // voidDefineMaterials(); G4VPhysicalVolume*DefineVolumes(); //datamembers // staticG4ThreadLocalG4GlobalMagFieldMessenger*fMagFieldMessenger; //magneticfieldmessenger G4VPhysicalVolume*fAbsorberPV;//theabsorberphysicalvolume G4VPhysicalVolume*fGapPV;//thegapphysicalvolume G4boolfCheckOverlaps;//optiontoactivatecheckingofvolumesoverlaps }; //inlinefunctions inlineconstG4VPhysicalVolume*B4DetectorConstruction: : GetAbsorberPV()const{ returnfAbsorberPV; } inlineconstG4VPhysicalVolume*B4DetectorConstruction: : GetGapPV()const{ returnfGapPV; } B4DetectorConstruction继承于G4VUserDetectorConstruction基类,声明构造函数、析构函数,Construct()返回物理体。 虚方法ConstructSDandField()用于定义SD探测器以及空间内的电磁场。 GetAbsorberPV()和GetGapPV()为自定义的内联函数在类体外进行定义,分别返回物理体fAbsorberPV和fGapPV(私有数据成员)。 G4GlobalMagFieldMessenger类用于描述电磁场的大小、方向等信息。 B4DetectorConstruction.cc B4DetectorConstruction: : B4DetectorConstruction() : G4VUserDetectorConstruction(), fAbsorberPV(nullptr), fGapPV(nullptr), fCheckOverlaps(true) { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... B4DetectorConstruction: : ~B4DetectorConstruction() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4VPhysicalVolume*B4DetectorConstruction: : Construct() { //Definematerials DefineMaterials(); //Definevolumes returnDefineVolumes(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... voidB4DetectorConstruction: : DefineMaterials() { //LeadmaterialdefinedusingNISTManager autonistManager=G4NistManager: : Instance(); nistManager->FindOrBuildMaterial("G4_Pb"); //Liquidargonmaterial G4doublea;//massofamole; G4doublez;//z=meannumberofprotons; G4doubledensity; newG4Material("liquidArgon",z=18.,a=39.95*g/mole,density=1.390*g/cm3); //TheargonbyNISTManagerisagaswithadifferentdensity //Vacuum newG4Material("Galactic",z=1.,a=1.01*g/mole,density=universe_mean_density, kStateGas,2.73*kelvin,3.e-18*pascal); //Printmaterials G4cout<<*(G4Material: : GetMaterialTable())< } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4VPhysicalVolume*B4DetectorConstruction: : DefineVolumes() { //Geometryparameters G4intnofLayers=10;//定义有多少层copynumber G4doubleabsoThickness=10.*mm; G4doublegapThickness=5.*mm; G4doublecalorSizeXY=10.*cm; autolayerThickness=absoThickness+gapThickness;//一层厚度 autocalorThickness=nofLayers*layerThickness;//整体厚度 autoworldSizeXY=1.2*calorSizeXY; autoworldSizeZ=1.2*calorThickness; //Getmaterials autodefaultMaterial=G4Material: : GetMaterial("Galactic"); autoabsorberMaterial=G4Material: : GetMaterial("G4_Pb"); autogapMaterial=G4Material: : GetMaterial("liquidArgon"); if(! defaultMaterial||! absorberMaterial||! gapMaterial){ G4ExceptionDescriptionmsg; msg<<"Cannotretrievematerialsalreadydefined."; G4Exception("B4DetectorConstruction: : DefineVolumes()", "MyCode0001",FatalException,msg); } // //World // autoworldS =newG4Box("World",//itsname worldSizeXY/2,worldSizeXY/2,worldSizeZ/2);//itssize autoworldLV =newG4LogicalVolume( worldS,//itssolid defaultMaterial,//itsmaterial "World");//itsname autoworldPV =newG4PVPlacement( 0,//norotation G4ThreeVector(),//at(0,0,0) worldLV,//itslogicalvolume "World",//itsname 0,//itsmothervolume false,//nobooleanoperation 0,//copynumber fCheckOverlaps);//checkingoverlaps // //Calorimeter // autocalorimeterS =newG4Box("Calorimeter",//itsname calorSizeXY/2,calorSizeXY/2,calorThickness/2);//itssize autocalorLV =newG4LogicalVolume( calorimeterS,//itssolid defaultMaterial,//itsmaterial "Calorimeter");//itsname newG4PVPlacement( 0,//norotation G4ThreeVector(),//at(0,0,0) calorLV,//itslogicalvolume "Calorimeter",//itsname worldLV,//itsmothervolume false,//nobooleanoperation 0,//copynumber fCheckOverlaps);//checkingoverlaps // //Layer // autolayerS =newG4Box("Layer",//itsname calorSizeXY/2,calorSizeXY/2,layerThickness/2);//itssize autolayerLV =newG4LogicalVolume( layerS,//itssolid defaultMaterial,//itsmaterial "Layer");//itsname newG4PVReplica( "Layer",//itsname layerLV,//itslogicalvolume calorLV,//itsmother kZAxis,//axisofreplication nofLayers,//numberofreplica layerThickness);//witdthofreplica // //Absorber // autoabsorberS =newG4Box("Abso",//itsname calorSizeXY/2,calorSizeXY/2,absoThickness/2);//itssize autoabsorberLV =newG4LogicalVolume( absorberS,//itssolid absorberMaterial,//itsmaterial "Abso");//itsname fAbsorberPV =newG4PVPlacement( 0,//norotation G4ThreeVector(0.,0.,-gapThickness/2),//itsposition absorberLV,//itslogicalvolume "Abso",//itsname layerLV,//itsmothervolume false,//nobooleanoperation 0,//copynumber fCheckOverlaps);//checkingoverlaps // //Gap // autogapS =newG4Box("Gap",//itsname calorSizeX
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蒙特卡洛 模拟 GEANT4 例子 exampleB4a 源码 解读
![提示](https://static.bdocx.com/images/bang_tan.gif)