现代核物理模拟项目管理与目录结构教程#
本教程总结一个适用于 Geant4 + ROOT + C++ + CMake + GoogleTest 的现代科研项目结构,并给出实践经验与最佳实践。非常适用于核物理模拟、探测器重建、大型 C++ 科学代码开发。
1. 总体架构理念#
一个良好的科研模拟项目应满足:
- 模块化:模拟(Geant4)、数据结构(datatypes)、重建(reconstruction)互相解耦。
- 可测试性:每个模块可单独做单元测试,全链路可做集成测试。
- 运行时与构建时分离:配置、宏、几何、参数文件不参与编译。
- 清晰的数据流:data/raw → data/sim → data/reco → scripts/analysis。
- 可扩展
2. 推荐目录结构#
your_project/
│
├── CMakeLists.txt
├── cmake/ # FindXXX.cmake, 工具CMake脚本
│
├── libs/ # 所有核心 C++ 库
│ ├── datatypes/ # 事件、Hit、Track 等核心数据类型
│ │ ├── include/
│ │ ├── src/
│ │ └── tests/
│ ├── g4sim/ # Geant4 模拟库
│ │ ├── include/
│ │ ├── src/
│ │ ├── tests/
│ │ └── macros/ (可选)
│ └── reconstruction/ # 重建算法库(tracking, clustering)
│ ├── include/
│ ├── src/
│ └── tests/
│
├── apps/ # 可执行程序
│ ├── run_sim/ # 调用 g4sim 的主程序
│ ├── run_reco/ # 调用 reconstruction 的主程序
│ └── run_optimize/ # 参数优化程序(C++)
│
├── configs/ # 所有运行时配置(不参与编译)
│ ├── geant4/
│ │ ├── macros/ # G4 宏
│ │ ├── materials/
│ │ └── geometry/
│ ├── reconstruction/ # 重建参数 YAML/JSON
│ └── optimize/ # 优化脚本所需参数
│
├── data/ # 运行所得数据
│ ├── raw/ # 外部输入数据
│ ├── sim/ # Geant4 输出文件
│ ├── reco/ # 重建后的数据
│ └── calib/ # 标定参数(gain, offset)
│
├── scripts/ # Python 工具脚本
│ ├── analysis/
│ ├── optimize/
│ ├── visualize/
│ └── utils/
│
├── tests/ # 集成测试(非单元测试)
│ ├── unit/
│ └── integration/
│
└── results/ # 输出图片、拟合结果(未纳入git)
3. 顶层 CMakeLists.txt 结构#
cmake_minimum_required(VERSION 3.20)
project(YourProject LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
# 引入 cmake/ 下的模块
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
# 寻找依赖包
find_package(Geant4 REQUIRED)
find_package(ROOT REQUIRED)
# 开启测试框架
enable_testing()
# 子模块
add_subdirectory(libs)
add_subdirectory(apps)
add_subdirectory(tests)
CMake 的职责:
- 管理库(libs)
- 编译可执行(apps)
- 建立测试(tests)
- 不处理任何数据文件
4. datatypes 库#
职责:
- 定义 Event / Hit / Track 等基本结构
- 无 Geant4 或 ROOT 依赖(保持“纯净”)
目录:
libs/datatypes/
include/yourproj/
src/
tests/
CMake:
add_library(datatypes
src/Event.cpp
src/Hit.cpp
)
target_include_directories(datatypes PUBLIC include)
add_subdirectory(tests)
单元测试:
add_executable(test_datatypes test_event.cpp)
target_link_libraries(test_datatypes PRIVATE datatypes GTest::gtest_main)
add_test(NAME test_datatypes COMMAND test_datatypes)
5. Geant4 模拟库 g4sim#
职责:
- DetectorConstruction
- PhysicsList
- RunAction / EventAction
- 输入/输出管理
目录:
libs/g4sim/
include/
src/
tests/
macros/ (可选)
CMake:
add_library(g4sim
src/DetectorConstruction.cpp
src/PhysicsList.cpp
src/PrimaryGenerator.cpp
)
target_link_libraries(g4sim PUBLIC datatypes Geant4::G4run Geant4::G4vis)
单元测试只做:
- 初始化成功否
- Geometry 构建是否报错
(不跑真实模拟,因为耗时太长)
6. reconstruction 库#
职责:
- cluster / tracking / PID
- calibration
- energy reconstruction
目录:
libs/reconstruction/
include/
src/
tests/
CMake:
add_library(reconstruction
src/TrackerReconstruction.cpp
src/CalorimeterReconstruction.cpp
)
target_include_directories(reconstruction PUBLIC include)
target_link_libraries(reconstruction PUBLIC datatypes ROOT::Core)
7. 可执行程序 apps/#
示例:
apps/run_sim/main.cpp
apps/run_reco/main.cpp
apps/run_optimize/main.cpp
CMake:
add_executable(run_sim main.cpp)
target_link_libraries(run_sim PRIVATE g4sim datatypes)
add_executable(run_reco main.cpp)
target_link_libraries(run_reco PRIVATE reconstruction datatypes)
运行:
./build/apps/run_sim/run_sim -m configs/geant4/macros/run.mac -o data/sim/out.root
8. configs/(非常重要)#
配置与代码分离,将宏、几何、重建参数全部放这里:
configs/
geant4/
macros/run.mac
geometry/detector.gdml
materials/materials.txt
reconstruction/
tracker.yaml
calibration.yaml
optimize/
grid_search.yaml
优点:
- 不触发重新编译
- 参数可版本管理
- apps/ 可以灵活调用
9. data/(统一管理模拟与重建数据)#
data/
raw/
sim/
reco/
calib/
所有模拟输出、重建结果都按阶段放置。
10. scripts/(Python 工具)#
分类建议:
scripts/
analysis/ 数据分析
optimize/ 参数优化(scipy/numba)
visualize/ 可视化(matplotlib/root_numpy)
utils/ 辅助代码
11. tests/(单元 + 集成测试)#
tests/
unit/ 调用各库的测试
integration/ 全链路:G4 → Reco → Output
集成测试示例:
test_full_pipeline.cpp
内容:
- 用微型宏生成 2~3 个 event
- 跑重建
- 检查输出 Tree 是否包含期望 branch
12. results/(不纳入 git)#
用于保存:
- 图像
- 拟合结果
- 优化输出
在 .gitignore 中添加:
results/
data/sim/
data/reco/
13. 最终数据流#
configs/geant4/macros → run_sim → data/sim/*.root
data/sim/*.root + configs/reconstruction/*.yaml
→ run_reco → data/reco/*.root
scripts/analysis/*.py → produce results/
14. 总结#
一个现代核物理模拟项目需要:
- 清晰的模块边界(datatypes / sim / reco)
- 完整的构建系统(CMake)
- 可测试性(GoogleTest + CTest)
- 运行配置尽量放 configs/
- 数据与代码解耦
- Python 辅助分析脚本 standards
最后更新:
2025-11-18
创建日期: 2025-11-18
创建日期: 2025-11-18