目的:
原理:
方法1:
优势:
%jsroot on
TFile *ipf = new TFile("../data_16Cs.root");
TTree *tree = (TTree*)ipf->Get("tree");
TCanvas *c1=new TCanvas("c1","c1");
tree->Scan("d1xe:d1xs:d1ye:d1ys","","",10,1);
PS:hit结构中事件已按照能量降低的顺序排序
tree->Draw("d1x[12]:d1x[13]>>(1000,0,8000,1000,0,8000)","","colz");//inter-strip correlation
gPad->SetLogz();
c1->Draw();
tree->Draw("d1x[12]>>(1000,10,1010)","","colz");
gPad->SetLogy();
c1->Draw();
front-back correlation
gPad->SetLogy(0);
tree->Draw("d1x[12]:d1y[13]>>(1000,0,8000,1000,0,8000)","","colz");
c1->Draw();//front-back correlation
//所有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面各选定某一条,并且两侧只有一重信号
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:条件太严格,统计太少;
改进的关联条件
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进行拟合
TGraph *gr = new TGraph(tree->GetSelectedRows(),tree->GetV2(), tree->GetV1());
gr->Draw("p");//draw point
c1->Draw();
TF1 *fp1= new TF1("fp1","pol1",200,8000);
fp1->SetLineColor(kGray);
gr->Fit(fp1);
fp1->Draw();
h2->Draw("same colz");
c1->Draw();
拟合结果与直觉不符!
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();
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:可以看出一次多项式拟合的残差分布不是随机的。
尝试二次多项式拟合
TF1 *fp2= new TF1("fp2","pol2",200,8000);
gr->Fit(fp2,"ROB");//改成二次函数拟合
p0=fp2->GetParameter(0);
p1=fp2->GetParameter(1);
p2=fp2->GetParameter(2);
fp2->SetLineColor(kGray);
fp2->Draw();
h2->Draw("colz same");
c1->Draw();
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:比一次项好些,但仍有偏离;
//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);
PS:该步骤没有使用ROBUST!!!
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();//比上一步有改进
!jupyter nbconvert example3_4.ipynb --to html