不变质量谱重建¶

在给定的反应条件下,反冲质子 $p$ 的发射角最大可达约 $40^\circ$,而反冲 $^{12}\mathrm{C}$ 的发射角最大可达约 $70^\circ$。与此同时,本实验的探测器布局主要针对前角区域优化,用于高效率测量前向发射的 $\alpha$ 和 $^{10}\mathrm{Be}$ 粒子;这类前向碎片在逆运动学条件下具有较高的探测效率。相比之下,大角度区域的立体角覆盖相对有限。

因此,对于大部分 $^{14}\mathrm{C}^{*}$ 反应事件,其重建不能依赖于对反冲靶测量。基于这一实验事实,下面重点研究不依赖于反冲靶核测量的信息重建方法,即利用前向测得的 $\alpha$ 和 $^{10}\mathrm{Be}$ 粒子,通过 $x$-$y$ 关联、$Q$ 值分析以及两体不变质量方法,对反应道和激发能谱进行重建。

靶核类型判断¶

对于 CH$_2$ 复合靶中的反应事例,若只测得碎裂末态 $\alpha$ 和 $^{10}\mathrm{Be}$,而未测得反冲靶核,则可利用 $x$-$y$ 关联图对靶核类型进行区分,并据此选择相应反应道。

反冲核 $A'$ 的动量可写为

$$ p_{A'}^2=(\vec p_a-\vec p_c-\vec p_d)^2 . $$

在低能条件下,反冲核动能近似为

$$ E_{K,A'} \approx \frac{p_{A'}^2}{2m_u A}, $$

其中 $m_u$ 为原子质量单位,$A$ 为反冲核质量数。另一方面,由能量守恒有

