2.1 PPAC 信号处理-I
%jsroot on
1. PPAC
- 电离与雪崩:带电粒子穿过 PPAC 的工作气体(通常为 $C_3F_8$ 或 $C_4H_{10}$),在路径上产生初级电离。电子在强电场作用下向阳极漂移并发生 Townsend 雪崩。
- 感应信号:
- 阳极 (Anode):一整块薄镀铝 Mylar 膜。雪崩电子被阳极收集,产生快速的时间信号 $t_a$,作为该粒子到达 PPAC 的参考时间。
- 阴极 (Cathode):分成 1mm 间隔的读数条 (Strips),X 和 Y 方向正交。阳极上的雪崩会在阴极条上产生感应电荷信号。
Delay-line 读出原理
阴极条之间通过高精度的电磁延迟线(Delay Line)连接。感应信号会沿延迟线向两端传输。
- $T_{xdelay}/T_{ydelay}$:信号在x/y方向延迟线上的总传播时间(常数)。
- $Q$:感应信号的幅度。
假设粒子击中位置为 $x$ (以中心为0),延迟线总长度为 $L$,信号在延迟线内部传输时间(设信号传输速度 $v_d = L/T_{xdelay}$): $$ \begin{align} &T_{xdelay} = t_{x1} + t_{x2} \\ &t_{x1} = \left(\frac{L}{2} + x \right) \frac{T_{xdelay}}{L} \\ &t_{x2} = \left(\frac{L}{2} - x \right) \frac{T_{xdelay}}{L} \\ &x = (t_{x1} - t_{x2}) \frac{L}{2 T_{xdelay}} \end{align} $$

PPAC Position Calibration
- 将 $\alpha$-放射源置于远处,$\alpha$ 粒子入射到盖有 Mask 的探测器上(Mask上孔的位置分布已知),得到 x 方向和 y 方向的一系列峰位。通过拟合时间差谱 $(\Delta t_{x1} - \Delta t_{x2})$ 的峰位和实际物理位置,得到线性刻度 $x=k\,\Delta t+b$。理想模型给出 $k=L/(2T_{xdelay})$;实际采用 mask 峰位的拟合结果,并检查各孔位置的 residual。
- 探测器安装到束流线后,通过位置测量,确定探测器中心相对于束流中心线的偏移 $b$。
- 实验中,通过测量经过中心线的束流(利用限制束流线上的 slit 狭缝),进一步检验和校准上述偏移。

2. 实验设置:
实验中,F8PPAC1-3 用于测量靶前束流的入射方向和轨迹。靶后有两套探测系统:
- MUST2 望远镜系统:测量反应产生的轻粒子。
- 零度磁谱仪 (ZDS):探测剩余重核。
几何布局优化: 为了减少散射粒子在靶内的能量损失,靶框被旋转 45° 朝向望远镜摆放。靶前放置了由厚铁块组成的屏蔽体,用于阻挡束流晕(Beam Halo),避免偏离中心线的非物理粒子击中靶后的探测系统。

两种类型 PPAC
实验中采用了两种不同规格尺寸的 PPAC:
- 一种是 double PPAC (F8PPAC1, F8PPAC2),面积为 $240 \times 150 \text{ mm}^2$。
- 另一种是 single PPAC (F8PPAC3),面积为 $100 \times 100 \text{ mm}^2$。

