生成器操作


这些示例需使用 GEMC 0.5 或更高版本。 有关可执行文件和 Python 环境,请参阅安装指南。

十一张相互独立的控制卡分别演示顶点展宽、固定角度和角度采样。 每张卡都在同一个小型管状靶内生成一个 1 GeV 的 geantino,用以表示一次靶事件。 下面的图表来自新运行的模拟: 每张卡采样 5,000 次,绘图前均与生成粒子记录进行核对。每个用例还包含 对应的 100 个事件的 GEMC 视图。

浏览示例源码,其中包含几何结构、完整的 YAML 控制卡和自动化检查。

快速开始

从 GEMC 安装目录中复制该示例,并生成其 ASCII 几何结构:

cp -r "$GEMC_HOME/examples/basic/generator_manipulations" .
cd generator_manipulations
python generator_manipulations.py -f ascii
gemc uniform_z.yaml -gui

使用 GUI 的 beam-on 控件生成事件,然后打开 Analyzer。XY 展宽控制卡会配置一张二维图, 以 Y 为纵轴、X 为横轴。Z 展宽和固定角度控制卡会配置三个直方图;其他控制卡则配置四张图。 所有控制卡都启用跨 beam-on 调用的数据累积功能。GUI Analyzer 需要 Qt Charts。 运行任意控制卡时,省略 -gui 即可改为生成一个使用固定随机种子的、包含 5,000 个事件的 CSV 样本:

gemc uniform_z.yaml

每张控制卡都有各自的输出前缀。例如,uniform_z 会产生生成粒子信息和真实信息 CSV 数据流,用于核对靶记录的顶点是否与采样生成的顶点完全一致。

几何结构与记录量

真空世界体中包含一个液氢管,以原点为中心,半径为 25 mm,全长为 40 mm,以 20% 的不透明度显示,以便透过它看到轨迹。 其 flux 灵敏探测设置会记录在靶内产生的粒子。展宽用于模拟靶事件的产生 顶点。 geantino 不发生散射,也不产生次级粒子;recordZeroEdep: true 会保留它们在靶中的命中记录。 在这些配置下,每个采样生成的粒子都会产生一个命中记录。

Geantinos originating at smeared vertices inside the transparent cylindrical target
The shared tube target with 100 events from the uniform-Z card, rendered by GEMC.

顶点图使用靶真实信息中的 vx、vy 和 vz,单位为 mm。这些是原始的 径迹顶点。avgx、avgy 和 avgz 字段则描述粒子在靶内的位置。 角度图使用保留下来的动量分量 px、py 和 pz,单位为 MeV/c。

网站图表使用 pygemc Analyzer 的绘图函数,变量和布局在每张控制卡的 ganalysis 块中定义。这些离线图使用的数据字段与 GUI 中显示的相同。网站的 Z 展宽图将 X 和 Y 直方图放在上方,下方的 Z 直方图横跨两列;固定角度图则将 三个直方图排成一行。GUI 使用单面板或四绘图区布局。

顶点用例

展宽控制卡使用偏移后的中心 (2, -3, 0) mm,以展示随机偏移量如何叠加到 标称位置上。Z 展宽使用 theta = 90 度;XY 和球体展宽使用 theta = 45 度。 所有顶点展宽控制卡都使用 phi = 90 度。 均匀 XY 展宽和高斯 XY 展宽分别独立改变两个横向坐标,并显示以 Y 为纵轴、X 为横轴的二维 分布图。单独的均匀 Z 展宽和高斯 Z 展宽控制卡用于独立展示纵向展宽。

Uniform z

Uniform half-width in z; the other two coordinates stay fixed.

完整的 uniform_z.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 90*deg
  phi: 90*deg
  vx: 2*mm
  vy: -3*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 20*mm
  randomVertexModel: uniform
Uniform z
GEMC:Uniform z 的 100 个事件。
Uniform z
Uniform half-width in z; the other two coordinates stay fixed.