$$ E_{K,A'}=E_{K,a}-E_{K,c}-E_{K,d}+Q . $$

定义

$$ x=\frac{p_{A'}^2}{2m_u}, \qquad y=E_{K,c}+E_{K,d}-E_{K,a}, $$

则有近似线性关系

$$ y=\frac{x}{A}-Q . $$

因此,在 $x$-$y$ 平面中,不同靶核成分对应不同的分布带。对于本例的 CH$_2$ 靶,H 靶与 C 靶成分可在 $x$-$y$ 图中清楚分开。程序中选取两条直线之间的区域作为 H 靶事例,后续的不变质量谱分析均在这一 H 门内进行。

后续分析中,取两条经验直线之间的区域作为 H 靶候选事例: $$ y=9.5+\frac{58}{60}x, \qquad y=18.5+\frac{58}{60}x. $$

这里需要说明的是,$x$-$y$ 图的作用是先做靶核成分选择。C 靶事例主要作为宽本底存在,并不直接进入后续 H 靶不变质量谱的主分析流程。

In [2]:
void TargetID_CHn()
{
    TFile *f = TFile::Open("C14_CHn_He4Be10x.root");
    TTree *tree = (TTree*)f->Get("tree");

    const double u  = 1000.0;          // mass: GeV -> MeV
    const double mu = 931.494;
    const double k  = 58.0 / 60.0;

    // masses and beam mean from TParameter
    double mHe4       = ((TParameter<Double_t>*)f->Get("massHe4"))->GetVal() * u;
    double mBe10      = ((TParameter<Double_t>*)f->Get("massBe10"))->GetVal() * u;
    double mC14       = ((TParameter<Double_t>*)f->Get("massC14"))->GetVal() * u;
    double ekBeamMean = ((TParameter<Double_t>*)f->Get("ekBeamMean"))->GetVal(); // MeV

    // branches
    Double_t ek[4], theta[4], phi[4];
    Double_t weight_total;

    tree->SetBranchAddress("ek",           ek);
    tree->SetBranchAddress("theta",        theta);
    tree->SetBranchAddress("phi",          phi);
    tree->SetBranchAddress("weight_total", &weight_total);

    TH2F *hEP = new TH2F("hEP", "x-y", 400, 0, 80, 400, 0, 80);
    TH1F *hQ  = new TH1F("hQ",  "Q (H gate)", 400, -20, -5);

    // mean beam momentum
    double pBeamMean = std::sqrt(ekBeamMean*ekBeamMean + 2.0*ekBeamMean*mC14);
    TVector3 pvBeam;
    pvBeam.SetMagThetaPhi(pBeamMean, 0.0, 0.0);

    Long64_t nentries = tree->GetEntriesFast();
    for (Long64_t i = 0; i < nentries; ++i) {
        tree->GetEntry(i);

        // alpha
        double pAlpha = std::sqrt(ek[0]*ek[0] + 2.0*ek[0]*mHe4);
        TVector3 pvAlpha;
        pvAlpha.SetMagThetaPhi(pAlpha,
                               theta[0] * TMath::DegToRad(),
                               phi[0]   * TMath::DegToRad());

        // final 10Be
        double pBe = std::sqrt(ek[1]*ek[1] + 2.0*ek[1]*mBe10);
        TVector3 pvBe;
        pvBe.SetMagThetaPhi(pBe,
                            theta[1] * TMath::DegToRad(),
                            phi[1]   * TMath::DegToRad());

        // missing recoil momentum
        double pRec = (pvBeam - pvAlpha - pvBe).Mag();

        double x = pRec * pRec / (2.0 * mu);
        double y = ekBeamMean - ek[0] - ek[1];

        hEP->Fill(x, y, weight_total);

        // H-target gate
        if (y <  9.5 + k*x) continue;
        if (y > 18.5 + k*x) continue;

        double Q = k*x - y;
        hQ->Fill(Q, weight_total);
    }

    TCanvas *c1 = new TCanvas("c1", "Target identification", 800, 400);
    c1->Divide(2, 1);

    c1->cd(1);
    hEP->Draw("colz");
    TLine *l1 = new TLine(0,  9.5, 60, 67.5);
    TLine *l2 = new TLine(0, 18.5, 60, 76.5);
    l1->Draw();
    l2->Draw();
    gPad->SetLogz();

    c1->cd(2);
    hQ->Draw("hist");

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

不变质量谱¶

在完成 H 靶甄别之后,进一步在 H 门内构建 $\alpha+{}^{10}\mathrm{Be}$ 两体不变质量谱,以重建母核 $^{14}\mathrm{C}^{*}$ 的激发能。其不变质量定义为 $$ M_{\mathrm{inv}}^2=(E_{\alpha}+E_{{}^{10}\mathrm{Be}})^2-(\vec p_{\alpha}+\vec p_{{}^{10}\mathrm{Be}})^2, $$ 于是可得 $$ E_x(^{14}\mathrm{C})=M_{\mathrm{inv}}-m(^{14}\mathrm{C}_{\mathrm{g.s.}}). $$ 这里需要注意,末态 $^{10}\mathrm{Be}$ 既可能处于基态,也可能来自第一激发态 $$ ^{10}\mathrm{Be}^{*}(3.368\ \mathrm{MeV}) $$ 的退激过程。若该 $\gamma$ 未被探测,而在不变质量计算中仍统一把所有事例都按 $^{10}\mathrm{Be}$ 基态处理,则会使重建得到的 $^{14}\mathrm{C}$ 激发能出现系统偏移,并在一维谱中形成附加结构。因而,在构建不变质量谱之前,必须先利用 $Q$ 值信息区分 $^{10}\mathrm{Be}$ 的不同末态分支。

在本节中,为保持与前述靶核甄别的处理一致,仍采用 H 带对应的线性关系定义 $$ Q_{\mathrm{rec}}=\frac{58}{60}x-y. $$ 然后按经验门对 $^{10}\mathrm{Be}$ 分支进行区分:

  • 当 $Q_{\mathrm{rec}}<-14.5\ \mathrm{MeV}$ 时,视为 $^{10}\mathrm{Be}^{*}(3.368)$ 分支;
  • 当 $Q_{\mathrm{rec}}>-13.5\ \mathrm{MeV}$ 时,视为 $^{10}\mathrm{Be}$ 基态分支;
  • 中间过渡区事例暂不参与不变质量重建,以减少分支混叠。

随后,对不同分支分别采用相应的 $^{10}\mathrm{Be}$ 质量假设构建两体不变质量。这样得到的重建激发能谱可与模拟真值 exC14 进行比较,用于检验该方法在 H 门条件下恢复 $^{14}\mathrm{C}$ 激发态结构的能力。

因此,本节的分析流程可以概括为:

  1. 从统一模拟文件中读取前向可测粒子信息;
  2. 利用 $x$-$y$ 关联图进行靶核甄别,选出 H 靶候选事例;
  3. 在 H 门内利用重建 $Q$ 值区分 $^{10}\mathrm{Be}$ 基态与激发态分支;
  4. 对不同分支分别采用相应质量,构建 $^{14}\mathrm{C}$ 的两体不变质量谱。
In [5]:
void MassSpectrum_CHn()
{
    TFile *f = TFile::Open("C14_CHn_He4Be10x.root");
    TTree *tree = (TTree*)f->Get("tree");

    const double u  = 1000.0;          // mass: GeV -> MeV
    const double mu = 931.494;
    const double k  = 58.0 / 60.0;

    // masses and beam mean from TParameter
    double mHe4       = ((TParameter<Double_t>*)f->Get("massHe4"))->GetVal() * u;
    double mBe10      = ((TParameter<Double_t>*)f->Get("massBe10"))->GetVal() * u;
    double mC14       = ((TParameter<Double_t>*)f->Get("massC14"))->GetVal() * u;
    double ekBeamMean = ((TParameter<Double_t>*)f->Get("ekBeamMean"))->GetVal(); // MeV

    // branches
    Double_t ek[4], theta[4], phi[4];
    Double_t exC14, weight_total;

    tree->SetBranchAddress("ek",           ek);
    tree->SetBranchAddress("theta",        theta);
    tree->SetBranchAddress("phi",          phi);
    tree->SetBranchAddress("exC14",        &exC14);
    tree->SetBranchAddress("weight_total", &weight_total);

    TH1F *hExcal  = new TH1F("hExcal",  "Excal",   400, 12, 22);
    TH2F *hExcalQ = new TH2F("hExcalQ", "Excal-Q", 400, 12, 22, 400, -20, -5);
    TH1F *hEx     = new TH1F("hEx",     "Ex true", 400, 12, 22);
    TH2F *hExQ    = new TH2F("hExQ",    "Ex-Q",    400, 12, 22, 400, -20, -5);

    // mean beam momentum
    double pBeamMean = std::sqrt(ekBeamMean*ekBeamMean + 2.0*ekBeamMean*mC14);
    TVector3 pvBeam;
    pvBeam.SetMagThetaPhi(pBeamMean, 0.0, 0.0);

    Long64_t nentries = tree->GetEntriesFast();
    for (Long64_t i = 0; i < nentries; ++i) {
        tree->GetEntry(i);

        // ------------------------------------------------
        // step 1: use final alpha + final 10Be to do H gate
        // ------------------------------------------------
        double pAlpha0 = std::sqrt(ek[0]*ek[0] + 2.0*ek[0]*mHe4);
        TVector3 pvAlpha0;
        pvAlpha0.SetMagThetaPhi(pAlpha0,
                                theta[0] * TMath::DegToRad(),
                                phi[0]   * TMath::DegToRad());

        double pBe0 = std::sqrt(ek[1]*ek[1] + 2.0*ek[1]*mBe10);
        TVector3 pvBe0;
        pvBe0.SetMagThetaPhi(pBe0,
                             theta[1] * TMath::DegToRad(),
                             phi[1]   * TMath::DegToRad());

        double pRec = (pvBeam - pvAlpha0 - pvBe0).Mag();

        double x = pRec * pRec / (2.0 * mu);
        double y = ekBeamMean - ek[0] - ek[1];

        // H-target gate
        if (y <  9.5 + k*x) continue;
        if (y > 18.5 + k*x) continue;

        // reconstructed Q from x-y band
        double Q = k*x - y;

        // ------------------------------------------------
        // step 2: choose 10Be mass according to Q branch
        // ------------------------------------------------
        double mBeUse = -1.0;

        if (Q < -14.5) mBeUse = mBe10 + 3.368; // 10Be*(3.368)
        if (Q > -13.5) mBeUse = mBe10;         // 10Be(gs)

        // skip the transition region
        if (mBeUse < 0.0) continue;

        // ------------------------------------------------
        // step 3: build two-body invariant mass
        // ------------------------------------------------
        double pAlpha = std::sqrt(ek[0]*ek[0] + 2.0*ek[0]*mHe4);
        TVector3 pvAlpha;
        pvAlpha.SetMagThetaPhi(pAlpha,
                               theta[0] * TMath::DegToRad(),
                               phi[0]   * TMath::DegToRad());

        double pBe = std::sqrt(ek[1]*ek[1] + 2.0*ek[1]*mBeUse);
        TVector3 pvBe;
        pvBe.SetMagThetaPhi(pBe,
                            theta[1] * TMath::DegToRad(),
                            phi[1]   * TMath::DegToRad());

        TLorentzVector lvAlpha(pvAlpha, ek[0] + mHe4);
        TLorentzVector lvBe   (pvBe,    ek[1] + mBeUse);

        double Minv = (lvAlpha + lvBe).M();
        double Ex   = Minv - mC14;

        hExcal->Fill(Ex, weight_total);
        hExcalQ->Fill(Ex, Q, weight_total);

        // truth for comparison
        hEx->Fill(exC14, weight_total);
        hExQ->Fill(exC14, Q, weight_total);
    }

    TCanvas *c2 = new TCanvas("c2", "Invariant mass", 800, 800);
    c2->Divide(2, 2);

    c2->cd(1);
    hExcal->Draw("hist");

    c2->cd(2);
    hExcalQ->Draw("colz");
    gPad->SetLogz();

    c2->cd(3);
    hEx->Draw("hist");

    c2->cd(4);
    hExQ->Draw("colz");
    gPad->SetLogz();

    c2->Draw();
}
In [7]:
MassSpectrum_CHn();

由上图可见,校正后的不变质量谱 $Ex_{cal}$ 与真值谱 $Ex_{true}$ 在峰位上符合较好,说明在 H 靶门内,利用 $Q$ 值区分 $^{10}\mathrm{Be}$ 基态与第一激发态后,两体方法能够较好恢复 $^{14}\mathrm{C}$ 的真实激发能结构。与真值相比,Excal 的峰形略有展宽,主要来源于探测器分辨及重建误差。二维图 Excal-Q 进一步表明,不同事例清楚落在两条 $Q$ 分支上,分别对应 $^{10}\mathrm{Be}$ 基态和 $3.368\ \mathrm{MeV}$ 激发态。通过剔除两分支之间的过渡区,可有效减少通道混叠,从而抑制由未探测 $\gamma$ 引起的假峰或峰位偏移。结果说明,$Q$ 值甄别是不变质量谱分析的必要前置步骤。

作业:利用 $Q_3$ 条件重建 H 靶三体测量下的不变质量谱¶

在 7.5 节中,已经利用三体动量守恒方法重建了 H 靶反应的 $Q_3$ 谱。下面进一步以此为基础,完成 H 靶三体全末态测量条件下的不变质量谱重建。

In [ ]: