chapter 6. 基于白光中子源的(n,n')反应测量

  • 目的: 学习基于白光中子源的ppac-中子探测器信号的处理方法。

实验概况及探测器设置:

  • 散列中子源:采用快循环质子同步加速器提供的脉冲重复频率为25Hz,能量为1.6GeV的强流质子束轰击厚钨靶(11片钨靶组成,全长65cm),发生散裂反应出射大量10$^{-8}$ - 10$^2$ MeV范围内的中子,通过测量中子飞行时间得到中子的能量。质子脉冲分为三种运行模拟:一是窄束团模式,质子束团仅有 3.7ns;二是单束团模式,束团时间结构呈单抛物线结构,半高宽度约40ns;三是双束团模式,由两个相隔 400ns 的单束团组成。本实验运行在双束团模式。

  • 白光中子源产生的中子束流入射到终端1(飞行距离约55m)的PPAC阳极靶材料形成复合核,复合核退激时发射中子以及伴随带电粒子。PPAC由4个Cathod-Anode-Cathod结构的独立单元前后排列。每单元的伴随带电粒子信号作为反应中子的飞行时间起始。 距离靶100cm处放置4个液体闪烁体探测器,测量反应中子的到达时间。

  • 采集卡:XIA Pixie-16 500MHz, 14bit
  • ROOT文件事件结构:所有探测器信号按时间排序。从第一个信号开始,将300ns以内的所有探测器组装成一个事件。
-  evt : |--- 0 ---|------ 1 ------|------- 2 -------|-------- 3 ----------|
-  time:  0     200 355  365   450  700   710 430 740   1200 1300  1350 1400
-  det:   ref   LS1 P1   P2    LS1  P1    P3  LS2 LS4   LS1  P1    LS3  LS4 
-  nref:          1              0                  0                     0
-  nls:           1              1                  2                     1
-  nppac:         0              2                  2                     3

数据文件中TTree结构

  • 时间信号:
    • 粗时钟(ts)和CFD过零点时间(subts)组成, t = ts + subts (ns) ;
      • refts, refsubts:质子脉冲的时间
      • ppacts, ppacsubts: ppac探测器时间
      • lsts, lssubts: 液闪探测器时间
  • 能量信号
    • ppacraw: ppac脉冲信号积分
    • lssg,lslg: 液闪信号short gate, long gate积分
    • lse: 液闪信号积分
  • 探测器id
    • ppacid
    • lsid
In [1]:
TCanvas *c1 = new TCanvas("c1");
TFile *f1 = new TFile("ana_0354_W300.root", "READ");
f1->ls();
TFile**		ana_0354_W300.root	
 TFile*		ana_0354_W300.root	
  KEY: TTree	tree;27	tree [current cycle]
  KEY: TTree	tree;26	tree [backup cycle]
  KEY: TTree	tree;25	tree [backup cycle]
In [2]:
TTree *fChain = (TTree *)f1->Get("tree");
fChain->Print();
******************************************************************************
*Tree    :tree      : tree                                                   *
*Entries : 70212239 : Total =      5020484602 bytes  File  Size =  723013307 *
*        :          : Tree compression factor =   6.94                       *
******************************************************************************
*Br    0 :nref      : nref/I                                                 *
*Entries : 70212239 : Total  Size=  280891481 bytes  File Size  =    1650550 *
*Baskets :      464 : Basket Size=    2702336 bytes  Compression= 170.17     *
*............................................................................*
*Br    1 :refts     : refts[nref]/L                                          *
*Entries : 70212239 : Total  Size=  281636968 bytes  File Size  =    2293060 *
*Baskets :      705 : Basket Size=   25600000 bytes  Compression= 122.82     *
*............................................................................*
*Br    2 :refsubts  : refsubts[nref]/D                                       *
*Entries : 70212239 : Total  Size=  281639095 bytes  File Size  =    2222700 *
*Baskets :      705 : Basket Size=   25600000 bytes  Compression= 126.70     *
*............................................................................*
*Br    3 :nppac     : nppac/I                                                *
*Entries : 70212239 : Total  Size=  280891949 bytes  File Size  =   14368580 *
*Baskets :      464 : Basket Size=    2702848 bytes  Compression=  19.55     *
*............................................................................*
*Br    4 :ppacid    : ppacid[nppac]/S                                        *
*Entries : 70212239 : Total  Size=  302275185 bytes  File Size  =   20794964 *
*Baskets :      729 : Basket Size=   25600000 bytes  Compression=  14.54     *
*............................................................................*
*Br    5 :ppacts    : ppacts[nppac]/L                                        *
*Entries : 70212239 : Total  Size=  366339182 bytes  File Size  =   49163840 *
*Baskets :      802 : Basket Size=   25600000 bytes  Compression=   7.45     *
*............................................................................*
*Br    6 :ppacsubts : ppacsubts[nppac]/D                                     *
*Entries : 70212239 : Total  Size=  366341600 bytes  File Size  =   55596138 *
*Baskets :      802 : Basket Size=   25600000 bytes  Compression=   6.59     *
*............................................................................*
*Br    7 :ppacraw   : ppacraw[nppac]/s                                       *
*Entries : 70212239 : Total  Size=  302275918 bytes  File Size  =   35017263 *
*Baskets :      729 : Basket Size=   25600000 bytes  Compression=   8.63     *
*............................................................................*
*Br    8 :nls       : nls/I                                                  *
*Entries : 70212239 : Total  Size=  280891013 bytes  File Size  =   19425635 *
*Baskets :      464 : Basket Size=    2702336 bytes  Compression=  14.46     *
*............................................................................*
*Br    9 :lsid      : lsid[nls]/S                                            *
*Entries : 70212239 : Total  Size=  309098762 bytes  File Size  =   36059044 *
*Baskets :      736 : Basket Size=   25600000 bytes  Compression=   8.57     *
*............................................................................*
*Br   10 :lsts      : lsts[nls]/L                                            *
*Entries : 70212239 : Total  Size=  393640439 bytes  File Size  =   83536873 *
*Baskets :      857 : Basket Size=   25600000 bytes  Compression=   4.71     *
*............................................................................*
*Br   11 :lssubts   : lssubts[nls]/D                                         *
*Entries : 70212239 : Total  Size=  393643022 bytes  File Size  =   81025579 *
*Baskets :      857 : Basket Size=   25600000 bytes  Compression=   4.86     *
*............................................................................*
*Br   12 :lse       : lse[nls]/D                                             *
*Entries : 70212239 : Total  Size=  393639578 bytes  File Size  =  136015957 *
*Baskets :      857 : Basket Size=   25600000 bytes  Compression=   2.89     *
*............................................................................*
*Br   13 :lssg      : lssg[nls]/D                                            *
*Entries : 70212239 : Total  Size=  393640439 bytes  File Size  =   94327462 *
*Baskets :      857 : Basket Size=   25600000 bytes  Compression=   4.17     *
*............................................................................*
*Br   14 :lslg      : lslg[nls]/D                                            *
*Entries : 70212239 : Total  Size=  393640439 bytes  File Size  =   91416391 *
*Baskets :      857 : Basket Size=   25600000 bytes  Compression=   4.31     *
*............................................................................*

重新组织事件结构

void Reset(Short_t *ppace, Double_t *ppact, 
       Double_t *lsqs, Double_t *lsql, Double_t *lsq, Double_t *lst)
{
  for(int i=0;i<4;i++) {
    ppace[i] = 0;
    ppact[i] = -1;
    lsqs[i] = -1;
    lsql[i] = -1;
    lst[i] = -1;
    lsq[i] = -1;
  }
}

void convert()
{
  //input
  TFile *f1 = new TFile("ana_0354_W300.root", "READ");
  TTree *fChain = (TTree *)f1->Get("tree");
// Declaration of leaf types
   Int_t           nref;
   Long64_t        refts[128];
   Double_t        refsubts[128]; 
   Int_t           nppac;
   Short_t         ppacid[128]; 
   Long64_t        ppacts[128]; 
   Double_t        ppacsubts[128];
   UShort_t        ppacraw[128];
   Int_t           nls;
   Short_t         lsid[128]; 
   Long64_t        lsts[128]; 
   Double_t        lssubts[128]; 
   Double_t        lse[128]; 
   Double_t        lssg[128]; 
   Double_t        lslg[128]; 

   // List of branches
   TBranch        *b_nref; 
   TBranch        *b_refts;
   TBranch        *b_refsubts; 
   TBranch        *b_nppac;
   TBranch        *b_ppacid;
   TBranch        *b_ppacts;
   TBranch        *b_ppacsubts;  
   TBranch        *b_ppacraw;
   TBranch        *b_nls; 
   TBranch        *b_lsid; 
   TBranch        *b_lsts; 
   TBranch        *b_lssubts;
   TBranch        *b_lse; 
   TBranch        *b_lssg; 
   TBranch        *b_lslg;        

   fChain->SetBranchAddress("nref", &nref, &b_nref);
   fChain->SetBranchAddress("refts", refts, &b_refts);
   fChain->SetBranchAddress("refsubts", refsubts, &b_refsubts);
   fChain->SetBranchAddress("nppac", &nppac, &b_nppac);
   fChain->SetBranchAddress("ppacid", ppacid, &b_ppacid);
   fChain->SetBranchAddress("ppacts", ppacts, &b_ppacts);
   fChain->SetBranchAddress("ppacsubts", ppacsubts, &b_ppacsubts);
   fChain->SetBranchAddress("ppacraw", ppacraw, &b_ppacraw);
   fChain->SetBranchAddress("nls", &nls, &b_nls);
   fChain->SetBranchAddress("lsid", lsid, &b_lsid);
   fChain->SetBranchAddress("lsts", lsts, &b_lsts);
   fChain->SetBranchAddress("lssubts", lssubts, &b_lssubts);
   fChain->SetBranchAddress("lse", lse, &b_lse);
   fChain->SetBranchAddress("lssg", lssg, &b_lssg);
   fChain->SetBranchAddress("lslg", lslg, &b_lslg);

   //output
   Short_t  ppace[4];
   Double_t ppact[4],lsqs[4],lsql[4],lsq[4],lst[4],ppacem;
   Double_t t0;
   Int_t ppacidm;

    TFile *fout = new TFile("ana354.root", "RECREATE");
    TTree *tout = new TTree("tree", "tree");
    tout->Branch("nppac", &nppac, "nppac/I");
    tout->Branch("ppace", &ppace, "ppace[4]/s");    //ppac energy
    tout->Branch("ppact", &ppact, "ppact[4]/D");    //ppac time - ref time
    tout->Branch("ppacem", &ppacem, "ppacem/D");     // 
    tout->Branch("ppacidm",&ppacidm, "ppacidm/I");   //maximum ppac energy
    tout->Branch("nls", &nls, "nls/I");
    tout->Branch("lsqs", &lsqs, "lsqs[4]/D"); //ls Q_short_gate
    tout->Branch("lsql", &lsql, "lsql[4]/D"); //ls Q_long_gate  
    tout->Branch("lse", &lsq, "lse[4]/D");    //ls energy 
    tout->Branch("lst", &lst, "lst[4]/D");    //ls time - ref time 

    Long64_t nentries = fChain->GetEntriesFast();
     t0 = -1;
    for (Long64_t jentry = 0; jentry < nentries; jentry++) 
    {
        Reset(ppace, ppact, lsqs, lsql, lsq, lst);
        fChain->GetEntry(jentry);

        if(nref > 0) {
           t0 = refts[0] + refsubts[0];
        }
        if(t0 > 0 && nref == 0 && nppac > 0) {
            double t1 = -1;
            ppacem = -1;
            ppacidm = -1;
            for(int i=0; i<nppac; i++) {
                ppace[ppacid[i]] = ppacraw[i];
                ppact[ppacid[i]] = ppacts[i] + ppacsubts[i] - t0;
                if(t1 < ppact[ppacid[i]]) t1 = ppact[ppacid[i]];
                if(ppacraw[i] > ppacem) {
                    ppacem = ppacraw[i];
                    ppacidm = ppacid[i];
                }
            }
            for(int i=0; i<nls; i++) {
                lsqs[lsid[i]] = lssg[i];
                lsql[lsid[i]] = lslg[i];     
                lsq[lsid[i]] = lse[i];
                lst[lsid[i]] = lsts[i] + lssubts[i] - t0;
            }
            if(t1>40000 && t1<3.9e7) tout->Fill(); // 40us - 39 ms; 0.01 eV-10 keV
        }
        if((jentry) % Long64_t(1e5) == 0) {
              printf("Process %.2f %%, %5d k / %5d k \r",
              Double_t(jentry)/nentries*100.,int(jentry/1000), int(nentries/1000));
              fflush(stdout); 
        }
   }
   cout<<endl;
   tout->Write();
   fout->Close();   
}
  • 将上述代码存成convert.C
  • 在终端运行 root convert.C
  • 程序运行生成ana354.root 文件
In [3]:
TFile *f1 = new TFile("ana354.root", "READ");
TTree *tree = (TTree *)f1->Get("tree");

PPAC的时间谱

  • 在白光中子源的靶到PPAC的中子飞行时间谱
In [4]:
tree->Draw("ppact[0]>>h1(2000,40000,15e6)","");
c1->SetLogy();
c1->Draw();

中子俘获反应的中子能谱

  • 可通过若干已知中子俘获反应共振峰的能量与测得的TOF的对应关系,拟合得到TOF的偏差T$_0$,以及实际飞行距离L。
$$ E_n = 72.3 \frac{L(m)}{(TOF-T_0)(ns)}\cdot 10^6 (eV) $$
  • 经简单刻度,得到下列公式
$$ E_n = 72.3 \frac{56.4(m)}{TOF(ns)}\cdot 10^6 (eV) $$
  • 将中子能谱(下图)用白光中子源发射的中子能量分布进行归一,可得到中子反应截面。
In [5]:
//PPAC En
tree->SetAlias("Enp0","72.3*56.4/ppact[0]*72.3*56.4/ppact[0]*1e6");
tree->Draw("Enp0>>henp(1000,5,1e2)","");
c1->SetLogx();
c1->Draw();
In [6]:
//LS En
tree->SetAlias("Enl0","72.3*56.4/lst[0]*72.3*56.4/lst[0]*1e6");
tree->Draw("Enl0>>henl(1000,5,1e2)","");
c1->SetLogx();
c1->Draw();

与已知中子反应截面比较

  • 利用PPAC,LS时间信号得到的中子能谱与已知截面符合。

PPAC 信号

入射中子TOF与ppac能量关联图

In [7]:
TCut cenp0 = "Enp0>5 && Enp0<100";
tree->Draw("ppace[0]:Enp0>>hpen(1000,5,100,1000,0,20000)",cenp0,"colz");
c1->SetLogy(0);
c1->SetLogz();
c1->Draw();

PPAC 多重性

  • 液闪有关联信号的条件下,ppac的4重信号占70%!
In [8]:
tree->Draw("nppac","nls>0");
c1->SetLogx(0);
c1->Draw();

PPAC之间能量关联

  • 不同PPAC单元之间呈现能量关联
  • 每单元之间有镀Au的Mylar膜,可确保重离子不会在相邻单元上有响应。
  • 造成关联的原因可能是电子学之间的感应或串扰(crosstalk)。
  • 串扰的主要特征:
    • 1.大信号有高多重性。
    • 2.在多重信号中,测到带电粒子的探测单元具有最大幅度(在增益一致的前提下)。
In [9]:
tree->Draw("ppace[0]:ppace[1]>>(1000,0,60000,1000,0,60000)","","colz");
c1->SetLogx(0);
c1->Draw();

用不同方式表达上述二维关联图,可以更容易看清楚大范围数据的结构。

In [10]:
tree->SetAlias("pe0","TMath::Log(ppace[0])");
tree->SetAlias("pe1","TMath::Log(ppace[1])");
tree->Draw("pe0:pe1>>(1000,0,12,1000,0,12)","","colz");
c1->SetLogx(0);
c1->Draw();

特征1:大信号有高多重性。

In [12]:
tree->Draw("nppac:ppacem>>(1000,0,70000,4,0.5,4.5)","","colz");
c1->Draw();

特征2:测到带电粒子的探测单元具有最大幅度。

  • 选择ppace[0]是最大幅度的事件,观察lst[3]和ppact[0]之间gamma的飞行时间峰位与ppac多重性之间的关系。

LS探测器的n/gamma甄别

  • gamma:lsqs[3]/lsql[3]>0.94
In [13]:
tree->Draw("lse[3]:lsqs[3]/lsql[3]>>(100,0.8,1.2,400,0,6000","","colz");
c1->Draw();

未做PPAC幅度选择

In [14]:
//1-4重事件
TCut cls3p0 = "lsqs[3]/lsql[3]>0.94 && ppact[0]>0 && lst[3]>0";
tree->Draw("lst[3]-ppact[0]>>hm1a(100,-10,25)",cls3p0 && "nppac==1");
tree->Draw("lst[3]-ppact[0]>>hm2a(100,-10,25)",cls3p0 && "nppac==2");
tree->Draw("lst[3]-ppact[0]>>hm3a(100,-10,25)",cls3p0 && "nppac==3");
tree->Draw("lst[3]-ppact[0]>>hm4a(100,-10,25)",cls3p0 && "nppac==4");
hm4a->SetFillColor(6);
hm3a->SetFillColor(7);
hm2a->SetFillColor(8);
hm1a->SetFillColor(9);
In [15]:
auto hsa = new THStack("hsa","");
hsa->Add(hm1a);
hsa->Add(hm2a);
hsa->Add(hm3a);
hsa->Add(hm4a);
hsa->Draw();
c1->SetLogy();
c1->Draw();

选择最大幅度信号

In [16]:
//1-4重事件
TCut cls3p0m = cls3p0 && "ppacidm == 0";
tree->Draw("lst[3]-ppact[0]>>hm1(100,-10,25)", cls3p0m && "nppac==1");
tree->Draw("lst[3]-ppact[0]>>hm2(100,-10,25)", cls3p0m && "nppac==2");
tree->Draw("lst[3]-ppact[0]>>hm3(100,-10,25)", cls3p0m && "nppac==3");
tree->Draw("lst[3]-ppact[0]>>hm4(100,-10,25)", cls3p0m && "nppac==4");
hm4->SetFillColor(6);
hm3->SetFillColor(7);
hm2->SetFillColor(8);
hm1->SetFillColor(9);
In [17]:
auto hs = new THStack("hs","");
hs->Add(hm1);
hs->Add(hm2);
hs->Add(hm3);
hs->Add(hm4);
hs->Draw();
c1->SetLogy();
c1->Draw();
In [18]:
tree->Draw("ppace[0]:lst[3]-ppact[0]>>hm2(10,-10,25,200,0,20000)",
           "lst[3]>0 && ppacidm ==0","");
c1->SetLogy(0);
c1->Draw();
In [19]:
tree->Draw("lse[3]:lst[3]-ppact[0]>>hm2(10,-10,25,200,0,2000)",cls3p0 && "ppacidm ==0","");
c1->SetLogy(0);
c1->Draw();

后续处理步骤

a). 验证其他ppac单元具有类似的特征。

  • 当ppac最大幅度小于2000,有时最大幅度与次大幅度之间相差无几。如果用找最大值的做法将会导致一定的不确定性。

