void unfoldPt(int mode=0) { // Matched Tracklets TFile *inf = new TFile("match-10TeV-12.root"); TNtuple *nt = (TNtuple*)inf->FindObjectAny("nt"); // Test sample TFile *infTest = new TFile("./TrackletTree-Run123596.root"); TNtuple *ntTest = (TNtuple*)infTest->FindObjectAny("TrackletTree12"); TFile *pdfFile; if (mode==0) pdfFile = new TFile("pdf.root","recreate"); else pdfFile = new TFile("pdf.root"); double nPtBin=15; double minPt=log(0.05); double maxPt=log(10); double nDphiBin=600; double maxDphi=0.4; char* mycut = Form("abs(eta)<2&&log(pt)>%f&&log(pt)<%f",minPt,maxPt); char* mycut1=Form("abs(eta)<2&&log(pt)>%f&&log(pt)<%f&&abs(eta-eta1)<0.01&&abs(deta)<0.01",minPt,maxPt); TH2F *h; TH1F *hdphi = new TH1F("hdphi","",nDphiBin,0,maxDphi); TH1F *hdphi2; TH1F *hpt; TH1F *hptH = new TH1F("hptH","",nPtBin,minPt,maxPt); TH1F *hptUnfold = new TH1F("hptUnfold","",nPtBin,minPt,maxPt); TH1F *hptMC = new TH1F("hptMC","",nPtBin,minPt,maxPt); TH1F *hptTemp = new TH1F("hptTemp","",nPtBin,minPt,maxPt); // Delta phi as a function of matched genparticle transverse momentum TCanvas *c = new TCanvas("c","",600,600); if (mode == 0) { h = new TH2F("h","",nPtBin,minPt,maxPt,nDphiBin,0,maxDphi); hdphi2 = new TH1F("hdphiMC","",nDphiBin,0,maxDphi); hpt = new TH1F("hpt","",nPtBin,minPt,maxPt); h->SetXTitle("ln(P_{T}) GeV/c"); h->SetYTitle("|#Delta#phi|"); nt->Draw("abs(dphi):log(pt)>>h",mycut1,"col"); // used to generate pdf nt->Draw("abs(dphi)>>hdphiMC",mycut,""); nt->Draw("log(pt)>>hpt",mycut,""); h->Write(); hpt->Write(); hdphi2->Write(); } else { h = (TH2F*) pdfFile->FindObjectAny("h"); hdphi2 = (TH1F*) pdfFile->FindObjectAny("hdphiMC"); hpt = (TH1F*) pdfFile->FindObjectAny("hpt"); } // Delta phi fit TCanvas *c2 = new TCanvas("c2","",600,600); c2->SetLogy(); c2->SetLogx(); // dphi for unfolding and MC truth: ntTest->Draw("abs(dphi)>>hdphi","abs(eta1)<2&&abs(deta)<0.1","",200000); ntTest->Draw("log(pt)>>hptH",mycut,"",200000); histFunction2D *myfun = new histFunction2D(h); TF1 *test = new TF1("histFun",myfun,&histFunction2D::evaluate,0,maxDphi,nPtBin+1); TF1 *test2 = new TF1("histFunMC",myfun,&histFunction2D::evaluate,0,maxDphi,nPtBin+1); for (int i=0;i<nPtBin+1;i++) { test->SetParameter(i,1); } hdphi2->SetXTitle("|#Delta#phi|"); hdphi2->SetYTitle("Arbitrary Normalization"); hdphi2->Fit("histFunMC","M"); hdphi->SetXTitle("|#Delta#phi|"); hdphi->SetYTitle("Arbitrary Normalization"); hdphi->Fit("histFun","M"); hdphi->SetStats(0); hdphi->Draw(); for (int i=0;i<nPtBin+1;i++) { TF1 *testPlot = new TF1(Form("histFun%d",i),myfun,&histFunction2D::evaluate,0,maxDphi,nPtBin+1); testPlot->SetParameter(i,test->GetParameter(i)); testPlot->SetLineColor(i+2); testPlot->Draw("same"); } int total=0,totalMC=0; for (int i=0;i<nPtBin;i++){ if (test->GetParameter(i)==0) continue; hptUnfold->SetBinContent(i+1,fabs(test->GetParameter(i))); hptUnfold->SetBinError(i+1,test->GetParError(i)); hptMC->SetBinContent(i+1,fabs(test2->GetParameter(i))); hptMC->SetBinError(i+1,test2->GetParError(i)); total+=fabs(test->GetParameter(i)); totalMC+=fabs(test2->GetParameter(i)); } hptUnfold->SetEntries(total); hptMC->SetEntries(totalMC); TCanvas *c3 = new TCanvas("c3","",600,600); hpt->Sumw2(); hptH->Sumw2(); //hptMC->Sumw2(); double normMC=0; double norm=0; double normTruth=0; hptUnfold->SetMarkerColor(2); hptUnfold->SetMarkerStyle(4); // hptUnfold->Scale(1./hptUnfold->GetEntries()); TH1F *hptCorrected = (TH1F*)hptUnfold->Clone(); hptCorrected->SetName("hptCorrected"); hptMC->Divide(hpt); hptCorrected->Divide(hptMC); for (int i=0;i<nPtBin;i++){ if (hptMC->GetBinContent(i)<=0.001)hptCorrected->SetBinContent(i,0); } hptCorrected->Scale(1./(hptCorrected->GetSum())); hptCorrected->SetMarkerStyle(20); hpt->Scale(1./hpt->GetEntries()); if (hptH->GetEntries())hptH->Scale(1./hptH->GetEntries()); hptTemp->SetXTitle("ln(P_{T}) GeV/c"); hptTemp->SetYTitle("Arbitrary Normalization"); hptTemp->Draw(); hptH->SetXTitle("ln(P_{T}) GeV/c"); hptH->SetYTitle("Arbitrary Normalization"); hptH->Draw("hist"); hptH->SetLineColor(4); hpt->Draw("hist same "); hptCorrected->Draw("same"); TH1F *hptUnfoldRatio = (TH1F*)hptUnfold->Clone(); hptUnfoldRatio->SetName("hptUnfoldRatio"); hptUnfoldRatio->Scale(1./hptUnfoldRatio->GetSum()); //hptUnfoldRatio->Divide(hptH); TH1F *hptCorrectedRatio = (TH1F*)hptCorrected->Clone(); hptCorrectedRatio->SetName("hptCorrectedRatio"); hptCorrectedRatio->SetMarkerColor(2); //hptCorrectedRatio->Divide(hptH); TCanvas *c4 = new TCanvas("c4","",600,600); TLine *l = new TLine(-2.5,1,2.5,1); hptUnfoldRatio->Draw(); hptMC->Draw("same"); hptCorrectedRatio->Draw("same"); l->Draw("same"); }
void Plot::FitSignal(int mode, int fitMode) { const int nPar = 6; TRandom ran; if(mode==0) { gStyle->SetOptLogy(1); } else { gStyle->SetOptLogy(0); } gStyle->SetOptStat(0); gStyle->SetOptTitle(0); const float limitBinSize = 2.0; // **** bin size here TCanvas* c = NewCanvas(); c->Divide(1,2); gROOT->cd(); TH1F* cc = new TH1F("CCSignal","CC Signal",500,0.0,1000.0); TH1F* ccBg = new TH1F("CCBgFit","CC Bg Fit",500,0.0,1000.0); TH1F* ccBgErr = new TH1F("CCBgErr","CC Bg Err",500,0.0,1000.0); TH1F* ccBgP = new TH1F("CCBgPlus","CC Bg Plus",500,0.0,1000.0); TH1F* ccBgM = new TH1F("CCBgMinus","CC Bg Minus",500,0.0,1000.0); TH1F* cp = new TH1F("CPSignal","CP Signal",500,0.0,1000.0); TH1F* cpBg = new TH1F("CPBgFit","CP Bg Fit",500,0.0,1000.0); TH1F* cpBgErr = new TH1F("CPBgErr","CP Bg Err",500,0.0,1000.0); TH1F* cpBgP = new TH1F("CPBgPlus","CP Bg Plus",500,0.0,1000.0); TH1F* cpBgM = new TH1F("CPBgMinus","CP Bg Minus",500,0.0,1000.0); TMatrixD matrix(nPar,nPar); fd->cd(); TH1F* hInt,*hBgInt; char fitname[100]; for(int ind=0; ind<2; ind++) { if(debug) printf("starting ind %i\n",ind); c->cd(ind+1); gStyle->SetOptLogy(1); printf("Starting %i ######################################\n",ind); TH1F* h; //char cind[20]; //char handle[100]; //sprintf(handle,"side_1exp_%02i_%02i_%02i",ind,mode,fitMode); TF1* fits[4]; //TF1* dpx[4]; if(debug) printf("looking for h %i\n",int(fd)); if(ind==0) { h = (TH1F*)fd->FindObjectAny("pair_mass_2GeV1"); } else if(ind==1) { h = (TH1F*)fd->FindObjectAny("pair_mass_2GeV3"); } if(debug) printf("new h %i\n",int(h)); if(debug) printf("new fit\n"); sprintf(fitname,"hfit_%1i",ind); fits[ind] = new TF1(fitname,"([0]*pow((x-30.0),[1])+[3]*pow((x-30.0),0.2))*([2]*exp(-[2]*(x-30.0))+[4]*[5]*exp(-[5]*(x-30.0)))",30.0,500.0); //fits[ind] = new TF1(fitname,"([0]*((1-[3])*pow((x-30.0),[1])+[3]*pow((x-30.0),0.2)))*(exp(-[2]*(x-30.0))+[4]*exp(-[5]*(x-30.0)))",30.0,500.0); fits[ind]->SetParameter(0,0.0004); fits[ind]->SetParameter(1,2); fits[ind]->SetParameter(2,0.02); fits[ind]->SetParameter(3,0.005); //fits[ind]->SetParameter(3,0.5); fits[ind]->SetParameter(4,1.005); fits[ind]->SetParameter(5,0.05); float llim = 30.0; h->Fit(fits[ind],"LN","",llim,1000.0); double par[20],parMin[20],fval,fvalMin; for(int i=0; i<nPar; i++) parMin[i] = fits[ind]->GetParameter(i); gMinuit->Eval(nPar,0,fvalMin,parMin,0); //printf("got back %10.5f\n",fvalMin); // save the fit results in a histogram, for limit program for(int ibin=16; ibin<250; ibin++) { float xx = h->GetBinCenter(ibin); float yy = fits[ind]->Eval(xx); if(ind==0) { cc->SetBinContent(ibin,h->GetBinContent(ibin)); ccBg->SetBinContent(ibin,yy); ccBgErr->SetBinContent(ibin,0.0); ccBgP->SetBinContent(ibin,0.0); ccBgM->SetBinContent(ibin,99999.0); } else { cp->SetBinContent(ibin,h->GetBinContent(ibin)); cpBg->SetBinContent(ibin,yy); cpBgErr->SetBinContent(ibin,0.0); cpBgP->SetBinContent(ibin,0.0); cpBgM->SetBinContent(ibin,99999.0); } } //vary the parameters to find an error envelope double par2[20],fval2=1e10; int pslim = (ind==0?25000:150000); for(int ips=0; ips<pslim; ips++) { if(ips%10000==0) printf("Processing %d\n",ips); for(int i=0; i<nPar; i++) { par[i] = parMin[i]; } for(int i=0; i<nPar; i++) { //int i = (ips%2==0?0:3); par[i] = parMin[i]+(2.0*(ran.Uniform()-0.5))*fits[ind]->GetParError(i); } fval = 0.0; gMinuit->Eval(nPar,0,fval,par,0); if((fval-fvalMin)<1.0) { printf("Found nearby min %10.5f\n",fval-fvalMin); float eOld,eNew; for(int ibin=16; ibin<250; ibin++) { float xx = h->GetBinCenter(ibin); for(int i=0; i<nPar; i++) fits[ind]->SetParameter(i,par[i]); float yy = fits[ind]->Eval(xx); for(int i=0; i<nPar; i++) fits[ind]->SetParameter(i,parMin[i]); float yyMin = fits[ind]->Eval(xx); TH1F *hBgErr,*hBgP,*hBgM; if(ind==0) { hBgErr = ccBgErr; hBgP = ccBgP; hBgM = ccBgM; } else { hBgErr = cpBgErr; hBgP = cpBgP; hBgM = cpBgM; } eOld = hBgErr->GetBinContent(ibin); eNew = yy - yyMin; if(eOld>fabs(eNew)) hBgErr->SetBinContent(ibin,fabs(eNew)); eOld = hBgP->GetBinContent(ibin); if(yy>eOld) hBgP->SetBinContent(ibin,yy); eOld = hBgM->GetBinContent(ibin); if(yy<eOld) hBgM->SetBinContent(ibin,yy); } } // end if near maximum /* if(fval<fval2) { for(int i=0; i<nPar; i++) par2[i] = par[i]; fval2 = fval; } */ } /* printf("forcing new fit..\n"); for(int i=0; i<nPar; i++) { printf("old,new = %10.5f %10.5f\n",parMin[i],par2[i]); fits[ind]->SetParameter(i,par2[i]); } */ // restore original fit fval = 0.0; gMinuit->Eval(nPar,0,fval,parMin,0); for(int i=0; i<nPar; i++) fits[ind]->SetParameter(i,parMin[i]); //extract fit error matrix gMinuit->mnemat(matrix.GetMatrixArray(),nPar); matrix.Print(); for(int i=0; i<nPar; i++) { for(int j=0; j<nPar; j++) { printf("%10.5f",matrix(i,j)/sqrt(matrix(i,i)*matrix(j,j))); } printf("\n"); } //matrix.Draw("text"); float hm = h->GetMaximum(); if(mode==0) { //TAxis* ax = h->GetXaxis(); //ax->SetRangeUser(24.1,199.9); h->SetMaximum(1.2*hm); //h->SetMinimum(0.0); } else if(mode==1) { TAxis* ax = h->GetXaxis(); ax->SetRangeUser(20.0,500.0); h->SetMaximum(1.15*hm); h->SetMinimum(0.0); } h->Draw(); fits[ind]->SetLineColor(1); fits[ind]->SetLineWidth(2.0); fits[ind]->Draw("SAME"); // find chi2's and KS's //AnaChiKs(h,fits[ind]); TAxis* ax,*ay; ax = h->GetXaxis(); ay = h->GetYaxis(); ax->SetTitle("m(#gamma#gamma) (GeV/c^{2})"); ay->SetTitle("Entries/2 GeV/c^{2}"); ax->CenterTitle(); ay->CenterTitle(); ax->SetTitleOffset(0.9); ay->SetTitleOffset(1.0); ax->SetTitleSize(0.08); ay->SetTitleSize(0.07); ax->SetLabelSize(0.07); ay->SetLabelSize(0.07); gPad->SetLeftMargin(0.16); gPad->SetBottomMargin(0.16); TText* text; text = new TLatex(0.5,0.8,"Diphoton Data"); text->SetNDC(true); text->SetTextSize(0.06); text->Draw(); if(ind==0) text = new TLatex(0.5,0.72,"Central-Central"); else if(ind==1) text = new TLatex(0.5,0.72,"Central-Plug"); text->SetNDC(true); text->SetTextSize(0.06); text->Draw(); if(ind==0) { text = new TLatex(0.15,0.92,"W/Z H#rightarrow X(#gamma#gamma)"); text->SetNDC(true); text->SetTextSize(0.08); text->Draw(); text = new TLatex(0.5,0.92,"CDF Run II Preliminary, 2.0 fb^{-1}"); text->SetNDC(true); text->SetTextSize(0.06); text->Draw(); } /* if(debug) printf("start loop\n"); int ibin; for(ibin=16; ibin<=250; ibin++) { if(debug) printf("start bin %i\n",ibin); float xx = (ibin-0.5)*2.0; // *** bin width here if(debug) printf("-1 test ibin %i\n",ibin); float yy = fits[ind]->Eval(xx); //printf("%f yy= %f \n",xx,yy); // the derivative of this yield wrt parameters if(debug) printf("0 test ibin %i\n",ibin); double y0 = yy; if(debug) printf("1 test ibin %i\n",ibin); TMatrixD vv(nPar,1); float dirSize = 0.5; for(int i=0; i<nPar; i++){ int ipar = i; double par = fits[ind]->GetParameter(ipar); double spar = fits[ind]->GetParError(ipar); double parp = par + dirSize*spar; fits[ind]->SetParameter(ipar,parp); double yp = fits[ind]->Eval(xx); vv(i,0) = limitBinSize*(yp-y0)/(dirSize*spar); fits[ind]->SetParameter(ipar,par); //printf("%f %f %f\n",yp,y0,spar); } //vv.Print(); if(debug) printf("start matrix %i\n",ibin); TMatrixD tempM(matrix, TMatrixDBase::kMult, vv); //matrix.Print(); TMatrixD tempN(vv, TMatrixDBase::kTransposeMult, tempM); //tempN.Print(); float bgSig = 0.0; if(tempN(0,0)>0.0) bgSig = sqrt(tempN(0,0)); // ****** hack temp ********** bgSig = 0.3*y0; // file hists to be saved if(debug) printf("start fill %i\n",ibin); if(ind==0) { //printf("filling cc %i %f\n",ibin,h->GetBinContent(ibin)); cc->SetBinContent(ibin,h->GetBinContent(ibin)); //printf("getting cc %i %f\n",ibin,cc->GetBinContent(ibin)); ccBg->SetBinContent(ibin,yy); ccBgErr->SetBinContent(ibin,bgSig); ccBgP->SetBinContent(ibin,yy+bgSig); ccBgM->SetBinContent(ibin,TMath::Max(yy-bgSig,float(0.0))); //if(ibin==27) { //printf("bg %f %f \n",yy,bgSig); //} } else { cp->SetBinContent(ibin,h->GetBinContent(ibin)); cpBg->SetBinContent(ibin,yy); cpBgErr->SetBinContent(ibin,bgSig); cpBgP->SetBinContent(ibin,yy+bgSig); cpBgM->SetBinContent(ibin,TMath::Max(yy-bgSig,float(0.0))); } if(debug) printf("end fill %i\n",ibin); } */ } printf("cc plus BG=%f\n",ccBgP->GetSum()); printf("cc minus BG=%f\n",ccBgM->GetSum()); printf("cp plus BG=%f\n",cpBgP->GetSum()); printf("cp minus BG=%f\n",cpBgM->GetSum()); char fn[100]; if(mode==0) { sprintf(fn,"FitSignal_%d",fitMode); savePlot(c,fn); } else if(mode==1) { sprintf(fn,"FitSignalLin_%d",fitMode); savePlot(c,fn); } //if(mode!=0) return; // plot of fit results gStyle->SetOptLogy(0); c = NewCanvas(); c->Divide(1,2); c->cd(1); cc->Draw(); ccBg->Draw("SAME"); c->cd(2); ccBgErr->SetMinimum(0.0); ccBgErr->SetMaximum(4.0); ccBgErr->Draw(); ccBgP->SetLineStyle(2); ccBgP->Draw("SAME"); ccBgM->SetLineStyle(2); ccBgM->Draw("SAME"); savePlot(c,"FitSignalResultsCC"); c = NewCanvas(); c->Divide(1,2); c->cd(1); cp->Draw(); cpBg->Draw("SAME"); c->cd(2); cpBgErr->SetMinimum(0.0); cpBgErr->SetMaximum(4.0); cpBgErr->Draw(); cpBgP->SetLineStyle(2); cpBgP->Draw("SAME"); cpBgM->SetLineStyle(2); cpBgM->Draw("SAME"); savePlot(c,"FitSignalResultsCP"); char title[100]; if(name) { sprintf(title,"TPeaksHiggs_FitSignalHist_%s.root",name); TFile* ff = new TFile(title,"RECREATE"); gROOT->GetList()->Write(); ff->Close(); } }
//5_3_6: gROOT->ProcessLine(".include /afs/cern.ch/cms/slc5_amd64_gcc462/lcg/roofit/5.32.03-cms9/include/") //7_1_0: gROOT->ProcessLine(".include /afs/cern.ch/cms/slc6_amd64_gcc481/lcg/roofit/5.34.22-cms2/include/") //Usage: .x Total_fit.C+("root://eoscms//eos/cms/store/group/dpg_ecal/alca_ecalcalib/lpernie/ //ALL_Neutrino_Pt2to20_AVE40BX25_FoldEtaRing_eta01/iter_0/epsilonPlots.root", "Comp_2015A", "", true, true, false ) void Total_fit( TString File, TString folder, TString Hname, bool RunOnAll, bool isEB=true, bool Are_pi0_=true ){ //OLD STYLE gROOT->SetStyle("Plain"); gStyle->SetPalette(1); gStyle->SetOptStat(1111111); // Show overflow, underflow + SumOfWeights gStyle->SetOptFit(111110); gStyle->SetOptFile(1); gStyle->SetMarkerStyle(20); gStyle->SetMarkerSize(.3); gStyle->SetMarkerColor(1); TCanvas* myc1 = new TCanvas("myc1"," ",500,500); myc1->SetLeftMargin(0.16); //Files TString Comm = "mkdir -p " + folder; system( Comm.Data() ); cout<<"Opening: "<<File.Data()<<endl; TFile* fin = TFile::Open(File.Data()); //Histos int MaxH = 1; if( RunOnAll ) MaxH = isEB ? 61200 : 14648; cout<<"Running on "<<MaxH<<" events"<<endl; for(int i=0; i<MaxH; i++){ std::stringstream ind; ind << (int) i; TString EBEE = isEB ? "EB" : "EE"; TString BarEnd = isEB ? "Barrel" : "Endcap"; TString isPi0 = Are_pi0_ ? "pi0" : "eta"; TString name = BarEnd + "/epsilon_" + EBEE + "_iR_" + TString(ind.str()); if( ! RunOnAll ) name = Hname; TH1F *h = (TH1F*) fin->Get( name.Data() ); h->SetTitle(""); TString outName = folder + "/" + EBEE + "_iR_" + TString(ind.str()) + "_" + isPi0 + ".png"; TString outName1 = folder + "/" + EBEE + "_iR_" + TString(ind.str()) + "_" + isPi0 +".pdf"; TString outName2 = folder + "/" + EBEE + "_iR_" + TString(ind.str()) + "_" + isPi0 +".C"; TString outName3 = folder + "/" + EBEE + "_iR_" + TString(ind.str()) + "_" + isPi0 +".root"; //Fit Method int ngaus=1; //1: simple Gaussian, 2: two Gaussian float xlo = Are_pi0_? 0.08:0.4, xhi = Are_pi0_? 0.22:0.65; RooRealVar x("x","#gamma#gamma invariant mass",xlo, xhi, "GeV/c^{2}"); RooDataHist dh("dh","#gamma#gamma invariant mass",RooArgList(x),h); RooRealVar mean("mean","#pi^{0} peak position", Are_pi0_? 0.116:0.57, Are_pi0_? 0.105:0.5, Are_pi0_? 0.150:0.62,"GeV/c^{2}"); RooRealVar sigma("sigma","#pi^{0} core #sigma",0.013, 0.005,0.020,"GeV/c^{2}"); if(!isEB) { mean.setRange( Are_pi0_? 0.10:0.45, Are_pi0_? 0.140:0.62); // 0.200 mean.setVal(Are_pi0_? 0.120:0.55); sigma.setRange(0.005, 0.060); } if(isEB){ mean.setRange(Are_pi0_? 0.105:0.47, Are_pi0_? 0.155:0.62); sigma.setRange(0.003, 0.030); } RooRealVar Nsig("Nsig","#pi^{0} yield",1000.,0.,1.e7); Nsig.setVal( h->GetSum()*0.1); RooGaussian gaus("gaus","Core Gaussian",x, mean,sigma); RooRealVar sigmaTail("sigmaTail","#pi^{0} tail #sigma",0.040, 0.020,0.065,"GeV/c^{2}"); RooGaussian gaus2("gaus2","Tail Gaussian",x, mean,sigmaTail); RooRealVar fcore("fcore","f_{core}",0.9,0.,1.); RooAddPdf signal("signal","signal model",RooArgList(gaus,gaus2),fcore); RooRealVar p0("p0","p0", 1000.,-1.e5,1.e5); RooRealVar p1("p1","p1", -3000.,-1.e5,1.e5); RooRealVar p2("p2","p2", 10000.,-1.e5,1.e5); RooRealVar p3("p3","p3", -10000.,-1.e5,1.e5); RooRealVar p4("p4","p4",-4000.,-1.e5,1.e5); RooRealVar p5("p5","p5", 5.,-1.e5,1.e5); RooRealVar p6("p6","p6", 6.,-1.e5,1.e5); RooRealVar cb0("cb0","cb0", 0.2, -1.,1.); RooRealVar cb1("cb1","cb1",-0.1, -1.,1.); RooRealVar cb2("cb2","cb2", 0.1, -1.,1.); RooRealVar cb3("cb3","cb3",-0.1, -0.5,0.5); RooRealVar cb4("cb4","cb4", 0.1, -1.,1.); RooRealVar cb5("cb5","cb5", 0.1, -1.,1.); RooRealVar cb6("cb6","cb6", 0.3, -1.,1.); RooArgList cbpars(cb0,cb1,cb2); if(Are_pi0_) cbpars.add( cb3); // if(isEB){ // cb3.setRange(-1,1.); // cb4.setRange(-0.3,0.3); // cbpars.add( cb4 ); // } RooChebychev bkg("bkg","bkg model", x, cbpars ); RooRealVar Nbkg("Nbkg","background yield",1.e3,0.,1.e8); Nbkg.setVal( h->GetSum()*0.8 ); RooAbsPdf* model=0; RooAddPdf model1("model","sig+bkg",RooArgList(gaus,bkg),RooArgList(Nsig,Nbkg)); RooAddPdf model2("model","sig+bkg",RooArgList(signal,bkg),RooArgList(Nsig,Nbkg)); if(ngaus==1) model = &model1; else if(ngaus==2) model = &model2; RooNLLVar nll("nll","log likelihood var",*model,dh,RooFit::Extended(true));//RooFit::Extended(true) fundamental for right ormalization //RooAbsReal * nll = model->createNLL(dh); Suggested way RooMinuit m(nll); m.setVerbose(kFALSE); m.migrad(); //RooFitResult* res = m.save() ; x.setRange("sobRange",mean.getVal()-2.*sigma.getVal(), mean.getVal()+2.*sigma.getVal()); RooAbsReal* integralSig = gaus.createIntegral(x,NormSet(x),Range("sobRange")); RooAbsReal* integralBkg = bkg.createIntegral(x,NormSet(x),Range("sobRange")); RooChi2Var chi2("chi2","chi2 var",*model,dh, true); //int ndof = h->GetNbinsX() - res->floatParsFinal().getSize(); x.setRange("sobRange",mean.getVal()-2.*sigma.getVal(), mean.getVal()+2.*sigma.getVal()); RooPlot* xframe = x.frame(h->GetNbinsX()); xframe->SetTitle(h->GetTitle()); dh.plotOn(xframe); model->plotOn(xframe,Components(RooArgSet(bkg,gaus)),LineStyle(kDashed), LineColor(kRed)); model->plotOn(xframe); //xframe->GetYaxis()->SetTitle("# Events"); if(Are_pi0_) xframe->GetYaxis()->SetTitleOffset(2.05); else xframe->GetYaxis()->SetTitleOffset(1.3); xframe->Draw(); TLatex lat; char line[300]; lat.SetNDC(); lat.SetTextSize(0.040); lat.SetTextColor(1); sprintf(line,"CMS Preliminary"); lat.DrawLatex(0.2, 0.93, line); float xmin(0.5), yhi(0.80), ypass(0.05); if(!Are_pi0_) xmin=0.30; sprintf(line,"m_{#gamma#gamma} = %.2f #pm %.2f", mean.getVal()*1000., mean.getError()*1000. ); lat.DrawLatex(xmin,yhi, line); sprintf(line,"#sigma = %.2f #pm %.2f", sigma.getVal()*1000., sigma.getError()*1000. ); lat.DrawLatex(xmin,yhi-ypass, line); //sprintf(line,"N = %.0f #pm %.0f", Nsig.getVal(), Nsig.getError() ); //lat.DrawLatex(xmin,yhi-2*ypass, line); //sprintf(line,"Yield: %.0f #pm %.0f", Nsig.getVal(), Nsig.getError() ); //lat.DrawLatex(xmin,yhi, line); //sprintf(line,"m_{#gamma#gamma}: %.2f #pm %.2f", mean.getVal()*1000., mean.getError()*1000. ); //lat.DrawLatex(xmin,yhi-ypass, line); //sprintf(line,"#sigma: %.2f #pm %.2f (%.2f%s)", sigma.getVal()*1000., sigma.getError()*1000., sigma.getVal()*100./mean.getVal(), "%" ); //lat.DrawLatex(xmin,yhi-2.*ypass, line); sprintf(line,"S/B (2#sigma): %.2f", (integralSig->getVal()*Nsig.getVal())/(integralBkg->getVal()*Nbkg.getVal()) ); lat.DrawLatex(xmin,yhi-2.*ypass, line); sprintf(line,"S (2#sigma): %.2f", (integralSig->getVal()*Nsig.getVal()) ); lat.DrawLatex(xmin,yhi-3.*ypass, line); sprintf(line,"B (2#sigma): %.2f", (integralBkg->getVal()*Nbkg.getVal()) ); lat.DrawLatex(xmin,yhi-4.*ypass, line); myc1->SaveAs(outName.Data()); myc1->SaveAs(outName1.Data()); myc1->SaveAs(outName2.Data()); myc1->SaveAs(outName3.Data()); //float binSize = h->GetXaxis()->GetBinWidth(10); //cout<<"BinSize is: "<<binSize<<endl; //cout<<"Histo Entries: "<<h->GetEntries()<<" and integral: "<<h->Integral()<<" and integral width "<<h->Integral("width")<<endl; //cout<<"h->GetSum()*0.1 (0.8 for bkg) "<<h->GetSum()<<" * 0.1 = "<<h->GetSum()*0.1<<endl; //cout<<"integralSig->getVal()*Nsig.getVal(): "<<integralSig->getVal()*Nsig.getVal()<<" : "<<integralSig->getVal()<<" * "<<Nsig.getVal()<<endl; //cout<<"gaus int "<<gaus.getVal()<<endl; ////cout<<"integralBkg->getVal()*Nbkg.getVal(): "<<integralBkg->getVal()*Nbkg.getVal()<<" : "<<integralBkg->getVal()<<" * "<<Nbkg.getVal()<<endl; //RooAbsReal* integralSig2 = gaus.createIntegral(x,NormSet(x)); //RooAbsReal* integralSig3 = gaus.createIntegral(x); //RooAbsReal* integralSig4 = gaus.createIntegral(x,NormSet(x),Range("sobRange")); //cout<<"integralSig "<<integralSig->getVal()<<" integralSig2 "<<integralSig2->getVal()<<" integralSig3 "<<integralSig3->getVal()<<" integralSig4 "<<integralSig4->getVal()<<endl; //cout<<"Se ci credo "<<endl; //cout<<"S: "<<integralSig->getVal()*Nsig.getVal()<<" B: "<<integralBkg->getVal()*Nbkg.getVal()<<" s/B "<<(integralSig->getVal()*Nsig.getVal())/(integralBkg->getVal()*Nbkg.getVal())<<endl; //cout<<"ALL: "<<endl; //cout<<"S: "<<Nsig.getVal()<<" B: "<<Nbkg.getVal()<<" s/B "<<Nsig.getVal()/Nbkg.getVal()<<" tot "<<(Nsig.getVal()+Nbkg.getVal())<<endl; //TF1 *gau = new TF1("gau","[0]*exp(-0.5*((x-[1])/[2])**2)", 0.08, 0.22); //gau->FixParameter(0,integralSig->getVal()*Nsig.getVal()*binSize); //gau->FixParameter(1,mean.getVal()); //gau->FixParameter(2,sigma.getVal()); //gau->SetLineColor(2); //gau->Draw("same"); //cout<<"TF1: "<<gau->Integral(0.08, 0.22)<<endl; } }
// .x PlotEffPt.C("DYJets","RecoPassedTag","RecoAllTag","RecoPassedTag","RecoAllTag",1,"NonPrompt","Prompt",2,0.4,1.0,"Id+Iso efficiency") void PlotEffPt(TString fileName = "DYJets_TP", TString numName0 = "RecoPassedTag", TString denName0 = "RecoAllTag", TString numName1 = "RecoPassedTag", TString denName1 = "RecoAllTag", bool isMuId = true, TString namePrompt0 = "NonPrompt", TString namePrompt1 = "Prompt", int EtaBin = 2, float yMin = 0.4, float yMax = 1.0, TString yTitle="Id+Iso efficiency") { // inputs // fileName - the name of the RooT file produced by AnalysisMacroEff (without .root extension) // numName0 - name of the numerator histogram for non-prompt leptons // denName0 - name of the denominator histogram for non-prompt leptons // numName1 - name of the numerator histogram for prompt leptons // denName1 - name of the denominator histogram for prompt leptons // isMuId - false : electron , true : muon // namePrompt0 - name of the histogram for prompt leptons // namePrompt1 - name of the histogram for non-prompt leptons // EtaBin - eta bin 0 : 0-0.8, 1 : 0.8-1.5, 2 : 1.5-2.4 // yMin, yMax - ranges of the y axis (efficiency) // yTitle : title of y axis setTDRStyle(); int lepSign = 0; TString name("ElectronPt_"); if (isMuId) name = "MuonPt_"; TString LepQ("Neg"); if (lepSign>0) LepQ = "Pos"; TString Type[2]; Type[0] = namePrompt0; Type[1] = namePrompt1; int nEtaBins = 3; TString EtaBinName[3] = {"0To0p8", "0p8To1p5", "1p5To2p3"}; TString EtaLeg[3] = {"#eta = [0,0.8]","#eta = [0.8,1.5]","#eta = [1.5,2.5]"}; if (isMuId) EtaLeg[2] = "#eta = [1.5,2.4]"; TFile * file = new TFile(fileName+".root"); int nPtBins = 7; float ptBins[8] = {10,15,20,30,40,50,70,100}; TString numName[2]; TString denName[2]; numName[0] = numName0; numName[1] = numName1; denName[0] = denName0; denName[1] = denName1; TH1F * histos[3][2][2]; for (int iEta=0; iEta<3; ++iEta) { for (int iType=0; iType<2; ++iType) { TH1F * histNum = (TH1F*)file->Get(name+LepQ+Type[iType]+numName[iType]+EtaBinName[iEta]); if (lepSign==0) { TH1F * histNumX = (TH1F*)file->Get(name+"Pos"+Type[iType]+numName[iType]+EtaBinName[iEta]); histNum->Add(histNum,histNumX); } histos[iEta][iType][0] = TH1toTH1(histNum,nPtBins,ptBins,false,"_new"); TH1F * histDen = (TH1F*)file->Get(name+LepQ+Type[iType]+denName[iType]+EtaBinName[iEta]); if (lepSign==0) { TH1F * histDenX = (TH1F*)file->Get(name+"Pos"+Type[iType]+denName[iType]+EtaBinName[iEta]); histDen->Add(histDen,histDenX); } histos[iEta][iType][1] = TH1toTH1(histDen,nPtBins,ptBins,false,"_new"); } } int color[3] = {1,2,4}; int symbol[3] = {20,21,22}; TGraphAsymmErrors * eff[3][2]; for (int iEta=0; iEta<3; ++iEta) { for (int iType=0; iType<2; ++iType) { eff[iEta][iType] = new TGraphAsymmErrors(); eff[iEta][iType]->SetLineColor(color[iEta]); eff[iEta][iType]->SetMarkerColor(color[iEta]); eff[iEta][iType]->SetLineWidth(2); eff[iEta][iType]->SetMarkerSize(2.5); eff[iEta][iType]->SetMarkerStyle(symbol[iEta]); if (iType==1) eff[iEta][iType]->SetMarkerStyle(symbol[iEta]+4); eff[iEta][iType]->Divide(histos[iEta][iType][0],histos[iEta][iType][1]); } } // ************** // Tag-and-Probe // ************** TString mass("massEEId_"); if (isMuId) mass = "massMuMuId_"; TString TagQ("Pos"); int nPtBins = 7; float ptBins[8] = {10,15,20,30,40,50,70,100}; TString PtBinName[7] = {"pt10to15", "pt15to20", "pt20to30", "pt30to40", "pt40to50", "pt50to70", "pt70to100"}; TString passName[2] = {"Pass","Fail"}; TH1F * histosTP[3][2]; for (int iEta=0; iEta<3; ++iEta) { for (int iPass=0; iPass<2; ++iPass) { histosTP[iEta][iPass] = new TH1F(passName[iPass]+EtaBinName[iEta],"",nPtBins,ptBins); for (int iPt=0; iPt<nPtBins; ++iPt) { TH1F * hist = (TH1F*)file->Get(mass+TagQ+EtaBinName[iEta]+PtBinName[iPt]+passName[iPass]); float yield = hist->GetSum(); histosTP[iEta][iPass]->SetBinContent(iPt+1,yield); } } } TGraphAsymmErrors * effTP[3]; for (int iEta=0; iEta<3; ++iEta) { effTP[iEta] = new TGraphAsymmErrors(); effTP[iEta]->SetLineColor(color[iEta]); effTP[iEta]->SetMarkerColor(color[iEta]); effTP[iEta]->SetLineWidth(2); effTP[iEta]->SetMarkerSize(3); effTP[iEta]->SetMarkerStyle(28); histosTP[iEta][1]->Add(histosTP[iEta][0],histosTP[iEta][1]); effTP[iEta]->Divide(histosTP[iEta][0],histosTP[iEta][1]); } TH2F * frame = new TH2F("frame","",2,10,50,2,yMin,yMax); frame->GetYaxis()->SetTitle(yTitle); frame->GetXaxis()->SetTitle("electron p_{T} [GeV/c]"); // frame->GetYaxis()->SetNdivisions(505); TString LegName("Z#rightarrowee"); if (isMuId) { frame->GetXaxis()->SetTitle("muon p_{T} [GeV/c]"); LegName = "Z#rightarrow#mu#mu"; } TCanvas * canv = new TCanvas("canv","",900,700); frame->Draw(); eff[EtaBin][0]->Draw("EPS"); eff[EtaBin][1]->Draw("EPS"); // effTP[EtaBin]->Draw("EPS"); TLegend * leg = new TLegend(0.6,0.2,0.9,0.5); leg->SetFillColor(0); leg->SetHeader(EtaLeg[EtaBin]); leg->AddEntry(eff[EtaBin][0],"Z#rightarrow#tau#tau#rightarrowe+#mu","lp"); leg->AddEntry(eff[EtaBin][1],LegName,"lp"); // leg->AddEntry(effTP[EtaBin] ,LegName+" (T&P)","lp"); leg->Draw(); canv->Update(); canv->Print(fileName+"_"+name+numName0+"_"+denName0+"_"+EtaBinName[EtaBin]+".gif"); }
int QAG4SimulationCalorimeter::process_event_G4Hit(PHCompositeNode *topNode) { if (verbosity > 2) cout << "QAG4SimulationCalorimeter::process_event_G4Hit() entered" << endl; TH1F* h = nullptr; Fun4AllHistoManager *hm = QAHistManagerDef::getHistoManager(); assert(hm); TH1D* h_norm = dynamic_cast<TH1D*>(hm->getHisto( get_histo_prefix() + "_Normalization")); assert(h_norm); // get primary assert(_truth_container); PHG4TruthInfoContainer::ConstRange primary_range = _truth_container->GetPrimaryParticleRange(); double total_primary_energy = 1e-9; //make it zero energy epsilon samll so it can be used for denominator for (PHG4TruthInfoContainer::ConstIterator particle_iter = primary_range.first; particle_iter != primary_range.second; ++particle_iter) { const PHG4Particle *particle = particle_iter->second; assert(particle); total_primary_energy += particle->get_e(); } assert(not _truth_container->GetMap().empty()); const PHG4Particle * last_primary = _truth_container->GetMap().rbegin()->second; assert(last_primary); if (verbosity > 2) { cout << "QAG4SimulationCalorimeter::process_event_G4Hit() handle this truth particle" << endl; last_primary->identify(); } const PHG4VtxPoint* primary_vtx = // _truth_container->GetPrimaryVtx(last_primary->get_vtx_id()); assert(primary_vtx); if (verbosity > 2) { cout << "QAG4SimulationCalorimeter::process_event_G4Hit() handle this vertex" << endl; primary_vtx->identify(); } const double t0 = primary_vtx->get_t(); const TVector3 vertex(primary_vtx->get_x(), primary_vtx->get_y(), primary_vtx->get_z()); // projection axis TVector3 axis_proj(last_primary->get_px(), last_primary->get_py(), last_primary->get_pz()); if (axis_proj.Mag() == 0) axis_proj.SetXYZ(0, 0, 1); axis_proj = axis_proj.Unit(); // azimuthal direction axis TVector3 axis_azimuth = axis_proj.Cross(TVector3(0, 0, 1)); if (axis_azimuth.Mag() == 0) axis_azimuth.SetXYZ(1, 0, 0); axis_azimuth = axis_azimuth.Unit(); // polar direction axis TVector3 axis_polar = axis_proj.Cross(axis_azimuth); assert(axis_polar.Mag() > 0); axis_polar = axis_polar.Unit(); double e_calo = 0.0; // active energy deposition double ev_calo = 0.0; // visible energy double ea_calo = 0.0; // absorber energy double ev_calo_em = 0.0; // EM visible energy if (_calo_hit_container) { TH2F * hrz = dynamic_cast<TH2F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_RZ")); assert(hrz); TH2F * hxy = dynamic_cast<TH2F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_XY")); assert(hxy); TH1F * ht = dynamic_cast<TH1F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_HitTime")); assert(ht); TH2F * hlat = dynamic_cast<TH2F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_LateralTruthProjection")); assert(hlat); h_norm->Fill("G4Hit Active", _calo_hit_container->size()); PHG4HitContainer::ConstRange calo_hit_range = _calo_hit_container->getHits(); for (PHG4HitContainer::ConstIterator hit_iter = calo_hit_range.first; hit_iter != calo_hit_range.second; hit_iter++) { PHG4Hit *this_hit = hit_iter->second; assert(this_hit); e_calo += this_hit->get_edep(); ev_calo += this_hit->get_light_yield(); // EM visible energy that is only associated with electron energy deposition PHG4Particle* particle = _truth_container->GetParticle( this_hit->get_trkid()); if (!particle) { cout <<__PRETTY_FUNCTION__<<" - Error - this PHG4hit missing particle: "; this_hit -> identify(); } assert(particle); if (abs(particle->get_pid()) == 11) ev_calo_em += this_hit->get_light_yield(); const TVector3 hit(this_hit->get_avg_x(), this_hit->get_avg_y(), this_hit->get_avg_z()); hrz->Fill(hit.Z(), hit.Perp(), this_hit->get_edep()); hxy->Fill(hit.X(), hit.Y(), this_hit->get_edep()); ht->Fill(this_hit->get_avg_t() - t0, this_hit->get_edep()); const double hit_azimuth = axis_azimuth.Dot(hit - vertex); const double hit_polar = axis_polar.Dot(hit - vertex); hlat->Fill(hit_polar, hit_azimuth, this_hit->get_edep()); } } if (_calo_abs_hit_container) { h_norm->Fill("G4Hit Absor.", _calo_abs_hit_container->size()); PHG4HitContainer::ConstRange calo_abs_hit_range = _calo_abs_hit_container->getHits(); for (PHG4HitContainer::ConstIterator hit_iter = calo_abs_hit_range.first; hit_iter != calo_abs_hit_range.second; hit_iter++) { PHG4Hit *this_hit = hit_iter->second; assert(this_hit); ea_calo += this_hit->get_edep(); } } if (verbosity > 3) cout << "QAG4SimulationCalorimeter::process_event_G4Hit::" << _calo_name << " - SF = " << e_calo / (e_calo + ea_calo + 1e-9) << ", VSF = " << ev_calo / (e_calo + ea_calo + 1e-9) << endl; if (e_calo + ea_calo > 0) { h = dynamic_cast<TH1F*>(hm->getHisto(get_histo_prefix() + "_G4Hit_SF")); assert(h); h->Fill(e_calo / (e_calo + ea_calo)); h = dynamic_cast<TH1F*>(hm->getHisto(get_histo_prefix() + "_G4Hit_VSF")); assert(h); h->Fill(ev_calo / (e_calo + ea_calo)); } h = dynamic_cast<TH1F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_FractionTruthEnergy")); assert(h); h->Fill((e_calo + ea_calo) / total_primary_energy); if (ev_calo > 0) { h = dynamic_cast<TH1F*>(hm->getHisto( get_histo_prefix() + "_G4Hit_FractionEMVisibleEnergy")); assert(h); h->Fill(ev_calo_em / (ev_calo)); } if (verbosity > 3) cout << "QAG4SimulationCalorimeter::process_event_G4Hit::" << _calo_name << " - histogram " << h->GetName() << " Get Sum = " << h->GetSum() << endl; return Fun4AllReturnCodes::EVENT_OK; }