Uniform X and Y

Independent uniform x in [0, 4] mm and y in [-6, 0] mm; z = 0 mm.

完整的 uniform_xy.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 45*deg
  phi: 90*deg
  vx: 2*mm
  vy: -3*mm
  vz: 0*mm
  delta_vx: 2*mm
  delta_vy: 3*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Uniform X and Y
GEMC:Uniform X and Y 的 100 个事件。
Uniform X and Y
Independent uniform x in [0, 4] mm and y in [-6, 0] mm; z = 0 mm.

Gaussian z

Gaussian sigma in z; the other two coordinates stay fixed.

完整的 gaussian_z.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 90*deg
  phi: 90*deg
  vx: 2*mm
  vy: -3*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 3*mm
  randomVertexModel: gaussian
Gaussian z
GEMC:Gaussian z 的 100 个事件。
Gaussian z
Gaussian sigma in z; the other two coordinates stay fixed.

Gaussian X and Y

Independent Gaussian x/y: means (2, -3) mm, sigmas (4, 5) mm; z = 0 mm.

完整的 gaussian_xy.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 45*deg
  phi: 90*deg
  vx: 2*mm
  vy: -3*mm
  vz: 0*mm
  delta_vx: 4*mm
  delta_vy: 5*mm
  delta_vz: 0*mm
  randomVertexModel: gaussian
Gaussian X and Y
GEMC:Gaussian X and Y 的 100 个事件。
Gaussian X and Y
Independent Gaussian x/y: means (2, -3) mm, sigmas (4, 5) mm; z = 0 mm.

Sphere

Uniform sphere centered at (2, -3, 0) mm; radius = sqrt(1^2 + 2^2 + 2^2) = 3 mm.

完整的 sphere.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 45*deg
  phi: 90*deg
  vx: 2*mm
  vy: -3*mm
  vz: 0*mm
  delta_vx: 1*mm
  delta_vy: 2*mm
  delta_vz: 2*mm
  randomVertexModel: sphere
Sphere
GEMC:Sphere 的 100 个事件。
Sphere
Uniform sphere centered at (2, -3, 0) mm; radius = sqrt(1^2 + 2^2 + 2^2) = 3 mm.

角度用例

角度控制卡将顶点固定在靶中心 (0, 0, 0) mm。randomThetaModel 支持 uniform、 gaussian 和 cosine。 对于 uniform,delta_theta 是半宽;对于 gaussian,它是标准差。 cosine 模型在 theta +/- delta_theta 范围内对 cos(theta) 进行均匀采样,因此 theta 的概率密度正比于 sin(theta),且角度范围限制在 [0, 180] 度内。 theta 展宽控制卡使用 delta_theta: 20*deg 和标称 theta = 2 度。均匀采样范围为 [-18, 22] 度;高斯采样的均值为 2 度,标准差为 20 度。负 theta 会反转 横向动量:重建出的极角为非负值,方位角偏移 180 度。 余弦采样范围为 [0, 22] 度,因为采样值被限制在物理极角范围内。 phi 始终采用均匀采样,半宽为 delta_phi;没有 randomPhiModel。

对于动量 p,预期的分量为:

px = p sin(theta) cos(phi)
py = p sin(theta) sin(phi)
pz = p cos(theta)

固定 theta 和 phi 的控制卡将两个角度分别设为 3 度和 45 度,并仅显示三个 动量直方图。均匀、高斯和余弦 theta 采样用例的二维图均以 px 为纵轴、pz 为横轴。 余弦 theta 采样用例还会得到均匀的 pz 分布。固定 theta 并对 phi 进行展宽时,会在 px/py 投影中描出一段圆弧。角度回绕用例跨越 360 度时,动量仍保持连续。 生成粒子数据组中的角度以弧度存储;控制卡则显式使用度作为单位。

Fixed theta and phi

