DSSD正背面关联(I)-归一

目的:

    1. 掌握利用正背面关联对DSSD归一;
    1. ROBUST fit方法;

原理:

  • 硅条上一个hit会在正背面产生等量异号的感应电荷,由$E_{i} = E_{j}$。

方法1:

    1. $X_{r}$为参考条,归一$Y_{j}$,有$X_{r} = k_{yj} * Y_{j} + b_{yj}, j = 0,1,...,31$;
    1. $Y_{r}$为参考条,归一$X_{i}$,有$Y_{r} = k_{xi} * X_{i} + b_{xi}, i = 0,1,...,31$;
    1. 当2中X中i条为参考条r时,有$Y_{r} = k_{xr} * X_{r} + b_{xr}$;有$Y_{r} = k_{xr} * k_{yj} * Y_{j} + k_{xr} * b_{yj} + b_{xr}$;此时Y方向也归一到$Y_{r}$条;

优势:

  • 挑选条间事件;
  • 排除Ghost hit;

打开data_16C.root文件

In [1]:
%jsroot on
TFile *ipf = new TFile("../data_16Cs.root");
TTree *tree = (TTree*)ipf->Get("tree");
TCanvas *c1=new TCanvas("c1","c1");

In [2]:
tree->Scan("d1xe:d1xs:d1ye:d1ys","","",10,1);
***********************************************************************
*    Row   * Instance *      d1xe *      d1xs *      d1ye *      d1ys *
***********************************************************************
*        1 *        0 *      4800 *        17 *      5775 *        18 *
*        1 *        1 *       982 *        18 *           *           *
*        2 *        0 *      3069 *        23 *      3352 *        11 *
*        2 *        1 *       341 *        24 *       111 *        10 *
*        3 *        0 *      5325 *        23 *      4522 *        15 *
*        3 *        1 *           *           *       922 *        16 *
*        4 *        0 *      5822 *        21 *      5688 *        15 *
*        4 *        1 *           *           *       271 *        14 *
*        5 *        0 *      4048 *        11 *      5213 *        12 *
*        5 *        1 *      1149 *        12 *           *           *
*        6 *        0 *      3719 *        14 *      4255 *        16 *
*        6 *        1 *       374 *        13 *           *           *
*        7 *        0 *      4546 *        12 *      4961 *         9 *
*        7 *        1 *       297 *        11 *           *           *
*        8 *        0 *      4051 *        22 *      3877 *         9 *
*        8 *        1 *           *           *       329 *        10 *
*        9 *        0 *      6720 *        13 *      6513 *        12 *
*        9 *        1 *       142 *        10 *       418 *        13 *
*        9 *        2 *       109 *        14 *           *           *
*       10 *        0 *      3873 *        20 *      3007 *         8 *
*       10 *        1 *           *           *       974 *         9 *
***********************************************************************

PS:hit结构中事件已按照能量降低的顺序排序

查看关联

inter-strip correlation

  • 一般情况下,条间事件的比例 = 条间面积/探测器灵敏面积;
  • 本实验中,由于触发的原因,相邻条能量共享事件的比例大大增加;
In [3]:
tree->Draw("d1x[12]:d1x[13]>>(1000,0,8000,1000,0,8000)","","colz");//inter-strip correlation
gPad->SetLogz();
c1->Draw();
In [4]:
tree->Draw("d1x[12]>>(1000,10,1010)","","colz");
gPad->SetLogy();
c1->Draw();

front-back correlation

  • 由于x面和y面有相邻条之间的能量共享,可以看到中间直线区域(front-back)外有很多散点的分布。
In [5]:
gPad->SetLogy(0);
tree->Draw("d1x[12]:d1y[13]>>(1000,0,8000,1000,0,8000)","","colz");
c1->Draw();//front-back correlation

挑选有效信号

要求两侧只有一重信号

  • 散点减少;
  • 显示不同条的能量刻度系数不一致,需要刻度;
In [6]:
//所有x条和y条正背面关联,都选择一重事件
TCut chit="d1xhit==1 && d1yhit==1";
tree->Draw("d1xe:d1ye>>(1000,0,8000,1000,0,8000)",chit,"colz");
gPad->SetLogz(0);
c1->Draw();

x面,y面各选定某一条,并且两侧只有一重信号

In [7]:
TCut chit1="d1xs==12 && d1ys==13 && d1xhit==1 && d1yhit==1";
tree->Draw("d1xe:d1ye>>(1000,0,8000,1000,0,8000)",chit1,"colz");
c1->Draw();

PS:条件太严格,统计太少;

改进的关联条件

  • 获取的条件为某一面的hit=2,因此事件中hit=1的事件很少。
  • 在前期的数据处理过程中,去掉了一些不满足时间条件的信号,导致有些x面事件的多重性由2降为1。
  • 改进的条件:不对多重性作限制,而只要求x和y面相邻条没有共享信号。
In [8]:
TCut cveto="d1x[11]<100 && d1x[13]<100 && d1y[12]<100 && d1y[14]<100";//no crosstalk from neighbouring strips 
TCut c1213="d1x[12]>200 && d1x[12]<8000 && d1y[13]>200&& d1y[13]<8000";
tree->Draw("d1x[12]:d1y[13]>>h2(1000,0,8000,1000,0,8000)",cveto&&c1213,"colz");//front-back correlation with crosstalk rejection
c1->Draw();

