void getResV(){ //------------------------Deal with the number and get the output stored in txt files and root files double Vmax[nbin], eps[nbin]; for(int ibin=0; ibin<nbin ;ibin++){ Vmax[ibin]=0.065*(trkbin[ibin]+30); eps[ibin]=0.00025*(trkbin[ibin]+30); } ofstream fstrV; double theta[ntheta]; TVectorD Gmod2[nbin][ntheta]; TVectorD sigma2[nbin],deltaV[nbin]; TVectorD r[nbin]; TVectorD r0[nbin], r01[nbin], V[nbin], chi[nbin]; TVectorD GRe[nbin][ntheta]; TVectorD* GRe_t[nbin][ntheta]; TVectorD GIm[nbin][ntheta]; TVectorD* GIm_t[nbin][ntheta]; TComplex G[nbin][ntheta][nstepr]; TF1 *ffit[nbin]; TF1 *ffit0[nbin][ntheta]; if(isSum) fstrV.open("V_Sum.txt"); else fstrV.open("V_Prod.txt"); TFile *f[nFileAll]; for(int ibin=0; ibin<nbin; ibin++){ r[ibin].ResizeTo(nstepr); for(int ir=0; ir<nstepr; ir++){ if(isSimple==0) r[ibin][ir]=j01/(Vmax[ibin]-eps[ibin]*ir); else r[ibin][ir]=0.00025*20*(ir+1); } } TVectorD Nevent; Nevent.ResizeTo(nbin); Nevent.Zero(); TVectorD totmultall; totmultall.ResizeTo(nbin); totmultall.Zero(); TVectorD avgmultall; avgmultall.ResizeTo(nbin); avgmultall.Zero(); TVectorD tottrk; tottrk.ResizeTo(nbin); tottrk.Zero(); TVectorD totptall; totptall.ResizeTo(nbin); totptall.Zero(); TVectorD totetaall; totetaall.ResizeTo(nbin); totetaall.Zero(); TVectorD avgtrk; avgtrk.ResizeTo(nbin); avgtrk.Zero(); TVectorD deltaVmean; deltaVmean.ResizeTo(nbin); TVectorD Vmean; Vmean.ResizeTo(nbin); TVectorD avgpt; avgpt.ResizeTo(nbin); TVectorD avgeta; avgeta.ResizeTo(nbin); TVectorD Qx1; Qx1.ResizeTo(nbin); Qx1.Zero(); TVectorD Qy1; Qy1.ResizeTo(nbin); Qy1.Zero(); TVectorD Q2; Q2.ResizeTo(nbin); Q2.Zero(); TVectorD sigma2_; sigma2_.ResizeTo(nbin); sigma2_.Zero(); TVectorD chi_; chi_.ResizeTo(nbin); chi_.Zero(); TH1D* hq[nbin][ntheta]; TH1D* hqx[nbin]; TH1D* hqy[nbin]; TH1D* hq2[nbin]; TH1D* hq2nonf[nbin]; for(int itheta=0;itheta<ntheta;itheta++) theta[itheta]=itheta*TMath::Pi()/ntheta/nn; for(int ibin=0;ibin<nbin;ibin++){ r0[ibin].ResizeTo(ntheta); r01[ibin].ResizeTo(ntheta); sigma2[ibin].ResizeTo(ntheta); V[ibin].ResizeTo(ntheta); deltaV[ibin].ResizeTo(ntheta); chi[ibin].ResizeTo(ntheta); for(int itheta=0;itheta<ntheta;itheta++){ Gmod2[ibin][itheta].ResizeTo(nstepr); GRe[ibin][itheta].ResizeTo(nstepr); GRe[ibin][itheta].Zero(); GIm[ibin][itheta].ResizeTo(nstepr); GIm[ibin][itheta].Zero(); hq[ibin][itheta] = new TH1D(Form("hq"),Form("hq"),1000,0,10); } hqx[ibin] = new TH1D(Form("hqx"),Form("hqx"),1000,0,10); hqy[ibin] = new TH1D(Form("hqy"),Form("hqy"),1000,0,10); hq2[ibin] = new TH1D(Form("hq2"),Form("hq2"),1000,0,10); hq2nonf[ibin] = new TH1D(Form("hq2nonf"),Form("hq2nonf"),1000,0,10); } for(int ifile=0; ifile<nFileAll; ifile++){ if(isSum) f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/pbsjoboutput/Bessfun/pPbDataV205m220/AnaV_Sum_%d.root",ifile)); else f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/pbsjoboutput/Bessfun/pPbDataV205m220/AnaV_Prod_%d.root",ifile)); TVectorD* Nevent_t = (TVectorD*)f[ifile]->Get(Form("Nevent")); TVectorD* totmultall_t = (TVectorD*)f[ifile]->Get(Form("totmultall")); TVectorD* tottrk_t = (TVectorD*)f[ifile]->Get(Form("tottrk")); TVectorD* totptall_t = (TVectorD*)f[ifile]->Get(Form("totptall")); TVectorD* totetaall_t = (TVectorD*)f[ifile]->Get(Form("totetaall")); TVectorD* Qx1_t = (TVectorD*)f[ifile]->Get(Form("Qx1")); TVectorD* Qy1_t = (TVectorD*)f[ifile]->Get(Form("Qy1")); TVectorD* Q2_t = (TVectorD*)f[ifile]->Get(Form("Q2")); for(int ibin=0;ibin<nbin;ibin++){ TH1D* hqx_t = (TH1D*)f[ifile]->Get(Form("hqx_%d",ibin)); hqx[ibin]->Add(hqx_t); TH1D* hqy_t = (TH1D*)f[ifile]->Get(Form("hqy_%d",ibin)); hqy[ibin]->Add(hqy_t); TH1D* hq2_t = (TH1D*)f[ifile]->Get(Form("hq2_%d",ibin)); hq2[ibin]->Add(hq2_t); TH1D* hq2nonf_t = (TH1D*)f[ifile]->Get(Form("hq2nonf_%d",ibin)); hq2nonf[ibin]->Add(hq2nonf_t); for(int itheta=0;itheta<ntheta;itheta++){ GRe_t[ibin][itheta] = (TVectorD*)f[ifile]->Get(Form("GRe_%d_%d",ibin,itheta)); GIm_t[ibin][itheta] = (TVectorD*)f[ifile]->Get(Form("GIm_%d_%d",ibin,itheta)); TH1D* hq_t = (TH1D*)f[ifile]->Get(Form("hq_%d_%d",ibin,itheta)); hq[ibin][itheta]->Add(hq_t); for(ir=0; ir<nstepr; ir++){ GRe[ibin][itheta][ir] += (*GRe_t[ibin][itheta])[ir]; GIm[ibin][itheta][ir] += (*GIm_t[ibin][itheta])[ir]; } } Qx1[ibin] += (*Qx1_t)[ibin]; Qy1[ibin] += (*Qy1_t)[ibin]; Q2[ibin] += (*Q2_t)[ibin]; totptall[ibin] += (*totptall_t)[ibin]; totetaall[ibin] += (*totetaall_t)[ibin]; Nevent[ibin] += (*Nevent_t)[ibin]; totmultall[ibin] += (*totmultall_t)[ibin]; tottrk[ibin] += (*tottrk_t)[ibin]; } f[ifile]->Close(); } fstrV<<setprecision(4)<<fixed; fstrV<<"ibin"<<"\t"<<"itheta"<<"\t"<<"r0"<<"\t"<<"V"<<"\t"<<"sigma2"<<"\t"<<"chi"<<"\t"<<"Vn Errors"<<endl; for(int ibin=0;ibin<nbin;ibin++){ avgmultall[ibin]=totmultall[ibin]/Nevent[ibin]; avgtrk[ibin]=tottrk[ibin]/Nevent[ibin]; for(int itheta=0;itheta<ntheta;itheta++){ for(ir=0; ir<nstepr; ir++){ G[ibin][itheta][ir]=TComplex(GRe[ibin][itheta][ir],GIm[ibin][itheta][ir]); G[ibin][itheta][ir]/=Nevent[ibin]; Gmod2[ibin][itheta][ir]=TMath::Power(TComplex::Abs(G[ibin][itheta][ir]),2); } for(ir=0; ir<nstepr-1; ir++) if(ir!=0 && Gmod2[ibin][itheta][ir]<=Gmod2[ibin][itheta][ir-1] && Gmod2[ibin][itheta][ir]<=Gmod2[ibin][itheta][ir+1]) break; if(ir!=0 && ir<nstepr-1) r01[ibin][itheta]=r[ibin][ir]; else if(ir==0) {cout<<"ibin="<<ibin<<"\t"<<"itheta="<<itheta<<"\tminimum lies on ir = 0, please select proper range!"<<endl; continue;} else {cout<<"ibin="<<ibin<<"\t"<<"itheta="<<itheta<<"\tminimum lies on ir = maximum "<<nstepr-1<<", please select proper range!"<<endl; continue;} avgpt[ibin]=1.0*totptall[ibin]/totmultall[ibin]; avgeta[ibin]=1.0*totetaall[ibin]/totmultall[ibin]; if(isSimple==0) V[ibin][itheta]=Vmax[ibin]-ir*eps[ibin]+eps[ibin]*(Gmod2[ibin][itheta][ir+1]-Gmod2[ibin][itheta][ir-1])/2./(Gmod2[ibin][itheta][ir-1]-2*Gmod2[ibin][itheta][ir]+Gmod2[ibin][itheta][ir+1]); else V[ibin][itheta]=j01/r01[ibin][itheta]; //simple method r0[ibin][itheta]=j01/V[ibin][itheta]; V[ibin][itheta]/=avgmultall[ibin]; sigma2[ibin][itheta]=Q2[ibin]/Nevent[ibin]-(Qx1[ibin]/Nevent[ibin])*(Qx1[ibin]/Nevent[ibin])-(Qy1[ibin]/Nevent[ibin])*(Qy1[ibin]/Nevent[ibin]); sigma2_[ibin]+=sigma2[ibin][itheta]; Vmean[ibin]+=V[ibin][itheta]; chi[ibin][itheta]=V[ibin][itheta]*avgmultall[ibin]/TMath::Sqrt(sigma2[ibin][itheta]); } //deltaVmean[ibin]+=TMath::Exp(j01*j01/2./chi[ibin][itheta]/chi[ibin][itheta]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Sin(nn*theta[itheta]/2.))+TMath::Exp(-j01*j01/2./chi[ibin][itheta]/chi[ibin][itheta]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Cos(nn*theta[itheta]/2.)); sigma2_[ibin]/=ntheta; Vmean[ibin]/=ntheta; sigma2_[ibin]-=TMath::Power(Vmean[ibin]*avgmultall[ibin],2); chi_[ibin]=Vmean[ibin]*avgmultall[ibin]/TMath::Sqrt(sigma2_[ibin]); for(int itheta=0;itheta<ntheta;itheta++){ deltaV[ibin][itheta]=V[ibin][itheta]/j01/TMath::BesselJ1(j01)*TMath::Sqrt((TMath::Exp(j01*j01/2./chi_[ibin]/chi_[ibin])+TMath::Exp(-j01*j01/2./chi_[ibin]/chi_[ibin])*TMath::BesselJ0(2*j01))/2./Nevent[ibin]); deltaVmean[ibin]+=TMath::Exp(j01*j01/2./chi_[ibin]/chi_[ibin]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Sin(nn*theta[itheta]/2.))+TMath::Exp(-j01*j01/2./chi_[ibin]/chi_[ibin]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Cos(nn*theta[itheta]/2.)); fstrV<<ibin<<"\t"<<itheta<<"\t"<<r0[ibin][itheta]<<"\t"<<V[ibin][itheta]<<"\t"<<sigma2[ibin][itheta]<<"\t"<<chi[ibin][itheta]<<"\t"<<deltaV[ibin][itheta]<<endl; } fstrV<<"\t\t\t\t\t"<<sigma2_[ibin]<<"\t"<<chi_[ibin]<<endl; deltaVmean[ibin]=Vmean[ibin]/j01/TMath::BesselJ1(j01)*TMath::Sqrt(deltaVmean[ibin]/ntheta/2./Nevent[ibin]); fstrV<<endl; } fstrV<<"ibin"<<"\t"<<"avgmult"<<"\t"<<"avgpt"<<"\t"<<"avgeta"<<"\t"<<"Vn mean"<<"\t"<<"Vn mean Error"<<endl; for(int ibin=0;ibin<nbin;ibin++){ fstrV<<ibin<<"\t"<<avgmultall[ibin]<<"\t"<<avgpt[ibin]<<"\t"<<avgeta[ibin]<<"\t"<<Vmean[ibin]<<"\t"<<deltaVmean[ibin]<<endl; fstrV<<endl; } fstrV<<"ibin"<<"\t"<<"Nevent"<<"\t"<<"totmultall"<<"\t"<<"avgmultall"<<"\t"<<"avgtrk"<<endl; for(int ibin=0;ibin<nbin;ibin++){ fstrV<<ibin<<"\t"<<Nevent[ibin]<<"\t"<<totmultall[ibin]<<"\t"<<avgmultall[ibin]<<"\t"<<avgtrk[ibin]<<endl; fstrV<<endl; } if(isSum) TString outname = "mergedV_Sum.root"; else TString outname="mergedV_Prod.root"; TFile *outf = new TFile(outname,"Recreate"); Nevent.Write("Nevent"); totmultall.Write("totmultall"); avgmultall.Write("avgmultall"); tottrk.Write("tottrk"); avgtrk.Write("avgtrk"); Qx1.Write("Qx1"); Qy1.Write("Qy1"); Q2.Write("Q2"); avgpt.Write("avgpt"); avgeta.Write("avgeta"); Vmean.Write("Vmean"); deltaVmean.Write("deltaVmean"); chi_.Write("chi"); sigma2_.Write("sigma2"); for(int ibin=0;ibin<nbin;ibin++){ TDirectory *dir0 = outf->mkdir(Form("D_%d",ibin));dir0->cd(); r[ibin].Write("r"); sigma2[ibin].Write("sigma2"); chi[ibin].Write("chi0"); deltaV[ibin].Write("deltaV"); r0[ibin].Write("r0"); r01[ibin].Write("r01"); V[ibin].Write("V"); hqx[ibin]->Write(); hqy[ibin]->Write();hq2[ibin]->Write();hq2nonf[ibin]->Write(); for(int itheta=0;itheta<ntheta;itheta++){ TDirectory *dir1 = dir0->mkdir(Form("D_%d",itheta));dir1->cd(); GRe[ibin][itheta].Write(Form("GRe")); GIm[ibin][itheta].Write(Form("GIm")); Gmod2[ibin][itheta].Write(Form("G2")); hq[ibin][itheta]->Write(); } } outf->Close(); }
void getResv2(){ ifstream f_("merged.root"); if(!f_.good()){ system("hadd merged.root /scratch/xuq7/flow/EPAnalyzer/pPbDataV205m100/Original/Varmult/AnaEP_*.root"); } TFile *fmerged = TFile::Open("merged.root"); TH1D* hEPPhip[nbin][neta]; TH1D* hEPPhin[nbin][neta]; TH1D* hEPPhic[nbin][neta]; for(int ibin=0;ibin<nbin;ibin++){ for(int ieta=0;ieta<neta;ieta++){ hEPPhip[ibin][ieta] = (TH1D*)fmerged->Get(Form("hEPPhip_%d_%d",ibin,ieta)); hEPPhin[ibin][ieta] = (TH1D*)fmerged->Get(Form("hEPPhin_%d_%d",ibin,ieta)); hEPPhic[ibin][ieta] = (TH1D*)fmerged->Get(Form("hEPPhic_%d_%d",ibin,ieta)); } } ofstream fstrV; fstrV.open("v2.txt"); TFile *f[nFileAll]; TVectorD Nevent; Nevent.ResizeTo(nbin); Nevent.Zero(); TVectorD totmultall; totmultall.ResizeTo(nbin); totmultall.Zero(); TVectorD EPR[nbin], EPRpc[nbin], EPRpm[nbin], EPRcm[nbin]; for(int ibin=0;ibin<nbin;ibin++){ EPR[ibin].ResizeTo(neta); EPR[ibin].Zero(); EPRpc[ibin].ResizeTo(neta); EPRpc[ibin].Zero(); EPRpm[ibin].ResizeTo(neta); EPRpm[ibin].Zero(); EPRcm[ibin].ResizeTo(neta); EPRcm[ibin].Zero(); } TVectorD avgmult; avgmult.ResizeTo(nbin); TVectorD totmult[nbin], totpt[nbin], avgpt[nbin]; TVectorD Vobs[nbin][neta], Vcorr[nbin][neta], Vcorrerr[nbin][neta], Vcorr3[nbin][neta], Vcorr3err[nbin][neta], Vobserr[nbin][neta]; TVectorD totmultp[nbin][neta], totmultn[nbin][neta], totmultc[nbin][neta]; for(int ibin=0;ibin<nbin;ibin++){ totmult[ibin].ResizeTo(npt); totmult[ibin].Zero(); totpt[ibin].ResizeTo(npt); totpt[ibin].Zero(); avgpt[ibin].ResizeTo(npt); avgpt[ibin].Zero(); for(int ieta=0;ieta<neta;ieta++){ Vobs[ibin][ieta].ResizeTo(npt); Vobs[ibin][ieta].Zero(); Vobserr[ibin][ieta].ResizeTo(npt); Vobserr[ibin][ieta].Zero(); totmultp[ibin][ieta].ResizeTo(npt); totmultp[ibin][ieta].Zero(); totmultn[ibin][ieta].ResizeTo(npt); totmultn[ibin][ieta].Zero(); totmultc[ibin][ieta].ResizeTo(npt); totmultc[ibin][ieta].Zero(); Vcorr[ibin][ieta].ResizeTo(npt); Vcorr[ibin][ieta].Zero(); Vcorrerr[ibin][ieta].ResizeTo(npt); Vcorrerr[ibin][ieta].Zero(); Vcorr3[ibin][ieta].ResizeTo(npt); Vcorr3[ibin][ieta].Zero(); Vcorr3err[ibin][ieta].ResizeTo(npt); Vcorr3err[ibin][ieta].Zero(); } } for(int ifile=0; ifile<nFileAll; ifile++){ f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/EPAnalyzer/pPbDataV205m100/Original/Varmult/AnaEP_%d.root",ifile)); TVectorD* Nevent_t = (TVectorD*)f[ifile]->Get(Form("Nevent")); TVectorD* totmultall_t = (TVectorD*)f[ifile]->Get(Form("totmultall")); for(int ibin=0;ibin<nbin;ibin++){ TVectorD* EPR_t = (TVectorD*)f[ifile]->Get(Form("EPR_%d",ibin)); TVectorD* EPRpc_t = (TVectorD*)f[ifile]->Get(Form("EPRpc_%d",ibin)); TVectorD* EPRpm_t = (TVectorD*)f[ifile]->Get(Form("EPRpm_%d",ibin)); TVectorD* EPRcm_t = (TVectorD*)f[ifile]->Get(Form("EPRcm_%d",ibin)); TVectorD* totmult_t = (TVectorD*)f[ifile]->Get(Form("totmult_%d",ibin)); TVectorD* totpt_t = (TVectorD*)f[ifile]->Get(Form("totpt_%d",ibin)); Nevent[ibin] += (*Nevent_t)[ibin]; totmultall[ibin] += (*totmultall_t)[ibin]; for(int iptbin=0;iptbin<npt;iptbin++){ totmult[ibin][iptbin] += (*totmult_t)[iptbin]; totpt[ibin][iptbin] += (*totpt_t)[iptbin]; } for(int ieta=0;ieta<neta;ieta++){ EPR[ibin][ieta] += (*EPR_t)[ieta]; EPRpc[ibin][ieta] += (*EPRpc_t)[ieta]; EPRpm[ibin][ieta] += (*EPRpm_t)[ieta]; EPRcm[ibin][ieta] += (*EPRcm_t)[ieta]; TVectorD* Vobs_t = (TVectorD*)f[ifile]->Get(Form("v2obs_%d_%d",ibin,ieta)); TVectorD* totmultp_t = (TVectorD*)f[ifile]->Get(Form("totmultp_%d_%d",ibin,ieta)); TVectorD* totmultn_t = (TVectorD*)f[ifile]->Get(Form("totmultn_%d_%d",ibin,ieta)); TVectorD* totmultc_t = (TVectorD*)f[ifile]->Get(Form("totmultc_%d_%d",ibin,ieta)); for(int iptbin=0;iptbin<npt;iptbin++){ Vobs[ibin][ieta][iptbin] += (*Vobs_t)[iptbin]; totmultp[ibin][ieta][iptbin] += (*totmultp_t)[iptbin]; totmultn[ibin][ieta][iptbin] += (*totmultn_t)[iptbin]; totmultc[ibin][ieta][iptbin] += (*totmultc_t)[iptbin]; } } } f[ifile]->Close(); } TFile *outf = new TFile("mergedVobs.root","Recreate"); Nevent.Write("Nevent"); totmultall.Write("totmultall"); for(int ibin=0;ibin<nbin;ibin++){ for(int ieta=0;ieta<neta;ieta++){ hEPPhip[ibin][ieta]->Write(); hEPPhin[ibin][ieta]->Write(); hEPPhic[ibin][ieta]->Write(); } } fstrV<<setprecision(4)<<fixed; fstrV<<"ibin"<<"\t"<<"ieta"<<"\t"<<"iptbin"<<"\t"<<"avgpt"<<"\t"<<"v2obs"<<"\t"<<"v2obserr"<<"v2corr"<<"\t"<<"v2correrr"<<"\t"<<"v2corr3"<<"\t"<<"v2corr3err"<<"\t"<<"R"<<"\t"<<"R3"<<endl; for(int ibin=0;ibin<nbin;ibin++){ avgmult[ibin]=(double)totmultall[ibin]/Nevent[ibin]; for(int iptbin=0;iptbin<npt;iptbin++){ avgpt[ibin][iptbin]=totpt[ibin][iptbin]/totmult[ibin][iptbin]; } for(int ieta=0;ieta<neta;ieta++){ //EPR[ibin][ieta]=EPR[ibin][ieta]/Nevent[ibin]; EPR[ibin][ieta]=sqrt(EPR[ibin][ieta]/Nevent[ibin]); EPRpc[ibin][ieta]=EPRpc[ibin][ieta]/Nevent[ibin]; EPRcm[ibin][ieta]=EPRcm[ibin][ieta]/Nevent[ibin]; EPRpm[ibin][ieta]=EPRpm[ibin][ieta]/Nevent[ibin]; for(int iptbin=0;iptbin<npt;iptbin++){ Vobs[ibin][ieta][iptbin]/=totmultc[ibin][ieta][iptbin]; Vobserr[ibin][ieta][iptbin]=sqrt(1.0/totmultc[ibin][ieta][iptbin]); Vcorr[ibin][ieta][iptbin]=Vobs[ibin][ieta][iptbin]/EPR[ibin][ieta]; Vcorrerr[ibin][ieta][iptbin]=Vobserr[ibin][ieta][iptbin]/EPR[ibin][ieta]; Vcorr3[ibin][ieta][iptbin]=Vobs[ibin][ieta][iptbin]/sqrt(EPRpc[ibin][ieta]*EPRpm[ibin][ieta]/EPRcm[ibin][ieta]); Vcorr3err[ibin][ieta][iptbin]=Vobserr[ibin][ieta][iptbin]/sqrt(EPRpc[ibin][ieta]*EPRpm[ibin][ieta]/EPRcm[ibin][ieta]); fstrV<<trkbin[ibin+1]<<"-"<<trkbin[ibin]<<"\t"<<etap[ieta]<<"-"<<etan[ieta]<<"\t"<<ptbin[iptbin]<<"-"<<ptbin[iptbin+1]<<"\t"<<avgpt[ibin][iptbin]<<"\t"<<Vobs[ibin][ieta][iptbin]<<"\t"<<Vobserr[ibin][ieta][iptbin]<<"\t"<<Vcorr[ibin][ieta][iptbin]<<"\t"<<Vcorrerr[ibin][ieta][iptbin]<<"\t"<<Vcorr3[ibin][ieta][iptbin]<<"\t"<<Vcorr3err[ibin][ieta][iptbin]<<"\t"<<EPR[ibin][ieta]<<"\t"<<sqrt(EPRpc[ibin][ieta]*EPRpm[ibin][ieta]/EPRcm[ibin][ieta])<<endl; } fstrV<<endl; } TDirectory *dir0 = outf->mkdir(Form("D_%d",ibin)); dir0->cd(); totmult[ibin].Write("totmult"); avgpt[ibin].Write("avgpt"); EPR[ibin].Write("EPR"); EPRpc[ibin].Write("EPRpc"); EPRpm[ibin].Write("EPRpm"); EPRcm[ibin].Write("EPRcm"); for(int ieta=0;ieta<neta;ieta++){ TDirectory *dir1 = dir0->mkdir(Form("E_%d",ieta)); dir1->cd(); Vobs[ibin][ieta].Write("v2obs"); Vobserr[ibin][ieta].Write("v2obserr"); totmultp[ibin][ieta].Write("totmultp"); totmultn[ibin][ieta].Write("totmultn"); totmultc[ibin][ieta].Write("totmultc"); Vcorr[ibin][ieta].Write("v2"); Vcorrerr[ibin][ieta].Write("v2err"); Vcorr3[ibin][ieta].Write("v23sub"); Vcorr3err[ibin][ieta].Write("v23suberr"); } } outf->cd(); avgmult.Write("avgmult"); outf->Close(); remove("merged.root"); }
void plotDYEfficiency(const TString input) { gBenchmark->Start("plotDYEfficiency"); //-------------------------------------------------------------------------------------------------------------- // Settings //============================================================================================================== Bool_t doSave = false; // save plots? TString format = "png"; // output file format vector<TString> fnamev; // file names vector<TString> labelv; // legend label vector<Int_t> colorv; // color in plots vector<Int_t> linev; // line style vector<Double_t> xsecv; vector<Double_t> lumiv; TString dirTag; ifstream ifs; ifs.open(input.Data()); assert(ifs.is_open()); string line; Int_t state=0; while(getline(ifs,line)) { if(line[0]=='#') continue; if(state == 0){ dirTag = TString(line); state++; continue; }else{ string fname; Int_t color, linesty; stringstream ss(line); Double_t xsec; ss >> fname >> xsec >> color >> linesty; string label = line.substr(line.find('@')+1); fnamev.push_back(fname); labelv.push_back(label); colorv.push_back(color); linev.push_back(linesty); xsecv.push_back(xsec); lumiv.push_back(0); } } ifs.close(); const Double_t kGAP_LOW = 1.4442; const Double_t kGAP_HIGH = 1.566; //-------------------------------------------------------------------------------------------------------------- // Main analysis code //============================================================================================================== // // Set up histograms // vector<TH1F*> hZMassv;//, hZMass2v, hZPtv, hZPt2v, hZyv, hZPhiv; Double_t nZv = 0; TVectorD nEventsv (DYTools::nMassBins); TVectorD nPassv (DYTools::nMassBins); TVectorD effv (DYTools::nMassBins); TVectorD effErrv (DYTools::nMassBins); TVectorD nEventsBBv (DYTools::nMassBins); TVectorD nEventsBEv (DYTools::nMassBins); TVectorD nEventsEEv (DYTools::nMassBins); TVectorD nPassBBv(DYTools::nMassBins), effBBv(DYTools::nMassBins), effErrBBv(DYTools::nMassBins); TVectorD nPassBEv(DYTools::nMassBins), effBEv(DYTools::nMassBins), effErrBEv(DYTools::nMassBins); TVectorD nPassEEv(DYTools::nMassBins), effEEv(DYTools::nMassBins), effErrEEv(DYTools::nMassBins); TVectorD nEventsZPeakPU(DYTools::nPVBinCount), nPassZPeakPU(DYTools::nPVBinCount); TVectorD nEventsZPeakPURaw(100), nPassZPeakPURaw(100); TVectorD effZPeakPU(DYTools::nPVBinCount), effErrZPeakPU(DYTools::nPVBinCount); nEventsv = 0; nEventsBBv = 0; nEventsBEv = 0; nEventsEEv = 0; nPassv = 0; nPassBBv = 0; nPassBEv = 0; nPassEEv = 0; char hname[100]; for(UInt_t ifile = 0; ifile<fnamev.size(); ifile++) { sprintf(hname,"hZMass_%i",ifile); hZMassv.push_back(new TH1F(hname,"",500,0,1500)); hZMassv[ifile]->Sumw2(); } // // Access samples and fill histograms // TFile *infile=0; TTree *eventTree=0; // Data structures to store info from TTrees mithep::TEventInfo *info = new mithep::TEventInfo(); mithep::TGenInfo *gen = new mithep::TGenInfo(); TClonesArray *dielectronArr = new TClonesArray("mithep::TDielectron"); TClonesArray *pvArr = new TClonesArray("mithep::TVertex"); // loop over samples int countMismatch = 0; for(UInt_t ifile=0; ifile<fnamev.size(); ifile++) { // Read input file cout << "Processing " << fnamev[ifile] << "..." << endl; infile = new TFile(fnamev[ifile]); assert(infile); // Get the TTrees eventTree = (TTree*)infile->Get("Events"); assert(eventTree); // Find weight for events for this file // The first file in the list comes with weight 1, // all subsequent ones are normalized to xsection and luminosity double xsec=xsecv[ifile]; AdjustXSectionForSkim(infile,xsec,eventTree->GetEntries(),1); lumiv[ifile] = eventTree->GetEntries()/xsec; double scale = lumiv[0]/lumiv[ifile]; cout << " -> sample weight is " << scale << endl; // Set branch address to structures that will store the info eventTree->SetBranchAddress("Info",&info); TBranch *infoBr = eventTree->GetBranch("Info"); eventTree->SetBranchAddress("Gen",&gen); TBranch *genBr = eventTree->GetBranch("Gen"); eventTree->SetBranchAddress("Dielectron",&dielectronArr); TBranch *dielectronBr = eventTree->GetBranch("Dielectron"); eventTree->SetBranchAddress("PV", &pvArr); TBranch *pvBr = eventTree->GetBranch("PV"); // loop over events nZv += scale * eventTree->GetEntries(); for(UInt_t ientry=0; ientry<eventTree->GetEntries(); ientry++) { genBr->GetEntry(ientry); infoBr->GetEntry(ientry); /* // For EPS2011 for both data and MC (starting from Summer11 production) // we use an OR of the twi triggers below. Both are unpresecaled. ULong_t eventTriggerBit = kHLT_Ele17_CaloIdL_CaloIsoVL_Ele8_CaloIdL_CaloIsoVL | kHLT_Ele17_CaloIdT_TrkIdVL_CaloIsoVL_TrkIsoVL_Ele8_CaloIdT_TrkIdVL_CaloIsoVL_TrkIsoVL; ULong_t leadingTriggerObjectBit = kHLT_Ele17_CaloIdL_CaloIsoVL_Ele8_CaloIdL_CaloIsoVL_Ele1Obj | kHLT_Ele17_CaloIdT_TrkIdVL_CaloIsoVL_TrkIsoVL_Ele8_CaloIdT_TrkIdVL_CaloIsoVL_TrkIsoVL_Ele1Obj; ULong_t trailingTriggerObjectBit = kHLT_Ele17_CaloIdL_CaloIsoVL_Ele8_CaloIdL_CaloIsoVL_Ele2Obj | kHLT_Ele17_CaloIdT_TrkIdVL_CaloIsoVL_TrkIsoVL_Ele8_CaloIdT_TrkIdVL_CaloIsoVL_TrkIsoVL_Ele2Obj; */ const bool isData=kFALSE; TriggerConstantSet constantsSet = Full2011DatasetTriggers; // Enum from TriggerSelection.hh TriggerSelection requiredTriggers(constantsSet, isData, info->runNum); ULong_t eventTriggerBit = requiredTriggers.getEventTriggerBit(info->runNum); ULong_t leadingTriggerObjectBit = requiredTriggers.getLeadingTriggerObjectBit(info->runNum); ULong_t trailingTriggerObjectBit = requiredTriggers.getTrailingTriggerObjectBit(info->runNum); // The A_FSR starting point: gen level quantities // The FSR subscript means we work with post-FSR generator level quantities double et1 = gen->pt_1; double et2 = gen->pt_2; double eta1 = gen->eta_1; double eta2 = gen->eta_2; // Apply acceptance requirement if( ! ( ( et1 > DYTools::etMinLead && et2 > DYTools::etMinTrail) || ( et1 > DYTools::etMinTrail && et2 > DYTools::etMinLead) )) continue; if((fabs(eta1) >= 2.5) || (fabs(eta2) >= 2.5)) continue; if((fabs(eta1) >= kGAP_LOW) && (fabs(eta1) <= kGAP_HIGH)) continue; if((fabs(eta2) >= kGAP_LOW) && (fabs(eta2) <= kGAP_HIGH)) continue; // These events are in acceptance, use them for efficiency denominator Bool_t isBGen1 = (fabs(eta1)<kGAP_LOW); Bool_t isBGen2 = (fabs(eta2)<kGAP_LOW); // determine number of good vertices pvBr->GetEntry(ientry); int iPUBin=-1; int nGoodPV=-1; if ((gen->mass>=60) && (gen->mass<=120)) { nGoodPV=0; for (Int_t ipv=0; ipv<pvArr->GetEntriesFast(); ipv++) { const mithep::TVertex *pv = (mithep::TVertex*)((*pvArr)[ipv]); if(pv->nTracksFit < 1) continue; if(pv->ndof < 4) continue; if(fabs(pv->z) > 24) continue; if(sqrt((pv->x)*(pv->x)+(pv->y)*(pv->y)) > 2) continue; nGoodPV++; } if (nGoodPV>0) { if (nGoodPV<=nEventsZPeakPURaw.GetNoElements()) nEventsZPeakPURaw[nGoodPV] += scale * gen->weight; iPUBin=DYTools::findMassBin(double(nGoodPV),DYTools::nPVBinCount,DYTools::nPVLimits); //std::cout << "iPUBin=" << iPUBin << ", nGoodPV=" << nGoodPV << "\n"; if ((iPUBin!=-1) && (iPUBin < nEventsZPeakPU.GetNoElements())) { nEventsZPeakPU[iPUBin] += scale * gen->weight; } else { std::cout << "error in PU bin indexing iPUBin=" << iPUBin << ", nGoodPV=" << nGoodPV << "\n"; } } //else std::cout << "nGoodPV=" << nGoodPV << "\n"; } // Use post-FSR generator level mass for binning int ibinGen = DYTools::findMassBin(gen->mass); // Accumulate denominator for efficiency calculations if(ibinGen != -1 && ibinGen < nEventsv.GetNoElements()){ nEventsv[ibinGen] += scale * gen->weight; // Split events barrel/endcap using matched supercluster or particle eta if(isBGen1 && isBGen2) { nEventsBBv[ibinGen] += scale * gen->weight; } else if(!isBGen1 && !isBGen2) { nEventsEEv[ibinGen] += scale * gen->weight; } else if((isBGen1 && !isBGen2) || (!isBGen1 && isBGen2)) { nEventsBEv[ibinGen] += scale * gen->weight; } }else if(ibinGen >= nEventsv.GetNoElements()) cout << "ERROR: binning problem" << endl; if(!(info->triggerBits & eventTriggerBit)) continue; // no trigger accept? Skip to next event... // loop through dielectrons dielectronArr->Clear(); dielectronBr->GetEntry(ientry); for(Int_t i=0; i<dielectronArr->GetEntriesFast(); i++) { const mithep::TDielectron *dielectron = (mithep::TDielectron*)((*dielectronArr)[i]); // Apply selection // Eta cuts if((fabs(dielectron->scEta_1)>kGAP_LOW) && (fabs(dielectron->scEta_1)<kGAP_HIGH)) continue; if((fabs(dielectron->scEta_2)>kGAP_LOW) && (fabs(dielectron->scEta_2)<kGAP_HIGH)) continue; if((fabs(dielectron->scEta_1) > 2.5) || (fabs(dielectron->scEta_2) > 2.5)) continue; // outside eta range? Skip to next event... Bool_t isB1 = (fabs(dielectron->scEta_1)<kGAP_LOW); Bool_t isB2 = (fabs(dielectron->scEta_2)<kGAP_LOW); if( !( (isB1 == isBGen1 && isB2 == isBGen2 ) || (isB1 == isBGen2 && isB2 == isBGen1 ) ) ) countMismatch++; // Asymmetric SC Et cuts if( ! ( ( dielectron->scEt_1 > DYTools::etMinLead && dielectron->scEt_2 > DYTools::etMinTrail) || ( dielectron->scEt_1 > DYTools::etMinTrail && dielectron->scEt_2 > DYTools::etMinLead) )) continue; // Both electrons must match trigger objects. At least one ordering // must match if( ! ( (dielectron->hltMatchBits_1 & leadingTriggerObjectBit && dielectron->hltMatchBits_2 & trailingTriggerObjectBit ) || (dielectron->hltMatchBits_1 & trailingTriggerObjectBit && dielectron->hltMatchBits_2 & leadingTriggerObjectBit ) ) ) continue; // The Smurf electron ID package is the same as used in HWW analysis // and contains cuts like VBTF WP80 for pt>20, VBTF WP70 for pt<10 // with some customization, plus impact parameter cuts dz and dxy if(!passSmurf(dielectron)) continue; /******** We have a Z candidate! HURRAY! ********/ hZMassv[ifile]->Fill(gen->mass,scale * gen->weight); // DEBUG // if(ibinGen == 12) // printf("Gen mass %f reco mass %f scEt_1= %f scEt_2= %f scEta_1= %f scEta_2= %f\n", // gen->mass, dielectron->mass, dielectron->scEt_1, dielectron->scEt_2, // dielectron->scEta_1, dielectron->scEta_2); // Accumulate numerator for efficiency calculations if ((nGoodPV>0) && (iPUBin!=-1)) { // -1 may also indicate that the mass was not in Z-peak range if ((nGoodPV>=0) && (nGoodPV<=nEventsZPeakPURaw.GetNoElements())) nPassZPeakPURaw[nGoodPV] += scale * gen->weight; if (iPUBin < nPassZPeakPU.GetNoElements()) { nPassZPeakPU[iPUBin] += scale * gen->weight; } else { std::cout << "error in PU bin indexing\n"; } } if(ibinGen != -1 && ibinGen < nPassv.GetNoElements()){ nPassv[ibinGen] += scale * gen->weight; if(isB1 && isB2) { nPassBBv[ibinGen] += scale * gen->weight; } else if(!isB1 && !isB2) { nPassEEv[ibinGen] += scale * gen->weight; } else if((isB1 && !isB2) || (!isB1 && isB2)) { nPassBEv[ibinGen] += scale * gen->weight; } } } // end loop over dielectrons } // end loop over events delete infile; infile=0, eventTree=0; } // end loop over files delete gen; effv = 0; effErrv = 0; effBBv = 0; effErrBBv = 0; effBEv = 0; effErrBEv = 0; effEEv = 0; effErrEEv = 0; for(int i=0; i<DYTools::nMassBins; i++){ if(nEventsv[i] != 0){ effv[i] = nPassv[i]/nEventsv[i]; effErrv[i] = sqrt(effv[i]*(1-effv[i])/nEventsv[i]); effBBv[i] = nPassBBv[i]/nEventsBBv[i]; effErrBBv[i] = sqrt(effBBv[i]*(1-effBBv[i])/nEventsBBv[i]); effBEv[i] = nPassBEv[i]/nEventsBEv[i]; effErrBEv[i] = sqrt(effBEv[i]*(1-effBEv[i])/nEventsBEv[i]); effEEv[i] = nPassEEv[i]/nEventsEEv[i]; effErrEEv[i] = sqrt(effEEv[i]*(1-effEEv[i])/nEventsEEv[i]); } }; effZPeakPU=0; effErrZPeakPU=0; for (int i=0; i<DYTools::nPVBinCount; ++i) { effZPeakPU[i]= nPassZPeakPU[i]/nEventsZPeakPU[i]; effErrZPeakPU[i]= sqrt(effZPeakPU[i]*(1-effZPeakPU[i])/nEventsZPeakPU[i]); } printf("Sanity check: gen vs reco barrel-endcap assignment mismatches: %d\n",countMismatch); //-------------------------------------------------------------------------------------------------------------- // Make plots //============================================================================================================== TCanvas *c = MakeCanvas("c","c",800,600); // string buffers char ylabel[50]; // y-axis label // Z mass sprintf(ylabel,"a.u. / %.1f GeV/c^{2}",hZMassv[0]->GetBinWidth(1)); CPlot plotZMass1("zmass1","","m(Z) [GeV/c^{2}]",ylabel); for(UInt_t i=0; i<fnamev.size(); i++) { plotZMass1.AddHist1D(hZMassv[i],labelv[i],"hist",colorv[i],linev[i]); } plotZMass1.SetLogy(); plotZMass1.Draw(c,doSave,format); // Prepare the overall efficiency plot double x [DYTools::nMassBins]; double dx[DYTools::nMassBins]; double y [DYTools::nMassBins]; double dy[DYTools::nMassBins]; for(int i=0; i<DYTools::nMassBins; i++){ x[i] = (DYTools::massBinLimits[i ] + DYTools::massBinLimits[i+1])/2.0; dx[i] = (DYTools::massBinLimits[i+1] - DYTools::massBinLimits[i ])/2.0; y[i] = effv[i]; dy[i] = effErrv[i]; } TGraphErrors *efficiencyGraph = new TGraphErrors(DYTools::nMassBins,x,y,dx,dy); TCanvas *c1 = MakeCanvas("c1","c1",1000,600); CPlot plotEfficiency("Efficiency","","M_{ee} [GeV/c^{2}]","efficiency"); plotEfficiency.SetLogx(); plotEfficiency.AddGraph((TGraph*)efficiencyGraph,"PE",600,kFullDotMedium,1); plotEfficiency.SetYRange(0,1.0); plotEfficiency.SetXRange(10,1500.0); efficiencyGraph->GetYaxis()->SetTitleOffset(1.0); efficiencyGraph->GetXaxis()->SetMoreLogLabels(); efficiencyGraph->GetXaxis()->SetNoExponent(); efficiencyGraph->SetMarkerStyle(20); efficiencyGraph->SetMarkerSize(1); plotEfficiency.Draw(c1,doSave,format); // Prepare the overall efficiency plot of Z-peak region vs number of primary vertices double x_2 [DYTools::nPVBinCount]; double dx_2[DYTools::nPVBinCount]; double y_2 [DYTools::nPVBinCount]; double dy_2[DYTools::nPVBinCount]; for(int i=0; i<DYTools::nPVBinCount; i++){ x_2[i] = (DYTools::nPVLimits[i ] + DYTools::nPVLimits[i+1])/2.0; dx_2[i] = (DYTools::nPVLimits[i+1] - DYTools::nPVLimits[i ])/2.0; y_2[i] = effZPeakPU[i]; dy_2[i] = effErrZPeakPU[i]; } TGraphErrors *efficiencyGraphZPeakPU = new TGraphErrors(DYTools::nPVBinCount,x_2,y_2,dx_2,dy_2); TCanvas *cz = MakeCanvas("cz","cz",1000,600); CPlot plotEfficiencyZPeakPU("Efficiency","","number of good PVs","efficiency"); plotEfficiencyZPeakPU.SetLogx(); plotEfficiencyZPeakPU.AddGraph((TGraph*)efficiencyGraphZPeakPU,"PE",600,kFullDotMedium,1); plotEfficiencyZPeakPU.SetYRange(0,1.0); plotEfficiencyZPeakPU.SetXRange(10,100.0); efficiencyGraph->GetYaxis()->SetTitleOffset(1.0); efficiencyGraph->GetXaxis()->SetMoreLogLabels(); efficiencyGraph->GetXaxis()->SetNoExponent(); efficiencyGraph->SetMarkerStyle(20); efficiencyGraph->SetMarkerSize(1); plotEfficiencyZPeakPU.Draw(cz,doSave,format); // Store constants in the file TString outputDir(TString("../root_files/constants/")+dirTag); gSystem->mkdir(outputDir,kTRUE); TString effConstFileName(outputDir+TString("/event_efficiency_constants.root")); TFile fa(effConstFileName,"recreate"); effv.Write("efficiencyArray"); effErrv.Write("efficiencyErrArray"); effZPeakPU.Write("efficiencyZPeakPUArray"); effErrZPeakPU.Write("efficiencyErrZPeakPUArray"); nEventsZPeakPU.Write("nEventsZPeakPUArray"); nPassZPeakPU.Write("nPassZPeakPUArray"); nEventsZPeakPURaw.Write("nEventsZPeakPURawArray"); nPassZPeakPURaw.Write("nPassZPeakPURawArray"); fa.Close(); //-------------------------------------------------------------------------------------------------------------- // Summary print out //============================================================================================================== cout << endl; cout << "*" << endl; cout << "* SUMMARY" << endl; cout << "*--------------------------------------------------" << endl; cout << endl; cout << labelv[0] << " file: " << fnamev[0] << endl; printf(" Number of generated events: %8.1lf",nZv); printf(" mass bin preselected passed total_Eff BB-BB_Eff EB-BB_Eff EB-EB_Eff \n"); for(int i=0; i<DYTools::nMassBins; i++){ printf(" %4.0f-%4.0f %10.0f %10.0f %7.4f+-%6.4f %7.4f+-%6.4f %7.4f+-%6.4f %7.4f+-%6.4f \n", DYTools::massBinLimits[i], DYTools::massBinLimits[i+1], nEventsv[i], nPassv[i], effv[i], effErrv[i], effBBv[i], effErrBBv[i], effBEv[i], effErrBEv[i], effEEv[i], effErrEEv[i]); } printf("\n\nZ-peak efficiency\n"); printf(" PU bin preselected passed total_Eff\n"); for(int i=0; i<DYTools::nPVBinCount; i++){ printf(" %4.0f-%4.0f %10.0f %10.0f %7.4f+-%6.4f\n", DYTools::nPVLimits[i], DYTools::nPVLimits[i+1], nEventsZPeakPU[i], nPassZPeakPU[i], effZPeakPU[i], effErrZPeakPU[i]); } cout << endl; gBenchmark->Show("plotDYEfficiency"); }
void getResV(){ //------------------------Deal with the number and get the output stored in txt files and root files string SumorProd = getenv("SUMORPROD"); string dir = getenv("DIR"); double Vmax[nbin], eps[nbin]; for(int ibin=0; ibin<nbin ;ibin++){ Vmax[ibin]=0.065*avgmultIn; eps[ibin]=0.00025*avgmultIn; } ofstream fstrV; double theta[ntheta]; TVectorD avgmult[nbin], avgpt[nbin], totmult[nbin], totpt[nbin]; TVectorD Qx1[nbin], Qy1[nbin], Q2[nbin]; TVectorD Gmod2[nbin][nptV][ntheta]; TVectorD sigma2[nbin][nptV],deltaV[nbin][nptV]; TVectorD sigma2_[nbin],chi_[nbin]; TVectorD deltaVmean[nbin], Vmean[nbin]; TVectorD r[nbin]; TVectorD r0[nbin][nptV], r01[nbin][nptV], V[nbin][nptV], chi[nbin][nptV]; TVectorD GRe[nbin][nptV][ntheta]; TVectorD* GRe_t[nbin][nptV][ntheta]; TVectorD GIm[nbin][nptV][ntheta]; TVectorD* GIm_t[nbin][nptV][ntheta]; TComplex G[nbin][nptV][ntheta][nstepr]; if(SumorProd=="Sum") fstrV.open("V_Sum.txt"); else fstrV.open("V_Prod.txt"); TFile *f[nFileAllPF]; for(int ibin=0; ibin<nbin; ibin++){ r[ibin].ResizeTo(nstepr); for(int ir=0; ir<nstepr; ir++){ if(isSimple==0) r[ibin][ir]=j01/(Vmax[ibin]-eps[ibin]*ir); else r[ibin][ir]=0.00025*20*(ir+1); } } TVectorD Nevent; Nevent.ResizeTo(nbin); Nevent.Zero(); TVectorD totmultall; totmultall.ResizeTo(nbin); totmultall.Zero(); TVectorD avgmultall; avgmultall.ResizeTo(nbin); avgmultall.Zero(); TVectorD tottrk; tottrk.ResizeTo(nbin); tottrk.Zero(); TVectorD avgtrk; avgtrk.ResizeTo(nbin); avgtrk.Zero(); for(int itheta=0;itheta<ntheta;itheta++) theta[itheta]=itheta*TMath::Pi()/ntheta/nn; for(int ibin=0;ibin<nbin;ibin++){ for(int iptbin=0;iptbin<nptV;iptbin++){ r0[ibin][iptbin].ResizeTo(ntheta); r01[ibin][iptbin].ResizeTo(ntheta); sigma2[ibin][iptbin].ResizeTo(ntheta); V[ibin][iptbin].ResizeTo(ntheta); deltaV[ibin][iptbin].ResizeTo(ntheta); chi[ibin][iptbin].ResizeTo(ntheta); for(int itheta=0;itheta<ntheta;itheta++){ Gmod2[ibin][iptbin][itheta].ResizeTo(nstepr); GRe[ibin][iptbin][itheta].ResizeTo(nstepr); GRe[ibin][iptbin][itheta].Zero(); GIm[ibin][iptbin][itheta].ResizeTo(nstepr); GIm[ibin][iptbin][itheta].Zero(); } } avgmult[ibin].ResizeTo(nptV); deltaVmean[ibin].ResizeTo(nptV); Vmean[ibin].ResizeTo(nptV); totpt[ibin].ResizeTo(nptV); totpt[ibin].Zero(); totmult[ibin].ResizeTo(nptV); totmult[ibin].Zero(); avgpt[ibin].ResizeTo(nptV); Qx1[ibin].ResizeTo(nptV); Qx1[ibin].Zero(); Qy1[ibin].ResizeTo(nptV); Qy1[ibin].Zero(); Q2[ibin].ResizeTo(nptV); Q2[ibin].Zero(); sigma2_[ibin].ResizeTo(nptV);sigma2_[ibin].Zero(); chi_[ibin].ResizeTo(nptV);chi_[ibin].Zero(); } for(int ifile=0; ifile<nFileAllPF; ifile++){ if(SumorProd=="Sum") f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/pbsjoboutput/useweight/PFcandpt01to10tracknormcpt03to6/%s/AnaV_Sum_%d.root",dir.c_str(),ifile)); else f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/pbsjoboutput/useweight/PFcandpt01to10tracknormcpt03to6/%s/AnaV_Prod_%d.root",dir.c_str(),ifile)); TVectorD* Nevent_t = (TVectorD*)f[ifile]->Get(Form("Nevent")); TVectorD* totmultall_t = (TVectorD*)f[ifile]->Get(Form("totmultall")); TVectorD* tottrk_t = (TVectorD*)f[ifile]->Get(Form("tottrk")); for(int ibin=0;ibin<nbin;ibin++){ for(int iptbin=0;iptbin<nptV;iptbin++){ for(int itheta=0;itheta<ntheta;itheta++){ GRe_t[ibin][iptbin][itheta] = (TVectorD*)f[ifile]->Get(Form("GRe_%d_%d_%d",ibin,iptbin,itheta)); GIm_t[ibin][iptbin][itheta] = (TVectorD*)f[ifile]->Get(Form("GIm_%d_%d_%d",ibin,iptbin,itheta)); for(ir=0; ir<nstepr; ir++){ GRe[ibin][iptbin][itheta][ir] += (*GRe_t[ibin][iptbin][itheta])[ir]; GIm[ibin][iptbin][itheta][ir] += (*GIm_t[ibin][iptbin][itheta])[ir]; } } } TVectorD* Qx1_t = (TVectorD*)f[ifile]->Get(Form("Qx1_%d",ibin)); TVectorD* Qy1_t = (TVectorD*)f[ifile]->Get(Form("Qy1_%d",ibin)); TVectorD* Q2_t = (TVectorD*)f[ifile]->Get(Form("Q2_%d",ibin)); TVectorD* totmult_t = (TVectorD*)f[ifile]->Get(Form("totmult_%d",ibin)); TVectorD* totpt_t = (TVectorD*)f[ifile]->Get(Form("totpt_%d",ibin)); for(int iptbin=0;iptbin<nptV;iptbin++){ Qx1[ibin][iptbin] += (*Qx1_t)[iptbin]; Qy1[ibin][iptbin] += (*Qy1_t)[iptbin]; Q2[ibin][iptbin] += (*Q2_t)[iptbin]; totmult[ibin][iptbin] += (*totmult_t)[iptbin]; totpt[ibin][iptbin] += (*totpt_t)[iptbin]; } Nevent[ibin] += (*Nevent_t)[ibin]; totmultall[ibin] += (*totmultall_t)[ibin]; tottrk[ibin] += (*tottrk_t)[ibin]; } f[ifile]->Close(); } fstrV<<setprecision(4)<<fixed; fstrV<<"ibin"<<"\t"<<"iptbin"<<"\t"<<"itheta"<<"\t"<<"r0"<<"\t"<<"V"<<"\t"<<"sigma2"<<"\t"<<"chi"<<"\t"<<"Vn Errors"<<endl; for(int ibin=0;ibin<nbin;ibin++){ avgmultall[ibin]=totmultall[ibin]/Nevent[ibin]; avgtrk[ibin]=tottrk[ibin]/Nevent[ibin]; for(int iptbin=0;iptbin<nptV;iptbin++){ for(int itheta=0;itheta<ntheta;itheta++){ for(ir=0; ir<nstepr; ir++){ G[ibin][iptbin][itheta][ir]=TComplex(GRe[ibin][iptbin][itheta][ir],GIm[ibin][iptbin][itheta][ir]); G[ibin][iptbin][itheta][ir]/=Nevent[ibin]; Gmod2[ibin][iptbin][itheta][ir]=TMath::Power(TComplex::Abs(G[ibin][iptbin][itheta][ir]),2); } for(ir=0; ir<nstepr-1; ir++) if(ir!=0 && Gmod2[ibin][iptbin][itheta][ir]<=Gmod2[ibin][iptbin][itheta][ir-1] && Gmod2[ibin][iptbin][itheta][ir]<=Gmod2[ibin][iptbin][itheta][ir+1]) break; if(ir!=0 && ir<nstepr-1) r01[ibin][iptbin][itheta]=r[ibin][ir]; else if(ir==0) {cout<<"ibin="<<ibin<<"\t"<<"iptbin="<<iptbin<<"\t"<<"itheta="<<itheta<<"\tminimum lies on ir = 0, please select proper range!"<<endl; continue;} else {cout<<"ibin="<<ibin<<"\t"<<"iptbin="<<iptbin<<"\t"<<"itheta="<<itheta<<"\tminimum lies on ir = maximum "<<nstepr-1<<", please select proper range!"<<endl; continue;} avgmult[ibin][iptbin]=1.0*totmult[ibin][iptbin]/Nevent[ibin]; avgpt[ibin][iptbin]=1.0*totpt[ibin][iptbin]/totmult[ibin][iptbin]; if(isSimple==0) V[ibin][iptbin][itheta]=Vmax[ibin]-ir*eps[ibin]+eps[ibin]*(Gmod2[ibin][iptbin][itheta][ir+1]-Gmod2[ibin][iptbin][itheta][ir-1])/2./(Gmod2[ibin][iptbin][itheta][ir-1]-2*Gmod2[ibin][iptbin][itheta][ir]+Gmod2[ibin][iptbin][itheta][ir+1]); else V[ibin][iptbin][itheta]=j01/r0[ibin][iptbin][itheta]; //simple method r0[ibin][iptbin][itheta]=j01/V[ibin][iptbin][itheta]; V[ibin][iptbin][itheta]/=avgmult[ibin][iptbin]; sigma2[ibin][iptbin][itheta]=Q2[ibin][iptbin]/Nevent[ibin]-(Qx1[ibin][iptbin]/Nevent[ibin])*(Qx1[ibin][iptbin]/Nevent[ibin])-(Qy1[ibin][iptbin]/Nevent[ibin])*(Qy1[ibin][iptbin]/Nevent[ibin]); sigma2_[ibin][iptbin]+=sigma2[ibin][iptbin][itheta]; Vmean[ibin][iptbin]+=V[ibin][iptbin][itheta]; chi[ibin][iptbin][itheta]=V[ibin][iptbin][itheta]*avgmult[ibin][iptbin]/TMath::Sqrt(sigma2[ibin][iptbin][itheta]); } //deltaVmean[ibin][iptbin]+=TMath::Exp(j01*j01/2./chi[ibin][iptbin][itheta]/chi[ibin][iptbin][itheta]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Sin(nn*theta[itheta]/2.))+TMath::Exp(-j01*j01/2./chi[ibin][iptbin][itheta]/chi[ibin][iptbin][itheta]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Cos(nn*theta[itheta]/2.)); sigma2_[ibin][iptbin]/=ntheta; Vmean[ibin][iptbin]/=ntheta; sigma2_[ibin][iptbin]-=TMath::Power(Vmean[ibin][iptbin]*avgmult[ibin][iptbin],2); chi_[ibin][iptbin]=Vmean[ibin][iptbin]*avgmult[ibin][iptbin]/TMath::Sqrt(sigma2_[ibin][iptbin]); for(int itheta=0;itheta<ntheta;itheta++){ deltaV[ibin][iptbin][itheta]=V[ibin][iptbin][itheta]/j01/TMath::BesselJ1(j01)*TMath::Sqrt((TMath::Exp(j01*j01/2./chi_[ibin][iptbin]/chi_[ibin][iptbin])+TMath::Exp(-j01*j01/2./chi_[ibin][iptbin]/chi_[ibin][iptbin])*TMath::BesselJ0(2*j01))/2./Nevent[ibin]); deltaVmean[ibin][iptbin]+=TMath::Exp(j01*j01/2./chi_[ibin][iptbin]/chi_[ibin][iptbin]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Sin(nn*theta[itheta]/2.))+TMath::Exp(-j01*j01/2./chi_[ibin][iptbin]/chi_[ibin][iptbin]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Cos(nn*theta[itheta]/2.)); fstrV<<ibin<<"\t"<<iptbin<<"\t"<<itheta<<"\t"<<r0[ibin][iptbin][itheta]<<"\t"<<V[ibin][iptbin][itheta]<<"\t"<<sigma2[ibin][iptbin][itheta]<<"\t"<<chi[ibin][iptbin][itheta]<<"\t"<<deltaV[ibin][iptbin][itheta]<<endl; } fstrV<<endl; deltaVmean[ibin][iptbin]=Vmean[ibin][iptbin]/j01/TMath::BesselJ1(j01)*TMath::Sqrt(deltaVmean[ibin][iptbin]/ntheta/2./Nevent[ibin]); } fstrV<<endl; } fstrV<<"ibin"<<"\t"<<"iptbin"<<"\t"<<"avgmult"<<"\t"<<"avgpt"<<"\t"<<"Vn mean"<<"\t"<<"Vn mean Error"<<endl; for(int ibin=0;ibin<nbin;ibin++){ for(int iptbin=0;iptbin<nptV;iptbin++){ fstrV<<ibin<<"\t"<<iptbin<<"\t"<<avgmult[ibin][iptbin]<<"\t"<<avgpt[ibin][iptbin]<<"\t"<<Vmean[ibin][iptbin]<<"\t"<<deltaVmean[ibin][iptbin]<<endl; } fstrV<<endl; } fstrV<<"ibin"<<"\t"<<"Nevent"<<"\t"<<"totmultall"<<"\t"<<"avgmultall"<<"\t"<<"avgtrk"<<endl; for(int ibin=0;ibin<nbin;ibin++){ fstrV<<ibin<<"\t"<<Nevent[ibin]<<"\t"<<totmultall[ibin]<<"\t"<<avgmultall[ibin]<<"\t"<<avgtrk[ibin]<<endl; fstrV<<endl; } if(SumorProd=="Sum") TString outname = "mergedV_Sum.root"; else TString outname="mergedV_Prod.root"; TFile *outf = new TFile(outname,"Recreate"); Nevent.Write("Nevent"); totmultall.Write("totmultall"); avgmultall.Write("avgmultall"); tottrk.Write("tottrk"); avgtrk.Write("avgtrk"); for(int ibin=0;ibin<nbin;ibin++){ TDirectory *dir0 = outf->mkdir(Form("D_%d",ibin,itheta));dir0->cd(); r[ibin].Write("r"); Qx1[ibin].Write("Qx1"); Qy1[ibin].Write("Qy1"); Q2[ibin].Write("Q2"); totmult[ibin].Write("totmult"); totpt[ibin].Write("totpt"); avgmult[ibin].Write("avgmult"); avgpt[ibin].Write("avgpt"); Vmean[ibin].Write("Vmean"); deltaVmean[ibin].Write("deltaVmean"); chi_[ibin].Write("chi"); for(int iptbin=0;iptbin<nptV;iptbin++){ TDirectory *dir1 = dir0->mkdir(Form("D_%d",iptbin));dir1->cd(); sigma2[ibin][iptbin].Write("sigma2"); chi[ibin][iptbin].Write("chi0"); deltaV[ibin][iptbin].Write("deltaV"); r0[ibin][iptbin].Write("r0"); r01[ibin][iptbin].Write("r01"); V[ibin][iptbin].Write("V"); for(int itheta=0;itheta<ntheta;itheta++){ TDirectory *dir2 = dir1->mkdir(Form("D_%d",itheta));dir2->cd(); GRe[ibin][iptbin][itheta].Write(Form("GRe")); GIm[ibin][iptbin][itheta].Write(Form("GIm")); Gmod2[ibin][iptbin][itheta].Write(Form("G2")); } } } outf->Close(); }
//------------------------Deal with the number and get the output stored in txt files and root files void getResVsub(){ double Vmax[nbin], eps[nbin]; for(int ibin=0; ibin<nbin ;ibin++){ Vmax[ibin]=0.065*(trkbin[ibin]+30); eps[ibin]=0.00025*(trkbin[ibin]+30); } ofstream fstrV; double theta[ntheta]; TVectorD avgmult, avgpt, totptall; TVectorD Qx1, Qy1, Q2; TVectorD Gmod2[nbin][ntheta]; TVectorD sigma2[nbin],deltaV[nbin]; TVectorD sigma2_,chi_; TVectorD deltaVmean, Vmean; TVectorD deltaVmeanmean, Vmeanmean, sigmaVmeanmean; TVectorD r[nbin]; TVectorD r0[nbin], r01[nbin], V[nbin], chi[nbin]; TVectorD GRe[nbin][ntheta]; TVectorD* GRe_t[nbin][ntheta]; TVectorD GIm[nbin][ntheta]; TVectorD* GIm_t[nbin][ntheta]; TComplex G[nbin][ntheta][nstepr]; if(isSum) fstrV.open("V_Sum_sub.txt"); else fstrV.open("V_Prod_sub.txt"); if(isSum) TString outname = "mergedV_Sum_sub.root"; else TString outname="mergedV_Prod_sub.root"; TFile *outf = new TFile(outname,"Recreate"); int subsample = (int)(nFileAll/nsamples); TFile *f[nFileAll]; for(int ibin=0; ibin<nbin; ibin++){ r[ibin].ResizeTo(nstepr); for(int ir=0; ir<nstepr; ir++){ if(isSimple==0) r[ibin][ir]=j01/(Vmax[ibin]-eps[ibin]*ir); else r[ibin][ir]=0.00025*20*(ir+1); } } Vmeanmean.ResizeTo(nbin); Vmeanmean.Zero(); deltaVmeanmean.ResizeTo(nbin); deltaVmeanmean.Zero(); sigmaVmeanmean.ResizeTo(nbin); sigmaVmeanmean.Zero(); for(int isample=0;isample<nsamples;isample++){ cout<<"start with "<<isample<<"\t"; int start=isample*subsample; int end=(isample+1)*subsample; TVectorD Nevent; Nevent.ResizeTo(nbin); Nevent.Zero(); TVectorD totmultall; totmultall.ResizeTo(nbin); totmultall.Zero(); for(int itheta=0;itheta<ntheta;itheta++) theta[itheta]=itheta*TMath::Pi()/ntheta/nn; for(int ibin=0;ibin<nbin;ibin++){ r0[ibin].ResizeTo(ntheta); r01[ibin].ResizeTo(ntheta); sigma2[ibin].ResizeTo(ntheta); V[ibin].ResizeTo(ntheta); deltaV[ibin].ResizeTo(ntheta); chi[ibin].ResizeTo(ntheta); for(int itheta=0;itheta<ntheta;itheta++){ Gmod2[ibin][itheta].ResizeTo(nstepr); GRe[ibin][itheta].ResizeTo(nstepr); GRe[ibin][itheta].Zero(); GIm[ibin][itheta].ResizeTo(nstepr); GIm[ibin][itheta].Zero(); } } avgmult.ResizeTo(nbin); deltaVmean.ResizeTo(nbin); Vmean.ResizeTo(nbin); deltaVmean.Zero(); Vmean.Zero(); deltaVmean.Zero(); totptall.ResizeTo(nbin); totptall.Zero(); avgpt.ResizeTo(nbin); Qx1.ResizeTo(nbin); Qx1.Zero(); Qy1.ResizeTo(nbin); Qy1.Zero(); Q2.ResizeTo(nbin); Q2.Zero(); sigma2_.ResizeTo(nbin);sigma2_.Zero(); chi_.ResizeTo(nbin);chi_.Zero(); for(int ifile=start; ifile<end; ifile++){ if(isSum) f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/pbsjoboutput/ToyMCHole/pPbDataV205m185/AnaV_Sum_%d.root",ifile)); else f[ifile] = TFile::Open(Form("/scratch/xuq7/flow/pbsjoboutput/ToyMCHole/pPbDataV205m185/AnaV_Prod_%d.root",ifile)); TVectorD* Nevent_t = (TVectorD*)f[ifile]->Get(Form("Nevent")); TVectorD* totmultall_t = (TVectorD*)f[ifile]->Get(Form("totmultall")); TVectorD* Qx1_t = (TVectorD*)f[ifile]->Get(Form("Qx1")); TVectorD* Qy1_t = (TVectorD*)f[ifile]->Get(Form("Qy1")); TVectorD* Q2_t = (TVectorD*)f[ifile]->Get(Form("Q2")); TVectorD* totptall_t = (TVectorD*)f[ifile]->Get(Form("totptall")); for(int ibin=0;ibin<nbin;ibin++){ for(int itheta=0;itheta<ntheta;itheta++){ GRe_t[ibin][itheta] = (TVectorD*)f[ifile]->Get(Form("GRe_%d_%d",ibin,itheta)); GIm_t[ibin][itheta] = (TVectorD*)f[ifile]->Get(Form("GIm_%d_%d",ibin,itheta)); for(ir=0; ir<nstepr; ir++){ GRe[ibin][itheta][ir] += (*GRe_t[ibin][itheta])[ir]; GIm[ibin][itheta][ir] += (*GIm_t[ibin][itheta])[ir]; } } Qx1[ibin] += (*Qx1_t)[ibin]; Qy1[ibin] += (*Qy1_t)[ibin]; Q2[ibin] += (*Q2_t)[ibin]; totptall[ibin] += (*totptall_t)[ibin]; Nevent[ibin] += (*Nevent_t)[ibin]; totmultall[ibin] += (*totmultall_t)[ibin]; } f[ifile]->Close(); } fstrV<<setprecision(4)<<fixed; fstrV<<"ibin"<<"\t"<<"itheta"<<"\t"<<"r0"<<"\t"<<"V"<<"\t"<<"sigma2"<<"\t"<<"chi"<<"\t"<<"Vn Errors"<<endl; for(int ibin=0;ibin<nbin;ibin++){ for(int itheta=0;itheta<ntheta;itheta++){ for(ir=0; ir<nstepr; ir++){ G[ibin][itheta][ir]=TComplex(GRe[ibin][itheta][ir],GIm[ibin][itheta][ir]); G[ibin][itheta][ir]/=Nevent[ibin]; Gmod2[ibin][itheta][ir]=TMath::Power(TComplex::Abs(G[ibin][itheta][ir]),2); } for(ir=0; ir<nstepr-1; ir++) if(ir!=0 && Gmod2[ibin][itheta][ir]<=Gmod2[ibin][itheta][ir-1] && Gmod2[ibin][itheta][ir]<=Gmod2[ibin][itheta][ir+1]) break; if(ir!=0 && ir<nstepr-1) r01[ibin][itheta]=r[ibin][ir]; else if(ir==0) {cout<<"ibin="<<ibin<<"\t"<<"itheta="<<itheta<<"\tminimum lies on ir = 0, please select proper range!"<<endl; continue;} else {cout<<"ibin="<<ibin<<"\t"<<"itheta="<<itheta<<"\tminimum lies on ir = maximum "<<nstepr-1<<", please select proper range!"<<endl; continue;} avgmult[ibin]=1.0*totmultall[ibin]/Nevent[ibin]; avgpt[ibin]=1.0*totptall[ibin]/totmultall[ibin]; if(isSimple==0) V[ibin][itheta]=Vmax[ibin]-ir*eps[ibin]+eps[ibin]*(Gmod2[ibin][itheta][ir+1]-Gmod2[ibin][itheta][ir-1])/2./(Gmod2[ibin][itheta][ir-1]-2*Gmod2[ibin][itheta][ir]+Gmod2[ibin][itheta][ir+1]); else V[ibin][itheta]=j01/r0[ibin][itheta]; //simple method r0[ibin][itheta]=j01/V[ibin][itheta]; V[ibin][itheta]/=avgmult[ibin]; //sigma2[ibin][itheta]=Q2[ibin]/Nevent[ibin]-(Qx1[ibin]/Nevent[ibin])*(Qx1[ibin]/Nevent[ibin])-(Qy1[ibin]/Nevent[ibin])*(Qy1[ibin]/Nevent[ibin])-(V[ibin][itheta]*avgmult[ibin])*(V[ibin][itheta]*avgmult[ibin]); sigma2[ibin][itheta]=Q2[ibin]/Nevent[ibin]-(Qx1[ibin]/Nevent[ibin])*(Qx1[ibin]/Nevent[ibin])-(Qy1[ibin]/Nevent[ibin])*(Qy1[ibin]/Nevent[ibin]); sigma2_[ibin]+=sigma2[ibin][itheta]; Vmean[ibin]+=V[ibin][itheta]; chi[ibin][itheta]=V[ibin][itheta]*avgmult[ibin]/TMath::Sqrt(sigma2[ibin][itheta]); //deltaV[ibin][itheta]=V[ibin][itheta]/j01/TMath::BesselJ1(j01)*TMath::Sqrt((TMath::Exp(j01*j01/2./chi[ibin][itheta]/chi[ibin][itheta])+TMath::Exp(-j01*j01/2./chi[ibin][itheta]/chi[ibin][itheta])*TMath::BesselJ0(2*j01))/2./Nevent[ibin]); } sigma2_[ibin]/=ntheta; Vmean[ibin]/=ntheta; sigma2_[ibin]-=TMath::Power(Vmean[ibin]*avgmult[ibin],2); chi_[ibin]=Vmean[ibin]*avgmult[ibin]/TMath::Sqrt(sigma2_[ibin]); //deltaVmean[ibin]+=TMath::Exp(j01*j01/2./chi[ibin][itheta]/chi[ibin][itheta]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Sin(nn*theta[itheta]/2.))+TMath::Exp(-j01*j01/2./chi[ibin][itheta]/chi[ibin][itheta]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Cos(nn*theta[itheta]/2.)); for(int itheta=0;itheta<ntheta;itheta++){ deltaV[ibin][itheta]=V[ibin][itheta]/j01/TMath::BesselJ1(j01)*TMath::Sqrt((TMath::Exp(j01*j01/2./chi_[ibin]/chi_[ibin])+TMath::Exp(-j01*j01/2./chi_[ibin]/chi_[ibin])*TMath::BesselJ0(2*j01))/2./Nevent[ibin]); deltaVmean[ibin]+=TMath::Exp(j01*j01/2./chi_[ibin]/chi_[ibin]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Sin(nn*theta[itheta]/2.))+TMath::Exp(-j01*j01/2./chi_[ibin]/chi_[ibin]*TMath::Cos(nn*theta[itheta]))*TMath::BesselJ0(2*j01*TMath::Cos(nn*theta[itheta]/2.)); fstrV<<ibin<<"\t"<<itheta<<"\t"<<r0[ibin][itheta]<<"\t"<<V[ibin][itheta]<<"\t"<<sigma2[ibin][itheta]<<"\t"<<chi[ibin][itheta]<<"\t"<<deltaV[ibin][itheta]<<endl; } fstrV<<endl; deltaVmean[ibin]=Vmean[ibin]/j01/TMath::BesselJ1(j01)*TMath::Sqrt(deltaVmean[ibin]/ntheta/2./Nevent[ibin]); } fstrV<<endl; fstrV<<"ibin"<<"\t"<<"avgmult"<<"\t"<<"avgpt"<<"\t"<<"Vn mean"<<"\t"<<"Vn mean Error"<<endl; for(int ibin=0;ibin<nbin;ibin++){ fstrV<<ibin<<"\t"<<avgmult[ibin]<<"\t"<<avgpt[ibin]<<"\t"<<Vmean[ibin]<<"\t"<<deltaVmean[ibin]<<endl; } fstrV<<endl; TDirectory *dirsample = outf->mkdir(Form("s_%d",isample)); dirsample->cd(); Nevent.Write("Nevent"); totmultall.Write("totmultall"); Qx1.Write("Qx1"); Qy1.Write("Qy1"); Q2.Write("Q2"); totptall.Write("totptall"); avgmult.Write("avgmult"); avgpt.Write("avgpt"); Vmean.Write("Vmean"); deltaVmean.Write("deltaVmean"); chi_.Write("chi"); for(int ibin=0;ibin<nbin;ibin++){ TDirectory *dir0 = dirsample->mkdir(Form("D_%d",ibin));dir0->cd(); r[ibin].Write("r"); Vmeanmean[ibin]+=Vmean[ibin]/nsamples; deltaVmeanmean[ibin]+=deltaVmean[ibin]/nsamples; sigmaVmeanmean[ibin]+=TMath::Power(Vmean[ibin]/nsamples,2); sigma2[ibin].Write("sigma2"); chi[ibin].Write("chi0"); deltaV[ibin].Write("deltaV"); r0[ibin].Write("r0"); r01[ibin].Write("r01"); V[ibin].Write("V"); for(int itheta=0;itheta<ntheta;itheta++){ TDirectory *dir1 = dir0->mkdir(Form("D_%d",itheta));dir1->cd(); GRe[ibin][itheta].Write(Form("GRe")); GIm[ibin][itheta].Write(Form("GIm")); Gmod2[ibin][itheta].Write(Form("G2")); } } } fstrV<<"ibin"<<"\t"<<"Vn mean mean"<<"\t"<<"Vn mean mean Error"<<"\t"<<"Vn mean deviation"<<endl; for(int ibin=0;ibin<nbin;ibin++){ sigmaVmeanmean[ibin]=TMath::Sqrt(sigmaVmeanmean[ibin]*nsamples-Vmeanmean[ibin]*Vmeanmean[ibin]); fstrV<<endl<<ibin<<"\t"<<Vmeanmean[ibin]<<"\t"<<deltaVmeanmean[ibin]<<"\t"<<sigmaVmeanmean[ibin]<<endl; } outf->cd(); Vmeanmean.Write("Vmeanmean"); deltaVmeanmean.Write("deltaVmeanmean"); sigmaVmeanmean.Write("sigmaVmeanmean"); cout<<endl; outf->Close(); }