b). 对齐ppac的时间信号:

  • 选定一个ls探测器,画出ls与不同ppac的gama飞行时间谱,得到每个ppac的时间修正系数$t_{pi}$。

c). 对齐ls探测器的时间信号:

  • 仿照2的做法,得到每个ls的时间修正系数$t_{li}$

d). 对每轮数据,进行2-3步骤,得到修正系数$t_{pi}$,$t_{li}$。

  - fluctuations of the signals’ leading edge are determined on a run-by-run basis (for each data file). Fluctuations of ±5 ns are observed and they are an artifact of the fast digital electronics.

[Ref.] Nuclear Inst. and Method. A 882 (2018) 105–113

  • 每个run数据的修正系数不同,修正后的不同run数据才能叠加.

e). 对ls和ppac进行时间修正,利用ls的PSD选择中子事件:

  • 画出所有ppac探测器与每一个ls探测器的ppace-tof(2D), lse-tof(2D)直方图。
  • 选择合适的ppace和lse的能量阈值,画出tof(1D)直方图,将其转换成中子能谱。

f). 随机本底估计

  • 利用负时间区域,确定偶然本底参数。

g). 散射本底估计

  • 通过MC模拟确定环境(探测器外壳,周围环境)带来的本底成分。

修正前后的TOF谱对比

In [20]:
TFile *f2=new TFile("tof.root");
TH1F *htofraw = (TH1F*)f2->Get("dtlsppacallg");
TH1F *htofcor = (TH1F*)f2->Get("dtcorrlsppacall");
In [21]:
//所有ls与ppac的飞行时间谱(修正前)
htofraw->Draw();
c1->Draw();
In [22]:
//所有ls与ppac的飞行时间谱(修正后)
htofcor->Draw();
c1->Draw();