反应 $Q$ 值重建¶

反应 $Q$ 值基本定义¶

对于核反应

$$ A(a,b)B, $$

反应 $Q$ 值定义为末态与初态动能之差:

$$ Q = E_{KB}+E_{Kb}-E_{KA}-E_{Ka}. \tag{1} $$

在相对论形式下,粒子 $i$ 的总能量写为

$$ E_i = E_{Ki}+m_i, \tag{2} $$

其中 $E_{Ki}$ 为动能,$m_i$ 为静质量。在自然单位 $c=1$ 下,将式(2)代入式(1),可得

$$ Q = m_A+m_a-m_B-m_b. \tag{3} $$

若粒子 $i$ 处于激发态,其质量写为

$$ m_i = m_{i0}+E_{x,i}, $$

其中 $m_{i0}$ 为基态质量,$E_{x,i}$ 为激发能。于是,当所有初末态粒子均处于基态时,基态 $Q$ 值为

$$ Q_{gs}=m_{A0}+m_{a0}-m_{B0}-m_{b0}. \tag{4} $$

若末态核 $B$ 处于激发态,则有

$$ Q = Q_{gs}-E_{x,B}. \tag{5} $$

因此,当某个激发态的退激辐射没有被实验直接探测到时,其激发能将表现为重建 $Q$ 值相对于 $Q_{gs}$ 的偏移;反过来,也可以通过 $Q$ 值重建来反推出该激发能。


$^{14}\mathrm C$ 束流在 $(\mathrm{CH})_n$ 靶上的反应:¶

$$ {}^{1}\mathrm H({}^{14}\mathrm C,{}^{14}\mathrm C^{*}){}^{1}\mathrm H, $$

和

$$ {}^{12}\mathrm C({}^{14}\mathrm C,{}^{14}\mathrm C^{*}){}^{12}\mathrm C. $$

两类反应都采用相同的级联两体衰变图像。入射 $^{14}\mathrm C$ 束流首先与靶核作用,产生反冲粒子和激发态 $^{14}\mathrm C^{*}$;随后

$$ {}^{14}\mathrm C^{*}\rightarrow {}^{4}\mathrm{He}+{}^{10}\mathrm{Be}^{*}, $$

再进一步

$$ {}^{10}\mathrm{Be}^{*}\rightarrow {}^{10}\mathrm{Be}+\gamma. $$

若该退激 $\gamma$ 未被探测,则缺失的激发能不会直接出现在带电粒子的动能求和中,而会表现为 $Q$ 值相对于 $Q_{gs}$ 的偏移。因此,本节 $Q$ 值分析的基本思想就是:利用带电末态粒子的运动学信息重建 $Q$ 值,并由其偏移反推出 $^{10}\mathrm{Be}^{*}$ 的激发能。

No description has been provided for this image


$Q$ 值测量对于不变质量谱(Invariant Mass)的意义¶

在实验中,母核 $^{14}\mathrm{C}^*$ 的激发能通常通过 $\alpha$ 与 $^{10}\mathrm{Be}$ 的不变质量谱(Invariant Mass Spectrum) 来重建: $$ M_{inv} = \sqrt{(\sum E_i)^2 - (\sum \vec{p}_i)^2} $$ $$ E_x(^{14}\mathrm{C}) = M_{inv} - m_{14\mathrm{C}, gs} $$ 但是,这要求准确知道末态粒子的状态。如果 $^{10}\mathrm{Be}$ 处于激发态(例如 3.368 MeV)并释放了未被探测的 $\gamma$ 光子,而我们在计算不变质量时依然错误地假设它处于基态且未丢失能量,那么重建出的 $^{14}\mathrm{C}^*$ 激发能将会产生明显偏移,导致物理假峰或能级错位。