实际PPAC 信号
- Trigger (time start): Plastic scintillator (塑闪)
- 飞行时间 ($TOF$):粒子从塑闪飞到 PPAC 的时间
- 阴极,阳极信号的 offset:$t_{off,x1},t_{off,x2},t_{off,a}$
- TDC 记录的绝对时间信号:$T_{x1},T_{x2},T_a$
阴极时间 (包含束流速度依赖性)
TDC 记录的时间不仅包含了信号在探测器内的传输时间,还包含了粒子的飞行时间 ($TOF$) 和硬件 offset:
- $T_{x1} = TOF + t_{x1} + t_{off,x1}$
- $T_{x2} = TOF + t_{x2} + t_{off,x2}$
- $T_{x1} + T_{x2} = 2 TOF + T_{xdelay} + (t_{off,x1} + t_{off,x2})$
- $T_{x1} - T_{x2} = t_{x1} - t_{x2} + (t_{off,x1} - t_{off,x2})$
阳极时间
- $T_a = TOF + t_{off,a}$
组合参数 (相对时间,消除速度依赖性)
上述绝对时间信号不仅与探测器内部传输有关,也与束流的到达时间 ($TOF$) 有关。研究探测器特征时,可先消除公共 $TOF$ 引入的展宽。 通过将阴极信号减去阳极信号,可以抵消 $TOF$的影响:
- $\Delta T_{x1} = T_{x1} - T_a = t_{x1} + (t_{off,x1} - t_{off,a})$
- $\Delta T_{x2} = T_{x2} - T_a = t_{x2} + (t_{off,x2} - t_{off,a})$
- $\Delta T_{x1} - \Delta T_{x2} = t_{x1} - t_{x2} + (t_{off,x1} - t_{off,x2})$
探测器两端信号关联
- $\mathbf{T_{x1} + T_{x2}} = 2 TOF + Const.$ (包含 $TOF$,与束流速度有关,分布表现为一个较宽的峰)
- $\mathbf{\Delta T_{x1} + \Delta T_{x2}} = t_{x1} + t_{x2} + (t_{off,x1} + t_{off,x2} - 2t_{off,a}) = T_{xelay} + Const. = \mathbf{Const.}$ (公共到达时间被抵消,分布通常变窄;宽度包含两端及 anode 定时误差和相关项。)
文件中 TreeBranch 的定义
- 触发样本可用 beamTrig || must2Trig 选择;两个标记也可能同时为 1。
beamTrig=1,由靶前塑闪探测器触发(束流的取样触发)。must2Trig=1,由靶后 MUST2 望远镜信号触发(即物理事件符合触发)。
- F8PPACRawData[i][j] - Raw Data (原始信息,TDC 道值)
| Branch | PPAC |
|---|---|
F8PPACRawData[0][0] |
PPAC 1 Layer A $T_{x1}$ |
F8PPACRawData[0][1] |
PPAC 1 Layer A $T_{x2}$ |
F8PPACRawData[0][2] |
PPAC 1 Layer A $T_{y1}$ |
F8PPACRawData[0][3] |
PPAC 1 Layer A $T_{y2}$ |
F8PPACRawData[0][4] |
PPAC 1 Layer A $T_a$ |
F8PPACRawData[1][0-4] |
PPAC 1 Layer B |
F8PPACRawData[2][0-4] |
PPAC 2 Layer A |
F8PPACRawData[3][0-4] |
PPAC 2 Layer B |
F8PPACRawData[4][0-4] |
PPAC 3 |
这里 L 指有效读出宽度,T_delay 是两端之间的总延迟。x 的正方向须与两端编号一致;实际刻度的斜率正负由接线和坐标约定确定。位置通道的和减去两倍 anode 时间可消除公共到达时间,但其宽度包含三个通道的测量误差及相关项,不能直接当作单个通道的分辨。
2. 原始信号与 time-sum
先查看各路 TDC 道值。这个文件的编码范围为 0–4095;以下用 10–4000 排除端点附近的无效读数,再检查时间组合的分布。这里仍是 TDC channel,尚未换算为时间单位。
//%jsroot on
TFile *ipf = new TFile("f8ppac001.root");// $HOME/data/MUST2@BigRIPS/ROOTFILE/
TTree *tree = (TTree*) ipf->Get("tree");
TCanvas *c1 = new TCanvas;
t_x1/t_x2
tree->Draw("F8PPACRawData[0][0] >> h_raw_tx1(1000, 0, 4200)");
tree->Draw("F8PPACRawData[0][1] >> h_raw_tx2(1000, 0, 4200)","","same");
c1->SetLogy();
c1->Draw();
t_y1/t_y2
tree->Draw("F8PPACRawData[0][2] >> h_raw_ty1(1000, 0, 4200)");
tree->Draw("F8PPACRawData[0][3] >> h_raw_ty2(1000, 0, 4200)","","same");
c1->SetLogy();
c1->Draw();
ta
tree->Draw("F8PPACRawData[0][4]>>hraw_ta(1000,0,4200)");//F8PPAC1A-Ta
c1->Draw();
组合参数
- SetAlias : 设置别名
tree->SetAlias("t_x1", "F8PPACRawData[0][0]");
tree->SetAlias("t_x2", "F8PPACRawData[0][1]");
tree->SetAlias("t_y1", "F8PPACRawData[0][2]");
tree->SetAlias("t_y2", "F8PPACRawData[0][3]");
tree->SetAlias("t_a", "F8PPACRawData[0][4]");
tree->SetAlias("dt_x1", "(t_x1 - t_a)");
tree->SetAlias("dt_x2", "(t_x2 - t_a)");
tree->SetAlias("dt_y1", "(t_y1 - t_a)");
tree->SetAlias("dt_y2", "(t_y2 - t_a)");
TCut cut_xvalid = "t_a>10 && t_a<4000 && t_x1>10 && t_x1<4000 && t_x2>10 && t_x2<4000";
TCut cut_yvalid = "t_a>10 && t_a<4000 && t_y1>10 && t_y1<4000 && t_y2>10 && t_y2<4000";
dt_x1/dt_x2
tree->Draw("dt_x1 >> h1_dtx1(2000, -4000, 4000)", cut_xvalid);
tree->Draw("dt_x2 >> h1_dtx2(2000, -4000, 4000)", cut_xvalid, "same");
c1->SetLogy();
c1->Draw();
dt_x2 : dt_x1
- $\mathbf{\Delta T_{x1} + \Delta T_{x2}} = T_{xdelay} + Const. = \mathbf{Const.}$
dt_y2 : dt_y1
- $\mathbf{\Delta T_{y1} + \Delta T_{y2}} = T_{ydelay} + Const. = \mathbf{Const.}$
TCanvas *c3 = new TCanvas("c3","c3",1000,400);
c3->Divide(2,1);
c3->cd(1);
tree->Draw("dt_x2 : dt_x1 >> h2_corrx(1000, -2000, 2000, 1000, -2000, 2000)", cut_xvalid, "colz");
c3->cd(2);
tree->Draw("dt_y2 : dt_y1 >> h2_corry(1000, -2000, 2000, 1000, -2000, 2000)", cut_yvalid, "colz");
c3->SetLogy(0);
c3->Draw();
TCanvas *c4 = new TCanvas("c4","Time sums",1000,400);
c4->Divide(2,1);
c4->cd(1);
tree->Draw("dt_x2+dt_x1>>hdt_xsum(1500,0,1500)",cut_xvalid,"hist");
TH1 *hdt_xsum = (TH1*)gROOT->FindObject("hdt_xsum");
double xm = hdt_xsum->GetBinCenter(hdt_xsum->GetMaximumBin());
TF1 *fx = new TF1("fx","gaus",xm-25,xm+25); // 只拟合主峰附近
hdt_xsum->Fit(fx,"RQ");
fx->Draw("same");
double xpeak=fx->GetParameter(1), xsigma=abs(fx->GetParameter(2));
gPad->SetLogy();
c4->cd(2);
tree->Draw("dt_y2+dt_y1>>hdt_ysum(1500,0,1500)",cut_yvalid,"hist");
TH1 *hdt_ysum = (TH1*)gROOT->FindObject("hdt_ysum");
double ym = hdt_ysum->GetBinCenter(hdt_ysum->GetMaximumBin());
TF1 *fy = new TF1("fy","gaus",ym-25,ym+25);
hdt_ysum->Fit(fy,"RQ");
fy->Draw("same");
double ypeak=fy->GetParameter(1), ysigma=abs(fy->GetParameter(2));
gPad->SetLogy();
cout << "X sum: mean=" << xpeak << ", sigma=" << xsigma << " channels\n"
<< "Y sum: mean=" << ypeak << ", sigma=" << ysigma << " channels\n";
c4->Draw();
X sum: mean=1172.2, sigma=7.88441 channels Y sum: mean=661.904, sigma=8.68733 channels
Time-sum 选择
正常的两端信号应满足近似固定的 time-sum。若两粒子在延迟线传输时间内到达,两端可能记录了不同粒子的最早信号,time-sum 就可能偏小。δ rays 也可造成提前的读出信号。因此,峰外事件不能全称为 pileup,落在峰内也不能保证没有重叠。
下面以主峰的 ±3σ 作为示例 gate。先看上图主峰和尾部,再选择保留范围;σ 来自主峰附近的 Gaussian 拟合,不是对整个尾部的拟合。gate 的宽度决定了选择效率。
参考:H. Kumagai et al., Development of Parallel Plate Avalanche Counter PPAC for BigRIPS fragment separator, arXiv:1311.0215 (2013)。文中讨论了 delay-line time-sum 与 δ-ray 效应。
TString scut_xsum = Form("abs(dt_x2 + dt_x1 - %f) < 3 * %f", xpeak, xsigma);
TString scut_ysum = Form("abs(dt_y2 + dt_y1 - %f) < 3 * %f", ypeak, ysigma);
TCut cut_xsum = scut_xsum.Data() && cut_xvalid;
TCut cut_ysum = scut_ysum.Data() && cut_yvalid;
TCut cut_xysum = cut_xsum && cut_ysum;
TCanvas *c1 = new TCanvas;
tree->Draw("dt_y1-dt_y2:dt_x1-dt_x2",cut_xysum, "colz");
gPad->SetLogy(0);
gPad->SetLogz();
c1->Draw();
