initialize

main
liuyihui 2022-04-28 20:18:48 +08:00
commit f36f321539
12 changed files with 244 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
build/

24
.vscode/c_cpp_properties.json vendored Normal file
View File

@ -0,0 +1,24 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${default}",
"${workspaceFolder}/include",
"D:/Geant4/dist/include/Geant4"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "D:/Microsoft/VisualStudio/2022/Community/VC/Tools/MSVC/14.31.31103/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"cmake.configureSettings": {
"CMAKE_TOOLCHAIN_FILE": "D:/Microsoft/vcpkg/scripts/buildsystems/vcpkg.cmake"
}
}

33
CMakeLists.txt Normal file
View File

@ -0,0 +1,33 @@
cmake_minimum_required(VERSION 3.16)
set(Geant4_DIR D:/Geant4/dist/lib/Geant4-11.0.1)
project(exampleB0)
option(WITH_GEANT4_UIVIS "Build example with Geant4 UI and Vis drivers" ON)
if(WITH_GEANT4_UIVIS)
find_package(Geant4 REQUIRED ui_all vis_all)
else()
find_package(Geant4 REQUIRED)
endif()
include(${Geant4_USE_FILE})
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cpp)
file(GLOB headers ${PROJECT_SOURCE_DIR}/include/*.h)
add_executable(exampleB0 main.cpp ${sources} ${headers})
target_link_libraries(exampleB0 ${Geant4_LIBRARIES})
set(exampleB0_SCRIPTS
auto.mac
vis.mac
)
foreach(_script ${exampleB0_SCRIPTS})
configure_file(
${PROJECT_SOURCE_DIR}/${_script}
${PROJECT_BINARY_DIR}/Release/${_script}
COPYONLY
)
endforeach()

12
G4.code-workspace Normal file
View File

@ -0,0 +1,12 @@
{
"folders": [
{
"path": "."
}
],
"settings": {
"files.associations": {
"*.icc": "cpp"
}
}
}

15
auto.mac Normal file
View File

@ -0,0 +1,15 @@
# 多线程设置
/run/numberOfThreads 1
# verbose
/control/verbose 2
/run/verbose 2
/event/verbose 2
/tracking/verbose 2
# 初始化
/run/initialize
/gun/particle gamma
/gun/energy 6 MeV
/run/beamOn 3

11
include/Geometry.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef GEOMETRY
#define GEOMETRY
#include "G4VUserDetectorConstruction.hh"
class DetectorConstruction : public G4VUserDetectorConstruction {
public:
virtual G4VPhysicalVolume* Construct();
};
#endif

19
include/ParticleSource.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef SOURCE
#define SOURCE
#include "G4VUserPrimaryGeneratorAction.hh"
#include "G4ParticleGun.hh"
class G4Event;
class GeneratorAction : public G4VUserPrimaryGeneratorAction {
public:
GeneratorAction();
~GeneratorAction();
virtual void GeneratePrimaries(G4Event* e);
private:
G4ParticleGun* particleGun;
};
#endif

45
main.cpp Normal file
View File

@ -0,0 +1,45 @@
#include "QGSP_BERT.hh"
#include "G4MTRunManager.hh"
#include "G4VUserActionInitialization.hh"
#include "G4UImanager.hh"
#include "G4UIExecutive.hh"
#include "G4VisExecutive.hh"
#include "Geometry.h"
#include "ParticleSource.h"
class ActionInitialzation : public G4VUserActionInitialization {
public:
virtual void Build() const{
SetUserAction(new GeneratorAction);
}
};
int main(int argc, char** argv) {
G4UIExecutive* ui = nullptr;
if (argc == 1)
ui = new G4UIExecutive(argc, argv);
auto runManager = new G4MTRunManager;
auto visManager = new G4VisExecutive;
auto UIManager = G4UImanager::GetUIpointer();
runManager->SetUserInitialization(new DetectorConstruction());
runManager->SetUserInitialization(new QGSP_BERT());
runManager->SetUserInitialization(new ActionInitialzation());
visManager->Initialize();
if ( !ui ) {
G4String command = "/control/execute";
G4String fileName = argv[1];
UIManager->ApplyCommand(command + fileName);
} else {
UIManager->ApplyCommand("/control/execute vis.mac");
ui->SessionStart();
delete ui;
}
delete runManager;
delete visManager;
return 0;
}

27
src/Geometry.cpp Normal file
View File

@ -0,0 +1,27 @@
#include "Geometry.h"
#include "G4Box.hh"
#include "G4NistManager.hh"
#include "G4LogicalVolume.hh"
#include "G4SystemOfUnits.hh"
#include "G4PVPlacement.hh"
G4VPhysicalVolume* DetectorConstruction::Construct() {
// Solid
auto solid_world = new G4Box("world", 638 / 2 * mm, 630 / 2 * mm, 555. / 2 * mm);
// Logic
auto nist = G4NistManager::Instance();
auto logic_world = new G4LogicalVolume(solid_world, nist->FindOrBuildMaterial("G4_WATER"), "world");
// Physics
auto physics_world = new G4PVPlacement(
0,
G4ThreeVector(0, 0, 0),
logic_world,
"world",
0,
false,
0,
true
);
return physics_world;
}

22
src/ParticleSource.cpp Normal file
View File

@ -0,0 +1,22 @@
#include "ParticleSource.h"
#include "G4ParticleTable.hh"
#include "G4SystemOfUnits.hh"
GeneratorAction::GeneratorAction() {
auto table = G4ParticleTable::GetParticleTable();
particleGun = new G4ParticleGun(1);
particleGun->SetParticleDefinition(table->FindParticle("gamma"));
particleGun->SetParticlePosition(G4ThreeVector(0, 0, 555. / 2 * mm));
particleGun->SetParticleMomentumDirection(G4ThreeVector(0, 0, -1));
particleGun->SetParticleEnergy(1 * MeV);
}
GeneratorAction::~GeneratorAction() {
delete particleGun;
}
void GeneratorAction::GeneratePrimaries(G4Event* e) {
particleGun->GeneratePrimaryVertex(e);
}

30
vis.mac Normal file
View File

@ -0,0 +1,30 @@
# 多线程设置
/run/numberOfThreads 1
# verbose
/control/verbose 2
/control/saveHistory
/run/verbose 2
# 初始化
/run/initialize
# 设置视图使用OpenGL
/vis/open OGL 800x800-0+0
# 禁止自动刷新,消息静音(除错误外)
/vis/viewer/set/autoRefresh false
/vis/verbose errors
# 绘制集合体
/vis/drawVolume
# 绘制轨迹 类型为平滑
/vis/scene/add/trajectories smooth
# 根据粒子ID进行绘制
/vis/modeling/trajectories/create/drawByParticleID
# 以2px的宽度绘制节点
/vis/modeling/trajectories/drawByParticleID-0/default/setDrawStepPts true
/vis/modeling/trajectories/drawByParticleID-0/default/setStepPtsSize 2
# 保留、叠加所有事例
/vis/scene/endOfEventAction accumulate