因此,$Q$ 值重建是不变质量谱分析的严格前置步骤:

  1. 反应道甄别:通过重建的 $Q$ 值(如 $Q \approx Q_{gs}$ 或是 $Q \approx Q_{gs} - 3.368\text{ MeV}$),我们可以逐事件(Event-by-event)判定该事件中的 $^{10}\mathrm{Be}$ 到底处于基态还是激发态。
  2. 修正激发能:一旦通过 $Q$ 值谱确认了 $^{10}\mathrm{Be}^*$ 的分支,就能在后续的不变质量计算中,对那些伴随 $\gamma$ 丢失的事件补偿相应的激发能(或剔除对应本底),从而提取出纯净且位置准确的母核 $^{14}\mathrm{C}^*$ 激发态能级。

$Q$ 值重建方法¶

反应初态¶

束流动能 $E_{K,^{14}\mathrm C}$ 在实验中通常不能逐事件直接测量,其平均值 $\bar E_{K,^{14}\mathrm C}$ 由加速器的偶极磁铁 $B\rho$ 给出。对于稳定束流,能散可以近似忽略,$\Delta E_{K,^{14}\mathrm C}\to 0;$

对于放射性束流,则通常有$\Delta E/E\sim 1\%$。 这会直接影响 $Q$ 值分辨。

反应末态¶

反应中,没有测量$\gamma$信息,因此实验上可用于 $Q$ 值重建的带电末态粒子为

$$ {}\mathrm H/{}^{12}\mathrm C,\quad {}^{4}\mathrm{He},\quad {}^{10}\mathrm{Be}, $$

其可测量量为动能 $E_{Ki}$ 和动量 $\vec p_i$。

(1)利用束流信息直接重建¶

若束流逐事件能量已知,则可定义

$$ Q_{\mathrm{event}} = E_{k,\alpha}+E_{k,^{10}\mathrm{Be}}+E_{k,\mathrm{recoil}}-E_{k,\mathrm{beam}}^{\mathrm{event}} . $$

若束流逐事件能量不可得,而仅知道平均束流能量 $\bar E_{k,\mathrm{beam}}$,则可定义

$$ Q_{\mathrm{mean}} = E_{k,\alpha}+E_{k,^{10}\mathrm{Be}}+E_{k,\mathrm{recoil}}-\bar E_{k,\mathrm{beam}} . $$ 其中 $Q_{\mathrm{mean}}$ 更接近实验中仅由磁刚度 $B\rho$ 给出平均束流能量时的情况,其分辨通常受束流能散影响更明显。

(2)利用三体末态动量守恒重建束流能量(3-body)¶

若三种带电末态粒子 $\alpha$、$^{10}\mathrm{Be}$、recoil 均被测得,则可先由它们的动能与方向重建三维动量

$$ \vec p_i = \sqrt{E_{k,i}^2+2m_iE_{k,i}}\ \hat r_i . $$

末态总动量为

$$ \vec p_{\mathrm{out}}=\vec p_{\alpha}+\vec p_{^{10}\mathrm{Be}}+\vec p_{\mathrm{recoil}} . $$

由动量守恒,入射束流动量大小可取为 $|\vec p_{\mathrm{out}}|$,从而反推出束流动能

$$ E'_{k,\mathrm{beam}} = \sqrt{m_{^{14}\mathrm C}^2+p_{\mathrm{out}}^2}-m_{^{14}\mathrm C}. $$

于是得到逐事件的三体 Q 值重建:

$$ Q_{3\mathrm{body}} = E_{k,\alpha}+E_{k,^{10}\mathrm{Be}}+E_{k,\mathrm{recoil}}-E'_{k,\mathrm{beam}} . $$

这种方法不直接依赖束流平均能量,通常能显著改善 Q 值分辨。

(3)反冲粒子缺失时的二体重建(2-body)¶

若 recoil 未被测得,但 $\alpha$ 与 $^{10}\mathrm{Be}$ 被测得,同时已知平均束流能量 $\bar E_{k,\mathrm{beam}}$,则可先构造平均束流动量 $\vec p_{\mathrm{beam}}^{\,\mathrm{mean}}$,再由动量守恒得到 recoil 动量:

$$ \vec p_{\mathrm{recoil}}^{\,\mathrm{rec}} = \vec p_{\mathrm{beam}}^{\,\mathrm{mean}} - \vec p_{\alpha} - \vec p_{^{10}\mathrm{Be}} . $$

由此可求 recoil 的重建动能

$$ E_{k,\mathrm{recoil}}^{\,\mathrm{rec}} = \sqrt{m_{\mathrm{recoil}}^2+\left(p_{\mathrm{recoil}}^{\mathrm{rec}}\right)^2} - m_{\mathrm{recoil}} . $$

于是得到

$$ Q_{2\mathrm{body}} = E_{k,\alpha}+E_{k,^{10}\mathrm{Be}}+E_{k,\mathrm{recoil}}^{\,\mathrm{rec}} - \bar E_{k,\mathrm{beam}} . $$

该方法适用于 recoil 探测效率较低或实验几何不覆盖 recoil 的情况。


由 Q 值反推出 $^{10}\mathrm{Be}$ 激发能¶

对于本节关注的 sequential decay 过程,若将母核衰变到 $\alpha + {}^{10}\mathrm{Be}^{*}$ 看作中间步,则在理想情况下有

$$ Q = Q_{\mathrm{gs}} - E_x(^{10}\mathrm{Be}), $$

因此可由重建的 Q 值反推出

$$ E_x(^{10}\mathrm{Be}) = Q_{\mathrm{gs}} - Q . $$

下面代码中exBe10 给出真实输入的 $^{10}\mathrm{Be}$ 激发能,因此可以将重建得到的

$$ E_x^{\mathrm{reco}}(^{10}\mathrm{Be}) = Q_{\mathrm{gs}} - Q $$

与 exBe10 逐一比较,以检验不同 Q 重建方法的分辨能力和适用范围。


In [2]:
%%cpp -d
#include <cmath>
#include <algorithm>
#include "TFile.h"
#include "TTree.h"
#include "TParameter.h"
#include "TMath.h"
#include "TVector3.h"
#include "TLorentzVector.h"
#include "TCanvas.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TLegend.h"
#include "TLine.h"
#include "TStyle.h"

struct Kine {
    double mH1, mC12, mHe4, mBe10, mC14, ekBeamMean;

    double mRecoil(int pid) const { return pid == 1 ? mH1 : mC12; }
    double Qgs(int pid) const { return mC14 - mHe4 - mBe10; }
    double P(double ek, double m) const { return std::sqrt(ek*ek + 2*m*ek); }

    double m(int pid, int i, double ex) const {
        double mass[] = {mHe4, mBe10, mRecoil(pid), mBe10 + ex};
        return mass[i];
    }

    TVector3 pv(int pid, int i, double ek[], double th[], double ph[], double ex) const {
        TVector3 v;
        v.SetMagThetaPhi(P(ek[i], m(pid,i,ex)), th[i]*TMath::DegToRad(), ph[i]*TMath::DegToRad());
        return v;
    }

    TLorentzVector lv(int pid, int i, double ek[], double th[], double ph[], double ex) const {
        return TLorentzVector(pv(pid,i,ek,th,ph,ex), ek[i] + m(pid,i,ex));
    }

    double Qevt(double ek[], double ekBeam) const { return ek[0]+ek[1]+ek[2] - ekBeam; }
    double Qmean(double ek[]) const { return ek[0]+ek[1]+ek[2] - ekBeamMean; }

    double Q3(int pid, double ek[], double th[], double ph[], double ex) const {
        TVector3 p = pv(pid,0,ek,th,ph,ex) + pv(pid,1,ek,th,ph,ex) + pv(pid,2,ek,th,ph,ex);
        return ek[0]+ek[1]+ek[2] - (std::sqrt(mC14*mC14 + p.Mag2()) - mC14);
    }