Fixed theta = 3 deg and phi = 45 deg.

完整的 fixed_theta_and_phi.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 3*deg
  delta_theta: 0*deg
  randomThetaModel: uniform
  phi: 45*deg
  delta_phi: 0*deg
  vx: 0*mm
  vy: 0*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Fixed theta and phi
GEMC:Fixed theta and phi 的 100 个事件。
Fixed theta and phi
Fixed theta = 3 deg and phi = 45 deg.

Uniform theta

Theta uniform on [-18, 22] deg; phi = 0 deg.

完整的 uniform_theta.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 2*deg
  delta_theta: 20*deg
  randomThetaModel: uniform
  phi: 0*deg
  delta_phi: 0*deg
  vx: 0*mm
  vy: 0*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Uniform theta
GEMC:Uniform theta 的 100 个事件。
Uniform theta
Theta uniform on [-18, 22] deg; phi = 0 deg.

Gaussian theta

Theta Gaussian with mean 2 deg and sigma 20 deg; phi = 0 deg.

完整的 gaussian_theta.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 2*deg
  delta_theta: 20*deg
  randomThetaModel: gaussian
  phi: 0*deg
  delta_phi: 0*deg
  vx: 0*mm
  vy: 0*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Gaussian theta
GEMC:Gaussian theta 的 100 个事件。
Gaussian theta
Theta Gaussian with mean 2 deg and sigma 20 deg; phi = 0 deg.

Cosine theta

cos(theta) uniform between cos(22 deg) and cos(0 deg); phi = 0 deg.

完整的 cosine_theta.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 2*deg
  delta_theta: 20*deg
  randomThetaModel: cosine
  phi: 0*deg
  delta_phi: 0*deg
  vx: 0*mm
  vy: 0*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Cosine theta
GEMC:Cosine theta 的 100 个事件。
Cosine theta
cos(theta) uniform between cos(22 deg) and cos(0 deg); phi = 0 deg.

Uniform phi

Phi uniform on [45, 135] deg at theta = 45 deg.

完整的 uniform_phi.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 45*deg
  delta_theta: 0*deg
  randomThetaModel: uniform
  phi: 90*deg
  delta_phi: 45*deg
  vx: 0*mm
  vy: 0*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Uniform phi
GEMC:Uniform phi 的 100 个事件。
Uniform phi
Phi uniform on [45, 135] deg at theta = 45 deg.

Phi wraparound

Phi uniform on [330, 370] deg, crossing 360 deg, at theta = 45 deg.

完整的 phi_wraparound.yaml

粒子设置
gparticle:
- name: geantino
  p: 1*GeV
  theta: 45*deg
  delta_theta: 0*deg
  randomThetaModel: uniform
  phi: 350*deg
  delta_phi: 20*deg
  vx: 0*mm
  vy: 0*mm
  vz: 0*mm
  delta_vx: 0*mm
  delta_vy: 0*mm
  delta_vz: 0*mm
  randomVertexModel: uniform
Phi wraparound
GEMC:Phi wraparound 的 100 个事件。
Phi wraparound
Phi uniform on [330, 370] deg, crossing 360 deg, at theta = 45 deg.

验证与复现

在已配置好的 GEMC 源码树中,运行全部 11 项检查:

meson test -C build --suite generator_manipulations --print-errorlogs

这些检查要求每个顶点都位于靶内,且每次采样生成的粒子在靶中恰好产生一个命中记录。检查会匹配事件 ID 和 顶点,比较动量分量,重建 theta 和 phi 并按 360 度取模进行比较,还会检验预期的 概率分布。 XY 检查还会验证横向采样值之间不相关。测试会在临时目录中生成新的几何结构和 输出,因此每个用例也都能独立运行。

要从网站仓库重新生成本页的图像和粒子设置:

python3 scripts/generate_example_assets.py generator_manipulations

网站的资源指南说明了所需的本地环境。 另请参阅内部生成器指南。