拟合

TH2转成TGraph进行拟合

In [9]:
TGraph *gr = new TGraph(tree->GetSelectedRows(),tree->GetV2(), tree->GetV1());
gr->Draw("p");//draw point
c1->Draw();
In [10]:
TF1 *fp1= new TF1("fp1","pol1",200,8000);
fp1->SetLineColor(kGray);
gr->Fit(fp1);
fp1->Draw();
h2->Draw("same colz");
c1->Draw();
****************************************
Minimizer is Linear
Chi2                      =   1.1529e+09
NDf                       =          750
p0                        =       442.64   +/-   65.0783     
p1                        =     0.732927   +/-   0.0231293   

拟合结果与直觉不符!

  • 在直线外存在大量散点(outliers,不是由于统计涨落引起的,是由于其他机制导致的),影响拟合结果。
  • 可以通过人为选择拟合区域(TCutG),改善拟合。但这取决于cut范围,拟合结果随着cut范围变化而变化。

ROTUST REGRESSION

In [11]:
Double_t p0,p1,p2;
gr->Fit(fp1,"ROB");
   //The option "rob=0.75" means that we want to use robust fitting and
   //we know that at least 75% of data is good points (at least 50% of points
   //should be good to use this algorithm). If you don't specify any number
   //and just use "rob" for the option, default value of (npoints+nparameters+1)/2
   //will be taken
p0=fp1->GetParameter(0);
p1=fp1->GetParameter(1);
fp1->Draw();
h2->Draw("same colz");
c1->Draw();
****************************************
Minimizer is Linear / Robust
Chi2                      =  1.33686e+09
NDf                       =          750
p0                        =      16.4611
p1                        =     0.982673

查看残差分布

In [12]:
TString stree;
stree.Form("d1y[13]:d1x[12]-(%lf*d1y[13]+%lf)>>ha(100,-50,50,1000,0,8000)",p1,p0);//%lf-Double_t
tree->Draw(stree.Data(),cveto&&c1213,"colz");//front-back correlation with crosstalk rejection
c1->Draw();//从图上看,一次函数拟合并不是很好

PS:可以看出一次多项式拟合的残差分布不是随机的。

再次拟合

尝试二次多项式拟合

In [13]:
TF1 *fp2= new TF1("fp2","pol2",200,8000);
gr->Fit(fp2,"ROB");//改成二次函数拟合
p0=fp2->GetParameter(0);
p1=fp2->GetParameter(1);
p2=fp2->GetParameter(2);
****************************************
Minimizer is Linear / Robust
Chi2                      =  1.33799e+09
NDf                       =          749
p0                        =      13.2954
p1                        =      0.98693
p2                        = -6.79698e-07
In [14]:
fp2->SetLineColor(kGray);
fp2->Draw();
h2->Draw("colz same");
c1->Draw();
In [15]:
stree.Form("d1y[13]:d1x[12]-(%e*d1y[13]*d1y[13]+%lf*d1y[13]+%f)>>ha(100,-50,50,1000,0,8000)",p2,p1,p0);
//cout<<stree.Data()<<endl;
tree->Draw(stree.Data(),cveto&&c1213,"colz");//front-back correlation with crosstalk rejection
c1->Draw();//二次函数拟合比一次函数拟合有显著的改善。

PS:比一次项好些,但仍有偏离;

继续调整,再拟合

  • 目测残差分布的中心值有偏差
  • 尝试继续加条件进行拟合:限制残差范围
In [16]:
//cut proper range for fit
TCut ccut=Form("abs(d1x[12]-(%e*d1y[13]*d1y[13]+%lf*d1y[13]+%lf))<5",p2,p1,p0);
tree->Draw("d1x[12]:d1y[13]>>h2b(1000,0,8000,1000,0,8000)",cveto&&c1213&&ccut,"colz");
gr = new TGraph(tree->GetSelectedRows(),tree->GetV2(), tree->GetV1());
gr->Fit(fp2);//不用ROB选项。
p0=fp2->GetParameter(0);
p1=fp2->GetParameter(1);
p2=fp2->GetParameter(2);
****************************************
Minimizer is Linear
Chi2                      =      1157.33
NDf                       =          268
p0                        =      12.3165   +/-   0.268164    
p1                        =      0.98711   +/-   0.000279533 
p2                        = -6.54499e-07   +/-   4.43217e-08 

PS:该步骤没有使用ROBUST!!!

In [17]:
stree.Form("d1y[13]:d1x[12]-(%e*d1y[13]*d1y[13]+%lf*d1y[13]+%lf)>>ha(100,-50,50,1000,0,8000)",p2,p1,p0);
tree->Draw(stree.Data(),cveto&&c1213,"colz");
c1->Draw();//比上一步有改进
In [18]:
!jupyter nbconvert example3_4.ipynb --to html
[NbConvertApp] Converting notebook example3_4.ipynb to html


[NbConvertApp] Writing 654389 bytes to example3_4.html