    double Q2(int pid, double ek[], double th[], double ph[], double ex) const {
        TVector3 pR = TVector3(0,0,P(ekBeamMean,mC14)) - pv(pid,0,ek,th,ph,ex) - pv(pid,1,ek,th,ph,ex);
        double mR = mRecoil(pid);
        return ek[0]+ek[1] + (std::sqrt(mR*mR + pR.Mag2()) - mR) - ekBeamMean;
    }

    double ExInv(int pid, double ek[], double th[], double ph[], double ex) const {
        return (lv(pid,0,ek,th,ph,ex) + lv(pid,1,ek,th,ph,ex)).M() - mC14;
    }
};

void DrawQAnalysis()
{
    TFile *f = TFile::Open("C14_CHn_He4Be10x.root");
    TTree *t = (TTree*)f->Get("tree");

    Kine K;
    const double u = 1000.0; // GeV -> MeV,若原文件已是 MeV 改成 1.0
    K.mH1        = ((TParameter<Double_t>*)f->Get("massH1"))->GetVal() * u;
    K.mC12       = ((TParameter<Double_t>*)f->Get("massC12"))->GetVal() * u;
    K.mHe4       = ((TParameter<Double_t>*)f->Get("massHe4"))->GetVal() * u;
    K.mBe10      = ((TParameter<Double_t>*)f->Get("massBe10"))->GetVal() * u;
    K.mC14       = ((TParameter<Double_t>*)f->Get("massC14"))->GetVal() * u;
    K.ekBeamMean = ((TParameter<Double_t>*)f->Get("ekBeamMean"))->GetVal();

    Int_t pid;
    Double_t ekBeam, exBe10, w;
    Double_t ek[4], th[4], ph[4];
    t->SetBranchAddress("processID",    &pid);
    t->SetBranchAddress("ekBeam",       &ekBeam);
    t->SetBranchAddress("exBe10",       &exBe10);
    t->SetBranchAddress("weight_total", &w);
    t->SetBranchAddress("ek",           ek);
    t->SetBranchAddress("theta",        th);
    t->SetBranchAddress("phi",          ph);

    // 直方图: [0]=H, [1]=C
    TH1F *hQ[4][2], *hEx[3][2];
    TH2F *hInvQ[2], *hInvQ2[2];
    const char *qn[] = {"Qevt","Qmean","Q3","Q2"};
    for (int i = 0; i < 4; ++i) {
        hQ[i][0] = new TH1F(Form("%s_H",qn[i]), Form("%s;Q [MeV];counts",qn[i]), 500,-35,5);
        hQ[i][1] = new TH1F(Form("%s_C",qn[i]), Form("%s;Q [MeV];counts",qn[i]), 500,-35,5);
    }
    const char *en[] = {"ExTrue","ExQ3","ExQ2"};
    for (int i = 0; i < 3; ++i) {
        hEx[i][0] = new TH1F(Form("%s_H",en[i]), "H: E_{x}(^{10}Be);E_{x} [MeV];counts", 300,-5,10);
        hEx[i][1] = new TH1F(Form("%s_C",en[i]), "C: E_{x}(^{10}Be);E_{x} [MeV];counts", 300,-5,10);
    }
    hInvQ[0]  = new TH2F("InvQ_H",  "H: inv.mass vs Q3;Q3 [MeV];E_{x}(^{14}C) [MeV]", 200,-20,5, 200,8,22);
    hInvQ[1]  = new TH2F("InvQ_C",  "C: inv.mass vs Q3;Q3 [MeV];E_{x}(^{14}C) [MeV]", 200,-20,5, 200,8,22);
    hInvQ2[0] = new TH2F("InvQ2_H", "H: inv.mass vs Q2;Q2 [MeV];E_{x}(^{14}C) [MeV]", 200,-20,5, 200,8,22);
    hInvQ2[1] = new TH2F("InvQ2_C", "C: inv.mass vs Q2;Q2 [MeV];E_{x}(^{14}C) [MeV]", 200,-20,5, 200,8,22);

    // 填充
    for (Long64_t i = 0; i < t->GetEntriesFast(); ++i) {
        t->GetEntry(i);
        int j = (pid == 1) ? 0 : 1;

        double q3 = K.Q3(pid, ek, th, ph, exBe10);
        double q2 = K.Q2(pid, ek, th, ph, exBe10);
        hQ[0][j]->Fill(K.Qevt(ek, ekBeam), w);
        hQ[1][j]->Fill(K.Qmean(ek), w);
        hQ[2][j]->Fill(q3, w);
        hQ[3][j]->Fill(q2, w);

        hEx[0][j]->Fill(exBe10, w);
        hEx[1][j]->Fill(K.Qgs(pid) - q3, w);
        hEx[2][j]->Fill(K.Qgs(pid) - q2, w);

        hInvQ[j]->Fill(q3, K.ExInv(pid, ek, th, ph, exBe10), w);
        hInvQ2[j]->Fill(q2, K.ExInv(pid, ek, th, ph, exBe10), w);
    }

    // 画图
    gStyle->SetOptStat(0);
    int colH = kBlue+1, colC = kRed+1;

    auto vline = [](double x, double y1, double y2, int col, int sty=2) {
        TLine *l = new TLine(x,y1,x,y2);
        l->SetLineColor(col); l->SetLineStyle(sty); l->Draw();
    };

    // ================ c1: Q 值谱对比 (2x2, logy) ================
    TCanvas *c1 = new TCanvas("c1","Q",900,900);
    c1->Divide(2,2);
    for (int i = 0; i < 4; ++i) {
        c1->cd(i+1); gPad->SetLogy();
        hQ[i][0]->SetLineColor(colH);
        hQ[i][1]->SetLineColor(colC);
        double ymax = 2*std::max(hQ[i][0]->GetMaximum(), hQ[i][1]->GetMaximum());
        hQ[i][0]->SetMinimum(0.5); hQ[i][0]->SetMaximum(ymax);
        hQ[i][0]->Draw("hist"); hQ[i][1]->Draw("hist same");
        vline(K.Qgs(1), 0.5, ymax, colH); vline(K.Qgs(1)-3.368, 0.5, ymax, colH, 3);
        vline(K.Qgs(2), 0.5, ymax, colC); vline(K.Qgs(2)-3.368, 0.5, ymax, colC, 3);
        if (i == 0) {
            TLegend *leg = new TLegend(0.15,0.75,0.45,0.88);
            leg->AddEntry(hQ[i][0], "H target", "l");
            leg->AddEntry(hQ[i][1], "C target", "l");
            leg->Draw();
        }
    }

    // ================ c2: 激发能验证 + 不变质量关联 (3x2) ================
    TCanvas *c2 = new TCanvas("c2","Ex",900,1200);
    c2->Divide(2,3);

    // --- 第一行: E_x(10Be) 重建 (logy) ---
    for (int j = 0; j < 2; ++j) {
        c2->cd(j+1); gPad->SetLogy();
        hEx[0][j]->SetLineColor(kBlack);
        hEx[1][j]->SetLineColor(kRed+1);
        hEx[2][j]->SetLineColor(kBlue+1); hEx[2][j]->SetLineStyle(2);
        double ymax = 2.0*std::max({hEx[0][j]->GetMaximum(), hEx[1][j]->GetMaximum(), hEx[2][j]->GetMaximum()});
        hEx[0][j]->SetMinimum(0.5); hEx[0][j]->SetMaximum(ymax);
        hEx[0][j]->Draw("hist"); hEx[1][j]->Draw("hist same"); hEx[2][j]->Draw("hist same");
        TLegend *leg = new TLegend(0.55,0.7,0.88,0.88);
        leg->AddEntry(hEx[0][j], "true", "l");
        leg->AddEntry(hEx[1][j], "from Q3", "l");
        leg->AddEntry(hEx[2][j], "from Q2", "l");
        leg->Draw();
    }
    
    // --- 第二行: inv.mass vs Q2 ---
    for (int j = 0; j < 2; ++j) {
        c2->cd(j+3); gPad->SetRightMargin(0.12);
        hInvQ2[j]->Draw("colz");
        int p = j+1;
        vline(K.Qgs(p), 8, 22, kWhite); vline(K.Qgs(p)-3.368, 8, 22, kMagenta+1);
    }
    // --- 第三行: inv.mass vs Q3 ---
    for (int j = 0; j < 2; ++j) {
        c2->cd(j+5); gPad->SetRightMargin(0.12);
        hInvQ[j]->Draw("colz");
        int p = j+1;
        vline(K.Qgs(p), 8, 22, kWhite); vline(K.Qgs(p)-3.368, 8, 22, kMagenta+1);
    }


}
In [3]:
DrawQAnalysis();
In [4]:
c1->Draw();

