#include <TFile.h>
#include <TTree.h>
#include <TString.h>
#include <TRandom3.h>
void hitstruc()
{
//打开s4.root文件,继承tree
TFile * ipf = new TFile("../s4cali.root");
if (ipf->IsZombie())
{
cout << "Error opening file" << endl;
exit(-1);
}
ipf->cd();
TTree * ipt = (TTree *)ipf->Get("tree");
//ipf中Branch以及参量
Double_t pedith[48],redith[48],pecali[48];
for(Int_t i = 0;i<48;i++)
{
pedith[i] = -1.0;
redith[i] = -1.0;
pecali[i] = -1.0;
}
ipt->SetBranchAddress("pedith",&pedith);
ipt->SetBranchAddress("redith",&redith);
ipt->SetBranchAddress("pecali",&pecali);
//新root文件与tree
TFile * opf = new TFile("../s4hit.root","recreate");
TTree * opt = new TTree("tree","hit structure");
//新root文件变量,与新Branch
Int_t pedhit,redhit,pechit;//pedith,redith,pecali的hit数目
Int_t pedhits[48],redhits[48],pechits[48];//pedith,redith,pecali的hit对应条
Double_t pedhite[48],redhite[48],pechite[48];//pedith,redith,pecali的hit对应能量
//继承s4cali.root中内容
opt->Branch("pedith",&pedith,"pedith[48]/D");
opt->Branch("redith",&redith,"redith[48]/D");
opt->Branch("pecali",&pecali,"pecali[48]/D");
//hit-structure
opt->Branch("pedhit" ,&pedhit, "pedhit/I");
opt->Branch("pedhits",&pedhits,"pedhits[pedhit]/I");
opt->Branch("pedhite",&pedhite,"pedhite[pedhit]/D");
opt->Branch("redhit" ,&redhit, "redhit/I");
opt->Branch("redhits",&redhits,"redhits[redhit]/I");
opt->Branch("redhite",&redhite,"redhite[redhit]/D");
opt->Branch("pechit" ,&pechit, "pechit/I");
opt->Branch("pechits",&pechits,"pechits[pechit]/I");
opt->Branch("pechite",&pechite,"pechite[pechit]/D");
//遍历事件,加入hit-structure
Long64_t nentries = ipt->GetEntries();
for(Long64_t jentry = 0; jentry<nentries;jentry++)
{
ipt->GetEntry(jentry);
//初始化
pedhit = 0;
redhit = 0;
pechit = 0;
for(Int_t i = 0; i < 48; i++)
{
pedhits[i] = -1;
redhits[i] = -1;
pechits[i] = -1;
pedhite[i] = -9;
redhite[i] = -9;
pechite[i] = -9;
}
//hit-structure
for(Int_t i = 0;i<48;i++)
{
//pedith的hit结构
if(pedith[i]>0)
{
pedhits[pedhit] = i;
pedhite[pedhit] = pedith[i];
pedhit++;
}
if(redith[i]>0)
{
redhits[redhit] = i;
redhite[redhit] = redith[i];
redhit++;
}
if(pecali[i]>0)
{
pechits[pechit] = i;
pechite[pechit] = pecali[i];
pechit++;
}
}
opt->Fill();
if(jentry%100000==0) cout<<"process "<<jentry<<" of "<<nentries<<endl;
}
opt->Write();
opf->Close();
ipf->Close();
}
TFile * ipf = new TFile("s4hit.root","read");
TTree * tree = (TTree*)ipf->Get("tree");
TCanvas * c1 = new TCanvas();
整个事件中只有x面有一个有效信息
tree->Scan("pedith:redith","","",1,1);//第4参数-事件数,第5参数-起始事件编号
//jupyter上的Scan必须指定第4个参数(事件数)
整个事件中x,y面都有一个有效信息
tree->Scan("pedith:redith","","",1,2);
tree->Scan("pedith:redith","pedith>0&& redith>0","",1000,1);
tree->Scan("pedith:redith","","",1,54);
tree->Print();
tree->Scan("pedhit:pedhits:pedhite:redhit:redhits:redhite","","",10,1);
观察事件多重性分布
%jsroot on
tree->Draw("pedhit");
c1->Draw();
tree->Draw("pedhite>>(1000,0,2000)","pedhits==1");
c1->Draw();
tree->Draw("pedhite>>(1000,0,2000)","pedhits==1&&pedhit==0");
c1->Draw();
观察pie和ring的能量关联
tree->Draw("pedhite[0]:redhite[0]>>(400,0,1600,400,0,1600)","","colz");
gPad->SetLogz();
c1->Draw();
tree->Scan("pedhits:pedhite:redhits:redhite","","",10,1);
tree->Draw("pedhite:redhite>>(400,0,1600,400,0,1600)","pedhits==10 && redhits[0]==30","colz");//用Scan来观察,图上显示的是哪些条之间的能量关联
gPad->SetLogz();
c1->Draw();
观察ring的相邻条能量关联
tree->Draw("redhite[0]:redhite[1]>>(400,0,1600,400,0,1600)","redhits[0]==13&&redhits[1]==14","colz");
gPad->SetLogz();
c1->Draw();
tree->Draw("redhite[0]:redhite[1]>>(400,0,1600,400,0,1600)","abs(redhits[0]-redhits[1])==1","colz");
gPad->SetLogz();
c1->Draw();
观察pie的所有条的能量分布
tree->Draw("pedhite:pedhits>>(48,0,48,800,0,1600)","","colz");
c1->Draw();
tree->Draw("redhite:redhits>>(48,0,48,800,0,1600)","","colz");
c1->Draw();
tree->Draw("pechite:pechits>>(48,0,48,700,4,11)","","colz");
c1->Draw();
!jupyter nbconvert homework3.1_3_hitstuc.ipynb --to html