不同 Q 值重建方法的对比¶

展示如何克服束流能散带来的分辨率恶化,以及如何利用运动学差异区分靶本底。

  • [左上] Qevt(理想 Q 值) 使用模拟的真实逐事件束流能量计算。H 和 C 靶均呈现尖锐的峰,代表探测系统在剔除束流能散影响后的极限物理分辨率。
  • [右上] Qmean(平均束流 Q 值) 由于实验中用固定的平均能量代替真实的入射束流能量,受放射性束流固有的能散影响,H 和 C 靶的 Q 值分辨均出现严重的退化。
  • [左下] Q3(三体动量守恒重建 Q 值) 利用出射三粒子动量和反推束流能量,逐事件修正能散。
    • H 靶 (蓝线):动量守恒有效抵消了能散的影响,基态与激发态峰位清晰锐利。
    • C 靶 (红线):出现显著的运动学展宽。由于反冲核 $^{12}\text{C}$ 质量较大且在厚靶中的能损和歧离较严重,探测系统微小的能量/角度误差被放大为显著的动量矢量偏差,导致分辨率大幅退化。
  • [右下] Q2(二体缺失质量重建 Q 值) 模拟反冲核未被探测到的妥协方案,需引入平均束流动量推算缺失参数。由于未完全消除束流能散,分辨率介于 Qmean 和 Q3 之间。
In [6]:
c2->Draw();

重建激发能与不变质量¶

展示 Q 值测量对末态碎片和母核激发能重建的作用。

  • [第一行:左 vs 右] $E_x(^{10}\text{Be})$ 激发能一维谱 这两张图展示了通过测量的动量反推末态碎片 $^{10}\text{Be}$ 激发能的效果。

    • 左 (H 靶):红线(利用三体动量 Q3 重建)尖锐,说明对氢靶的重建精度高。
    • 右 (C 靶):因为碳靶的反冲核很重,存在严重的运动学展宽,导致这里重建出来的激发能变成了一个宽的分布。
  • [第二行:左 vs 右] Invariant Mass vs Q2 二维关联图 这两张图展示了提取母核 $^{14}\text{C}^*$ 激发能(Y轴,不变质量)时,为什么必须依赖 Q 值(X轴)。

    • 左 (H 靶信号):物理信号清晰地聚集在特定的垂直带上(即真实的 Q 值处)。当事例伴随 $\gamma$ 射线逃逸时,数据会落在左侧紫线处,此时 Y 轴计算出的母核激发能会整体偏低。但激发态与基态有足够的区分度。
    • 右 (C 靶本底):由于 C 靶的 Q 值发生严重展宽,其事例在图中弥散成很宽的区域。基态与激发态重叠。对比左图可知,只要在 X 轴的垂直物理线附近切一个狭窄区域,能够区分基态和激发态的贡献。
  • [第三行:左 vs 右] Invariant Mass vs Q3 二维关联图

In [ ]: