void Analyzer::ComputeMin(){ g2=new TGraph2D(); //TODO alpha=1.0;beta=0; Loop(t_data,1); if(varName=="QGLMLP") Loop(t_mc,4); //scan alpha=1.0;beta=0; for(float ai=0.7; ai<=1.1; ai+=0.02) { Reset(h_mc); alpha=ai; Loop(t_mc,2); h_mc->Scale(h_data->Integral()/h_mc->Integral()); g2->SetPoint(g2->GetN(),alpha,beta, h_data->Chi2Test(h_mc,opt.c_str()) ); } alpha=1.0;beta=0; for(float bi=-0.5; bi<=0.5; bi+=0.01) { Reset(h_mc); beta=bi; Loop(t_mc,2); h_mc->Scale(h_data->Integral()/h_mc->Integral()); g2->SetPoint(g2->GetN(),alpha,beta, h_data->Chi2Test(h_mc,opt.c_str()) ); } //Find min0;min1 float min0=1,min1=0; pair<float,float> R=MinG(g2); min0=R.first;min1=R.second; for(int i=-nstep;i<=nstep;i++) for(int j=-nstep;j<=nstep;j++) { alpha=min0+i*stp0; beta=min1+j*stp1; Loop(t_mc,2); h_mc->Scale(h_data->Integral()/h_mc->Integral()); g2->SetPoint(g2->GetN(),alpha,beta, h_data->Chi2Test(h_mc,opt.c_str()) ); } //double min0,min1; R=MinG(g2); printf("a=%.3f;b=%.3f;lmin=%.3f;lmax=%.3f;break;\n",R.first,R.second,lmin,lmax); return; }
void plottingmacro_IVF() { double fa = 0.46502; double fb = 0.53498; bool debug_ = true; // std::string path("Nov10thFall11Plots/"); // std::string path("Nov10Fall1160MTopSlimPlots/"); std::string path("Nov10Fall1160MTopIVFPlots_b/"); if(debug_) std::cout << "Init the style form setTDRStyle" << std::endl; setTDRStyle(); gStyle->SetErrorX(0.5); gROOT->ForceStyle(); initOptions(); if(debug_) std::cout << "Init the sample" << std::endl; // std::vector<Sample> s = Nov10thDiJetPtUpdatedSlimHistos(); //std::vector<Sample> s = Nov10Fall1160MTopSlimHistos(); std::vector<Sample> s = Nov10Fall1160MTopIVFHistos(); Sample data(1,"fake data","S1.root",0,true,1000); if(debug_) std::cout << "Init the data sample" << std::endl; for(size_t i=0;i< s.size();i++) if(s[i].data) {data=s[i];break;} if(debug_) std::cout << "Ls data sample" << std::endl; data.file()->ls(); if(debug_) std::cout << "Init the mc sample" << std::endl; for(size_t i=0;i< s.size();i++) s[i].dump(1,fa,fb); std::vector<std::string> names; if(debug_) std::cout << "Get List of Keys" << std::endl; TList * subs = data.file()->GetListOfKeys(); for(size_t i=0;i< subs->GetSize();i++) { TString nn = subs->At(i)->GetName(); if( nn.Contains(TRegexp("Count*")) ) continue; if(debug_) std::cout << "Get List of Keys in subdirs" << std::endl; TList * objs = ((TDirectoryFile *)data.file()->Get(subs->At(i)->GetName()))->GetListOfKeys(); for(size_t j=0;j< objs->GetSize();j++) { if(debug_) std::cout << "Name = " << subs->At(i)->GetName()+std::string("/") + objs->At(j)->GetName() << std::endl; names.push_back(subs->At(i)->GetName()+std::string("/") + objs->At(j)->GetName()); // std::cout << subs->At(i)->GetName() << "/" << objs->At(j)->GetName() << std::endl; //TODO: select plots via regexp } } if(debug_) std::cout << "Starting plotting" << std::endl; std::string process; for(size_t i = 0 ; i < names.size() ; i++) { std::map<std::string,TH1F *> grouped; TString n=names[i]; // if(!n.Contains(TRegexp("VlightRegionHZee/HiggsPtVlightRegionHZee"))) continue; // if(!n.Contains(TRegexp("VlightRegionHZee/ZPtVlightRegionHZee"))) continue; // if(!n.Contains(TRegexp("VlightRegionHZee"))) continue; // if(!n.Contains(TRegexp("ZSVRegionZmmSV"))) continue; // if(!n.Contains(TRegexp("ZSVRegionZeeSV"))) continue; // if(!n.Contains(TRegexp("ZSVRegionZcombSV"))) continue; // if(!n.Contains(TRegexp("ZSVPureRegionZcombSV"))) continue; // if(!n.Contains(TRegexp("ZSVTTbarPureRegionZcombSV"))) continue; if(!n.Contains(TRegexp("TTbarRegionZeeSVJets"))) continue; if(n.Contains(TRegexp("RegionHZcomb"))) process = "Z(l^{+}l^{-})H(b#bar{b})"; if(n.Contains(TRegexp("RegionHZmm"))) process = "Z(#mu^{+}#mu^{-})H(b#bar{b})"; if(n.Contains(TRegexp("RegionHZee"))) process = "Z(e^{+}e^{-})H(b#bar{b})"; if(debug_) std::cout << "Creating the Canvas" << std::endl; TCanvas *c = new TCanvas(); c->SetLogy(false); c->SetTitle(names[i].c_str()); if(debug_) std::cout << "Creating histograms" << std::endl; TH1F *hd = ((TH1F*)data.file()->Get(names[i].c_str())); hd->Sumw2(); Options o=options[names[i]]; // hd->Rebin(o.rebin); hd->SetMarkerStyle(20); hd->GetXaxis()->SetLabelOffset(99); hd->SetYTitle(o.yaxis.c_str()); double nbin = hd->GetNbinsX(); double min_bin = hd->GetXaxis()->GetXmin(); double max_bin = hd->GetXaxis()->GetXmax(); TH1F *hmc = new TH1F("hmc","hmc", nbin, min_bin, max_bin); hmc->SetFillColor(kWhite); hmc->Sumw2(); // hmc->Rebin(o.rebin); if(debug_) std::cout << "Creating the THStack and Legend" << std::endl; THStack * sta = new THStack("sta",hd->GetTitle()); TLegend * l = new TLegend(o.legendx1,o.legendy1,o.legendx2,o.legendy2); //0.7,0.1,0.9,0.6); l->SetFillColor(kWhite); l->SetBorderSize(0); l->SetTextFont(62); l->SetTextSize(0.03); if(debug_) std::cout << "Adding data to the legend" << std::endl; l->AddEntry(hd, "Data","P"); if(debug_) std::cout << "Adding MC to the THStack" << std::endl; //with the proper trigger eff // double SF[] = {1.01,1.03,1.00}; // double SF[] = {1.03,1.054,1.032}; double SF[] = {1.0,1.0,1.0}; if(debug_){ for(int i = 0; i< 3; ++i) std::cout << "SF [" << i << "] = " << SF[i] << std::endl; } double mcIntegral=0; for(size_t j=0;j< s.size() ;j++) { if(!s[j].data) { if(debug_) std::cout << "Creating TH1F from file " << s[j].name << std::endl; TH1F * h = ((TH1F*)s[j].file()->Get(names[i].c_str())); h->Sumw2(); if(debug_){ std::cout << "TH1F created from file " << s[j].name << std::endl; std::cout << "Scaling : " << s[j].scale(data.lumi(),fa,fb) << std::endl; std::cout << "Scaling with SF : " << s[j].scale(data.lumi(),fa,fb,SF) << std::endl; std::cout << "Histo integral before scaling = " << h->Integral() << std::endl; } h->Scale(s[j].scale(data.lumi(),fa,fb,SF)); if(debug_){ std::cout << "Histo integral after scaling = " << h->Integral() << std::endl; std::cout << "Managing style... " << std::endl; } h->SetLineWidth(1.); h->SetFillColor(s[j].color); h->SetLineColor(s[j].color); // h->Rebin(options[names[i]].rebin); if(debug_) std::cout << "Cloning and update legend " << std::endl; if(grouped.find(s[j].name) == grouped.end()){ l->AddEntry(h,s[j].name.c_str(),"F"); } std::cout << "Sample : " << s[j].name << " - Integral for plot " << names[i] << " = " << h->Integral(-10000,10000) << std::endl; mcIntegral += h->Integral(); sta->Add(h); hmc->Add(h); //TO FIX grouped map // sovrascrive histo con lo stesso nome tipo VV o ST etc... grouped[s[j].name]=(TH1F *)h->Clone(("_"+names[i]).c_str()); } } if(debug_){ std::cout << "Data total = " << hd->Integral() << std::endl; std::cout << "MC = " << mcIntegral << std::endl; std::cout << "Data/MC = " << hd->Integral()/mcIntegral << std::endl; } TPad * TopPad = new TPad("TopPad","Top Pad",0.,0.3,1.,1. ) ; TPad * BtmPad = new TPad("BtmPad","Bottom Pad",0.,0.,1.,0.313 ) ; TopPad->SetBottomMargin(0.02); BtmPad->SetTopMargin(0.0); BtmPad->SetFillStyle(4000); TopPad->SetFillStyle(4000); BtmPad->SetFillColor(0); BtmPad->SetBottomMargin(0.35); TopPad->Draw() ; BtmPad->Draw() ; std::cout << "hd maximum = " << hd->GetMaximum() << " sta maximum = " << sta->GetMaximum() << std::endl; double maxY; if(hd->GetMaximum() > sta->GetMaximum()) maxY = (hd->GetMaximum())*1.5; else maxY = (sta->GetMaximum())*1.5; TopPad->cd(); hd->Draw("E1X0"); sta->Draw("sameHIST"); hmc->Draw("sameE2"); hmc->SetFillColor(2); hmc->SetMarkerSize(0); hmc->SetFillStyle(3013); hd->Draw("E1X0same"); l->Draw("same"); std::cout << "Set Maximum to = " << maxY << std::endl; hd->GetYaxis()->SetRangeUser(0.,maxY); hd->GetXaxis()->SetRangeUser(options[names[i]].min,options[names[i]].max); BtmPad->cd(); std::cout << "Division" << std::endl; TH1D * divisionErrorBand = (TH1D*)(hmc)->Clone("divisionErrorBand"); divisionErrorBand->Sumw2(); divisionErrorBand->Divide(hmc); divisionErrorBand->Draw("E2"); divisionErrorBand->SetMaximum(2.49); divisionErrorBand->SetMinimum(0); divisionErrorBand->SetMarkerStyle(20); divisionErrorBand->SetMarkerSize(0.55); divisionErrorBand->GetXaxis()->SetTitleOffset(1.12); divisionErrorBand->GetXaxis()->SetLabelSize(0.12); divisionErrorBand->GetXaxis()->SetTitleSize(0.5); divisionErrorBand->GetYaxis()->SetTitle("Data/MC"); divisionErrorBand->GetYaxis()->SetLabelSize(0.12); divisionErrorBand->GetYaxis()->SetTitleSize(0.12); divisionErrorBand->GetYaxis()->SetTitleOffset(0.40); divisionErrorBand->GetYaxis()->SetNdivisions(505); //divisionErrorBand->UseCurrentStyle(); divisionErrorBand->SetFillColor(2); divisionErrorBand->SetFillStyle(3001); divisionErrorBand->SetMarkerSize(0.); TH1D * division = (TH1D*)(hd)->Clone("division"); division->Sumw2(); division->Divide(hmc); // division->SetMaximum(2.5); // division->SetMinimum(0); // division->SetMarkerStyle(20); // division->SetMarkerSize(0.55); // division->GetXaxis()->SetLabelSize(0.12); // division->GetXaxis()->SetTitleSize(0.14); // division->GetYaxis()->SetLabelSize(0.10); // division->GetYaxis()->SetTitleSize(0.10); // division->GetYaxis()->SetTitle("Data/MC"); Double_t min = division->GetXaxis()->GetXmin(); Double_t max = division->GetXaxis()->GetXmax(); division->Draw("E1X0same"); TLine *line = new TLine(min, 1.0, max, 1.0); line->SetLineColor(kRed); line->Draw("same"); TLegend * leg3 =new TLegend(0.50,0.86,0.69,0.96); leg3->AddEntry(divisionErrorBand,"MC uncert. (stat.)","f"); leg3->SetFillColor(0); leg3->SetLineColor(0); leg3->SetShadowColor(0); leg3->SetTextFont(62); leg3->SetTextSize(0.06); leg3->Draw(); TPaveText *pave = new TPaveText(0.15,0.85,0.32,0.96,"brNDC"); pave->SetTextAlign(12); pave->SetLineColor(0); pave->SetFillColor(0); pave->SetShadowColor(0); //TText *text = pave->AddText(Form("#chi_{#nu}^{2} = %.3f, K_{s} = %.3f",histDt->Chi2Test(histCopyMC5,"UWCHI2/NDF"),histDt->KolmogorovTest(histCopyMC5))); // stat + sys TText *text = pave->AddText(Form("#chi_{#nu}^{2} = %.3f, K_{s} = %.3f",hd->Chi2Test(hmc,"UWCHI2/NDF"),hd->KolmogorovTest(hmc))); // stat only text->SetTextFont(62); text->SetTextSize(0.08); pave->Draw(); TopPad->cd(); TLatex latex; latex.SetNDC(); latex.SetTextAlign(12); latex.SetTextSize(0.052); latex.DrawLatex(0.17,0.89,"CMS Preliminary"); latex.SetTextSize(0.04); latex.DrawLatex(0.17,0.84,"#sqrt{s} = 7 TeV, L = 4.7 fb^{-1}"); // latex.DrawLatex(0.17,0.79,"Z(e^{+}e^{-})H(b#bar{b})"); latex.DrawLatex(0.17,0.79,process.c_str()); c->Update(); std::string cName= hd->GetName(); cName += "_bare.pdf"; cName = path+cName; c->Print(cName.c_str(),"pdf"); // std::cout << names[i] << " d: " << hd->Integral() << " "; // THStack * sta2 = new THStack("sta2",hd->GetTitle()); // float tot=0; // float toterr2=0; // if(debug_) // std::cout << "Putting the iterator in the for loop" << std::endl; // for(std::map<std::string,TH1F *>::reverse_iterator it=grouped.rbegin(); it!=grouped.rend();++it) // { // if(debug_) // std::cout << "Using the iterator" << std::endl; // std::cout << (*it).first << " " << (*it).second->Integral() << " | " << std::endl ; // if((*it).second->GetEntries() > 0) { // float er=1.*sqrt((*it).second->GetEntries())/(*it).second->GetEntries()*(*it).second->Integral(); // toterr2+=er*er; // } // tot+=(*it).second->Integral(); // sta2->Add(it->second); // } // std::cout << " Tot: " << tot << "+-" << sqrt(toterr2) << " SF: " << hd->Integral()/tot << std::endl; // TCanvas *c2 = new TCanvas(); // c2->SetTitle(names[i].c_str()); // std::cout << "hd maximum = " << hd->GetMaximum() << " sta2 maximum = " << sta2->GetMaximum() << std::endl; // if(hd->GetMaximum() > sta2->GetMaximum()) maxY = hd->GetBinContent(hd->GetMaximumBin()) * 1.5; // else maxY = ( sta2->GetMaximum())*1.5; // // hd->Draw("E1"); // sta2->Draw("PADSHIST"); // // hd->Draw("E1same"); // // l->Draw("same"); // std::cout << "Set Maximum to = " << maxY << std::endl; // hd->GetYaxis()->SetRangeUser(0.,maxY); // hd->GetXaxis()->SetRangeUser(options[names[i]].min,options[names[i]].max); // c2->Update(); // std::string c2Name = hd->GetName(); // c2Name = path+c2Name; // c2Name += "_norm.pdf"; // c2->Print(c2Name.c_str(),"pdf"); } }
pair<float,float> Analyzer::SmearDoubleMinFast(float a0_q,float b0_q , float a0_g,float b0_g,int type,int WriteOut){ //type = 0 Q, 1 G TGraph2D *g2_q=new TGraph2D(); g2_q->SetName("g2_q"); TGraph2D *g2_g=new TGraph2D(); g2_g->SetName("g2_g"); //scan a_q=a0_q;b_q=b0_q; a_g=a0_g;b_g=b0_g; alpha=1.0;beta=0; for(float ai=0.7; ai<=1.1; ai+=0.02) { Reset(h_mc); if(type==0)a_q=ai; if(type==1)a_g=ai; LoopFast(); h_mc->Scale(h_data->Integral()/h_mc->Integral()); if(type==0)g2_q->SetPoint(g2_q->GetN(),a_q,b_q, h_data->Chi2Test(h_mc,opt.c_str()) ); if(type==1)g2_g->SetPoint(g2_g->GetN(),a_g,b_g, h_data->Chi2Test(h_mc,opt.c_str()) ); } alpha=1.0;beta=0; a_q=a0_q;b_q=b0_q; a_g=a0_g;b_g=b0_g; for(float bi=-0.5; bi<=0.5; bi+=0.01) { Reset(h_mc); if(type==0)b_q=bi; if(type==1)b_g=bi; LoopFast(); h_mc->Scale(h_data->Integral()/h_mc->Integral()); if(type==0)g2_q->SetPoint(g2_q->GetN(),a_q,b_q, h_data->Chi2Test(h_mc,opt.c_str()) ); if(type==1)g2_g->SetPoint(g2_g->GetN(),a_g,b_g, h_data->Chi2Test(h_mc,opt.c_str()) ); } //Find min0;min1 float min0=1,min1=0; pair<float,float> R; if(type==0)R=MinG(g2_q); if(type==1)R=MinG(g2_g); min0=R.first;min1=R.second; for(int i=-nstep;i<=nstep;i++) for(int j=-nstep;j<=nstep;j++) { if(type==0)a_q=min0+i*stp0; if(type==1)a_g=min0+i*stp0; if(type==0)b_q=min1+j*stp1; if(type==1)b_g=min1+j*stp1; LoopFast(); h_mc->Scale(h_data->Integral()/h_mc->Integral()); if(type==0)g2_q->SetPoint(g2_q->GetN(),a_q,b_q, h_data->Chi2Test(h_mc,opt.c_str()) ); if(type==1)g2_g->SetPoint(g2_g->GetN(),a_g,b_g, h_data->Chi2Test(h_mc,opt.c_str()) ); } if(type==0)R=MinG(g2_q); if(type==1)R=MinG(g2_g); //SAME ON G,& REDO //printf("a=%.3f;b=%.3f;lmin=%.3f;lmax=%.3f;break;\n",R.first,R.second,lmin,lmax); if(WriteOut){ string name=Form("Results/outputZJet2_%s_pt%.0f_%.0f_rho%.0f_%.0f_eta%.0f_%.0f",varName.c_str(),PtMin,PtMax,RhoMin,RhoMax,EtaMin,EtaMax); if(type==0)g2_q->SaveAs((name+"g2_q.root").c_str()); if(type==1)g2_g->SaveAs((name+"g2_g.root").c_str()); } return R; }
void Analyzer::ComputeMinFast(){ g2=new TGraph2D(); alpha=1.0;beta=0; Loop(t_data,1); for(int j=0;j<=h_data->GetNbinsX()+1;j++)if(h_data->GetBinError(j)==0)h_data->SetBinError(j,1); if(varName=="QGLMLP") Loop(t_mc,4); //scan //reset Fast ResetFast(); alpha=1.0;beta=0; for(float ai=aMin; ai<=aMax; ai+=0.02) { Reset(h_mc); alphaFast.push_back(ai); betaFast.push_back(0); h_mcFast.push_back(new TH1F( Form("hmc_%d",int(h_mcFast.size())),"hmc",nBins,xMin,xMax) ); } alpha=1.0;beta=0; for(float bi=bMin; bi<=bMax; bi+=0.01) { Reset(h_mc); alphaFast.push_back(1.0); betaFast.push_back(bi); h_mcFast.push_back(new TH1F( Form("hmc_%d",int(h_mcFast.size())),"hmc",nBins,xMin,xMax) ); } for(int j=0;j< int(h_mcFast.size());j++) h_mcFast[j]->Sumw2(); Loop(t_mc,16); for(int i=0 ;i<int(alphaFast.size());i++) { for(int j=0;j<=h_mcFast[i]->GetNbinsX()+1;j++)if(h_mcFast[i]->GetBinError(j)==0)h_mcFast[i]->SetBinError(j,1); h_mcFast[i]->Scale(h_data->Integral()/h_mcFast[i]->Integral()); g2->SetPoint(g2->GetN(),alphaFast[i],betaFast[i], h_data->Chi2Test(h_mcFast[i],opt.c_str()) ); } //Find min0;min1 float min0=1,min1=0; pair<float,float> R=MinG(g2); min0=R.first;min1=R.second; ResetFast(); delete g2; g2=new TGraph2D(); for(int i=-nstep;i<=nstep;i++) for(int j=-nstep;j<=nstep;j++) { alphaFast.push_back(min0+i*stp0 ); betaFast.push_back(min1+j*stp1 ); h_mcFast.push_back(new TH1F( Form("hmc_%d",int(h_mcFast.size())),"hmc",nBins,xMin,xMax) ); //g2->SetPoint(g2->GetN(),alpha,beta, h_data->Chi2Test(h_mc,opt.c_str()) ); } alphaFast.push_back(min0); betaFast.push_back(0); h_mcFast.push_back(new TH1F( Form("hmc_%d",int(h_mcFast.size())),"hmc",nBins,xMin,xMax) ); alphaFast.push_back(min1); betaFast.push_back(bMax); h_mcFast.push_back(new TH1F( Form("hmc_%d",int(h_mcFast.size())),"hmc",nBins,xMin,xMax) ); alphaFast.push_back(1); betaFast.push_back(0); h_mcFast.push_back(new TH1F( Form("hmc_%d",int(h_mcFast.size())),"hmc",nBins,xMin,xMax) ); for(int j=0;j<int(h_mcFast.size());j++) h_mcFast[j]->Sumw2(); Loop(t_mc,16); for(int i=0 ;i<int(alphaFast.size());i++) { for(int j=0;j<=h_mcFast[i]->GetNbinsX()+1;j++)if(h_mcFast[i]->GetBinError(j)==0)h_mcFast[i]->SetBinError(j,1); h_mcFast[i]->Scale(h_data->Integral()/h_mcFast[i]->Integral()); g2->SetPoint(g2->GetN(),alphaFast[i],betaFast[i], h_data->Chi2Test(h_mcFast[i],opt.c_str()) ); } double m0,m1; R=MinG(g2,&m0,&m1); printf("a=%.3f;b=%.3f;lmin=%.3f;lmax=%.3f;break;//chi2=%.3lf; chi2_0=%.3lf\n",R.first,R.second,lmin,lmax,m0,m1); { TFile *out=TFile::Open("output.root","UPDATE");out->cd(); for(int i=0;i<int(h_mcFast.size());i++) { h_mcFast[i]->SetName(Form("%s_alpha%.2f_beta%.2f_lmin%.3f_lmax%.3f_pt%0f_%.0f_rho%.0f_%.0f_eta%.0f_%.0f",varName.c_str(),alphaFast[i],betaFast[i],lmin,lmax,PtMin,PtMax,RhoMin,RhoMax,EtaMin,EtaMax)); h_mcFast[i]->Write(); } h_data->SetName(Form("%s_data_pt%0f_%.0f_rho%.0f_%.0f_eta%.0f_%.0f",varName.c_str(),PtMin,PtMax,RhoMin,RhoMax,EtaMin,EtaMax)); h_data->Write(); } return; }
pair<float,float> Analyzer::SmearDoubleMin(float a0_q,float b0_q , float a0_g,float b0_g,int type){ //type = 0 Q, 1 G fprintf(stderr,"SmearDoubleMin\n"); TGraph2D *g2_q=new TGraph2D(); TGraph2D *g2_g=new TGraph2D(); alpha=1.0;beta=0; //if(h_data!=NULL)delete h_data; //if(h_mc!=NULL)delete h_mc; fprintf(stderr,"Creating Histos\n"); CreateHisto(3); fprintf(stderr,"Going to do Data Loop\n"); Loop(t_data,1); if(varName=="QGLMLP") Loop(t_mc,4); //scan a_q=a0_q;b_q=b0_q; a_g=a0_g;b_g=b0_g; alpha=1.0;beta=0; fprintf(stderr,"Going to do span ai\n"); for(float ai=0.7; ai<=1.1; ai+=0.02) { Reset(h_mc); if(type==0)a_q=ai; if(type==1)a_g=ai; Loop(t_mc,8); for(int j=0;j<=h_mc->GetNbinsX()+1;j++)if(h_mc->GetBinError(j)==0)h_mc->SetBinError(j,1); h_mc->Scale(h_data->Integral()/h_mc->Integral()); if(type==0)g2_q->SetPoint(g2_q->GetN(),a_q,b_q, h_data->Chi2Test(h_mc,opt.c_str()) ); if(type==1)g2_g->SetPoint(g2_g->GetN(),a_g,b_g, h_data->Chi2Test(h_mc,opt.c_str()) ); } alpha=1.0;beta=0; a_q=a0_q;b_q=b0_q; a_g=a0_g;b_g=b0_g; fprintf(stderr,"Going to do span bi\n"); for(float bi=-0.5; bi<=0.5; bi+=0.01) { Reset(h_mc); if(type==0)b_q=bi; if(type==1)b_g=bi; Loop(t_mc,8); for(int j=0;j<=h_mc->GetNbinsX()+1;j++)if(h_mc->GetBinError(j)==0)h_mc->SetBinError(j,1); h_mc->Scale(h_data->Integral()/h_mc->Integral()); if(type==0)g2_q->SetPoint(g2_q->GetN(),a_q,b_q, h_data->Chi2Test(h_mc,opt.c_str()) ); if(type==1)g2_g->SetPoint(g2_g->GetN(),a_g,b_g, h_data->Chi2Test(h_mc,opt.c_str()) ); } //Find min0;min1 float min0=1,min1=0; pair<float,float> R; if(type==0)R=MinG(g2_q); if(type==1)R=MinG(g2_g); min0=R.first;min1=R.second; for(int i=-nstep;i<=nstep;i++) for(int j=-nstep;j<=nstep;j++) { if(type==0)a_q=min0+i*stp0; if(type==1)a_g=min0+i*stp0; if(type==0)b_q=min1+j*stp1; if(type==1)b_g=min1+j*stp1; Loop(t_mc,8); for(int k=0;k<=h_mc->GetNbinsX()+1;k++)if(h_mc->GetBinError(k)==0)h_mc->SetBinError(k,1); h_mc->Scale(h_data->Integral()/h_mc->Integral()); if(type==0)g2_q->SetPoint(g2_q->GetN(),a_q,b_q, h_data->Chi2Test(h_mc,opt.c_str()) ); if(type==1)g2_g->SetPoint(g2_g->GetN(),a_g,b_g, h_data->Chi2Test(h_mc,opt.c_str()) ); } if(type==0)R=MinG(g2_q); if(type==1)R=MinG(g2_g); //SAME ON G,& REDO //printf("a=%.3f;b=%.3f;lmin=%.3f;lmax=%.3f;break;\n",R.first,R.second,lmin,lmax); return R; }
int main(int argc, char *argv[]) { // make sure command line arguments were supplied if (argc != 6) { cerr << "Usage: " << argv[0] << " [reference.root] [new-comparison.root] [root dir] [new-release] [old-release] \n"; return 1; } // create the comparison class PlotCompareUtility *pc = new PlotCompareUtility(argv[1],argv[2],argv[3],"METTask_"); HistoData *hd; if (pc->GetStatus() != 0) { cout << "Final Result: no_data" << endl; return 0; } // add histogram information //Type = 0 (Do not rebin or zoom) , 1 (Rebin and Zoom, x-axis > 0 ) , 2 (Rebin and Zoom) hd = pc->AddHistoData("MET"); hd->SetType(1); hd = pc->AddHistoData("METPhi"); hd->SetType(2); hd = pc->AddHistoData("METSig"); hd->SetType(1); hd = pc->AddHistoData("MEx"); hd->SetType(2); hd = pc->AddHistoData("MEy"); hd->SetType(2); hd = pc->AddHistoData("SumET"); hd->SetType(2); if (pc->GetStatus() != 0) { cerr << "error encountered, exiting.\n"; return pc->GetStatus(); } int num_histos = pc->GetNumHistos(); bool combinedFailed = false; float threshold = KS_TEST ? pc->GetKSThreshold() : pc->GetChi2Threshold(); // get the reference and comparison histograms int Nevents_ref = ((TH1F *)pc->GetRefHisto("Nevents"))->GetEntries(); int Nevents_new = ((TH1F *)pc->GetNewHisto("Nevents"))->GetEntries(); int Nevents = -1; if (Nevents_ref>Nevents_new) Nevents = Nevents_ref; else Nevents = Nevents_new; // create summary histograms TH1F h1dResults_passed("h1dResults_passed","",num_histos, 1, num_histos + 1); TH1F h1dResults_failed("h1dResults_failed","",num_histos, 1, num_histos + 1); // loop over the supplied list of histograms for comparison for (int index = 0; index < pc->GetNumHistos(); index++) { int number = index + 1; hd = pc->GetHistoData(number); //int type = hd->GetType(); //types[index] = type; string name = hd->GetName(); //string value = hd->GetValueX(); cout << name << endl; // get the reference and comparison histograms TH1F *href = (TH1F *)pc->GetRefHisto(name); TH1F *hnew = (TH1F *)pc->GetNewHisto(name); // ignore if histogram is empty if (hnew->GetEntries() <= 1 || href->GetEntries() <= 1) { cerr << name << " error: no entries"; combinedFailed = true; continue; } // calculate and set range and number of bins double h1RMS = hnew->GetRMS(); double h2RMS = href->GetRMS(); double RMS = TMath::Max(h1RMS, h2RMS); double h1Mean = hnew->GetMean(); double h2Mean = href->GetMean(); double Mean = 0.5 * (h1Mean + h2Mean); double Nbins = href->GetNbinsX(); double min = href->GetXaxis()->GetXmin(); double max = href->GetXaxis()->GetXmax(); double dX = max - min; double dNdX = 1; double NewMin = min; double NewMax = max; int rebinning = Nbins; if (RMS>0 && hd->GetType() ) { dNdX = 100. / ( 10 * RMS); NewMin = Mean - 10 * RMS; NewMax = Mean + 10 * RMS; } if ((dX * dNdX)>0 && hd->GetType() ) rebinning = (int)(double(Nbins) / (dX * dNdX)); if ( rebinning > 1 && hd->GetType() ) { href->Rebin(rebinning); hnew->Rebin(rebinning); } if ( hd->GetType() == 1 ) { href->GetXaxis()->SetRangeUser(0.0, NewMax); hnew->GetXaxis()->SetRangeUser(0.0, NewMax); } else if ( hd->GetType() == 2 ) { href->GetXaxis()->SetRangeUser(NewMin, NewMax); hnew->GetXaxis()->SetRangeUser(NewMin, NewMax); } // perform statistical tests double ks_score = hnew->KolmogorovTest(href,"D"); double chi2_score = hnew->Chi2Test(href, "p"); //double result = KS_TEST ? ks_score : chi2_score; double result = (ks_score>chi2_score) ? ks_score : chi2_score; href->SetNormFactor(Nevents_new); hnew->SetNormFactor(Nevents_new); //hnew->SetNormFactor(1); // ensure that the peaks of both histograms will be shown by making a dummy histogram float Nentries_ref = href->GetEntries(); float Nentries_new = hnew->GetEntries(); float XaxisMin_ref = 0, XaxisMax_ref = 0, YaxisMin_ref = 0, YaxisMax_ref = 0; float XaxisMin_new = 0, XaxisMax_new = 0, YaxisMin_new = 0, YaxisMax_new = 0; if (Nentries_ref>0) YaxisMax_ref = (href->GetMaximum()+TMath::Sqrt(href->GetMaximum()))*(Nentries_new/Nentries_ref); if (Nentries_new>0) YaxisMax_new = (hnew->GetMaximum()+TMath::Sqrt(hnew->GetMaximum())); XaxisMin_ref = href->GetXaxis()->GetXmin()>NewMin ? href->GetXaxis()->GetXmin() : NewMin; XaxisMax_ref = href->GetXaxis()->GetXmax()<=NewMax ? href->GetXaxis()->GetXmax() : NewMax; YaxisMax_ref = (YaxisMax_ref>=YaxisMax_new) ? YaxisMax_ref : YaxisMax_new; if (TMath::Abs(XaxisMin_ref - XaxisMax_ref)<1E-6) { XaxisMin_ref = 0; XaxisMax_ref = 1; } TH1F *hdumb = new TH1F("hdumb","", rebinning, XaxisMin_ref, XaxisMax_ref); hdumb->SetMinimum(1E-1); //--For Rick hdumb->SetMaximum(1.05*YaxisMax_ref); // if (href->GetMaximum() < hnew->GetMaximum()) // href->SetAxisRange(0, 1.1 * hnew->GetMaximum(), "Y"); // set drawing options on the reference histogram href->SetStats(0); href->SetLineWidth(2); href->SetLineColor(14); href->SetMarkerColor(14); href->SetFillColor(17); //href->SetFillStyle(3004); href->GetXaxis()->SetTitle(name.c_str()); href->GetYaxis()->SetTitle("Entries"); href->GetYaxis()->SetTitleOffset(1.5); // set drawing options on the new histogram hnew->SetStats(0); hnew->SetLineWidth(2); hnew->SetFillStyle(3001); // set drawing options on the dummy histogram hdumb->SetStats(0); hdumb->GetXaxis()->SetTitle(name.c_str()); hdumb->GetXaxis()->SetLabelSize(0.5 * hdumb->GetXaxis()->GetTitleSize()); hdumb->GetYaxis()->SetTitle("Entries"); hdumb->GetYaxis()->SetTitleOffset(1.5); hdumb->GetYaxis()->SetLabelSize(0.5 * hdumb->GetXaxis()->GetTitleSize()); stringstream ss_title; ss_title.precision(5); if (ks_score>chi2_score) ss_title << "KS Score = " << ks_score; else ss_title << "Chi^2 Score = " << chi2_score; TText canvas_title(0.1,0.97,ss_title.str().c_str()); // determine if test is a "pass" or a "fail" if (result <= threshold) { canvas_title.SetTextColor(kRed); // make this histogram red to denote failure hnew->SetFillColor(kRed); hnew->SetLineColor(206); hnew->SetMarkerColor(206); // mark the entire sample as being 'not-compatible' combinedFailed = true; // set the summary bin to failed (only need to set titles for passed h1dResults) h1dResults_passed.GetXaxis()->SetBinLabel(number, name.c_str()); h1dResults_failed.SetBinContent(number, result); } else { canvas_title.SetTextColor(kGreen); // make this histogram green to denote passing score hnew->SetFillColor(kGreen); hnew->SetLineColor(103); hnew->SetMarkerColor(103); // set the summary bin to passed h1dResults_passed.GetXaxis()->SetBinLabel(number, name.c_str()); h1dResults_passed.SetBinContent(number, result); } // setup canvas for displaying the compared histograms TCanvas histo_c("histo_c","histo_c",785,800); histo_c.Draw(); TPad histo_p("histo_p","histo_p",0,0,1,0.99); histo_p.Draw(); histo_c.cd(); canvas_title.SetTextSize(0.025); canvas_title.Draw(); histo_p.cd(); histo_p.SetLogy(1); //--This is just for Dr. Rick hdumb->Draw(); href->Draw("SAME"); hnew->Draw("SAME"); hnew->Draw("E1SAME"); stringstream legend_new; stringstream legend_ref; legend_new << argv[4] << ": " << Nentries_new << " entries, " << Nevents_new << " events"; legend_ref << argv[5] << ": " << Nentries_ref << " entries, " << Nevents_ref << " events"; TLegend l1(0.15,0.001,0.33, 0.06); l1.SetTextSize(0.02); l1.AddEntry(hnew, legend_new.str().c_str(),"lF"); l1.AddEntry(href, legend_ref.str().c_str(),"lF"); l1.SetFillColor(kNone); l1.Draw("SAME"); // print the result to gif string histo_name = name + ".gif"; histo_c.Print(histo_name.c_str(),"gif"); cout << "Result of comparison for " << name << ": ks score = " << ks_score << " : chi2 score = " << chi2_score << endl << endl; } // create summary canvas int summary_height = int(780 * float(num_histos) / 11); // 780; TCanvas main_c("main_c","main_c",799,summary_height); main_c.Draw(); TPad main_p("main_p","main_p",0.01,0.01,0.99,0.94); main_p.SetLeftMargin(0.30); main_p.SetBottomMargin(0.15); main_p.SetLogx(1); main_p.SetGrid(); main_p.SetFrameFillColor(10); main_p.Draw(); main_c.cd(); TText summary_title(.01, .95, ""); summary_title.Draw("SAME"); main_p.cd(); // setup the passing test bars h1dResults_passed.SetStats(0); h1dResults_passed.GetXaxis()->SetLabelSize(0.06); h1dResults_passed.GetYaxis()->SetLabelSize(0.04); h1dResults_passed.GetYaxis()->SetTitle("Compatibility"); h1dResults_passed.SetBarWidth(0.7); h1dResults_passed.SetBarOffset(0.1); h1dResults_passed.SetFillColor(kGreen); h1dResults_passed.SetLineColor(1); h1dResults_passed.GetYaxis()->SetRangeUser(1E-7,2); h1dResults_passed.Draw("hbar0"); // setup the failing test bars h1dResults_failed.SetStats(0); h1dResults_failed.GetXaxis()->SetLabelSize(0.06); h1dResults_failed.GetYaxis()->SetLabelSize(0.04); h1dResults_failed.GetYaxis()->SetTitle("Compatibility"); h1dResults_failed.SetBarWidth(0.7); h1dResults_failed.SetBarOffset(0.1); h1dResults_failed.SetFillColor(kRed); h1dResults_failed.SetLineColor(1); h1dResults_failed.GetYaxis()->SetRangeUser(1E-7,2); h1dResults_failed.Draw("hbar0SAME"); // draw the pass/fail threshold line TLine l(threshold, 1, threshold, num_histos+1); l.SetLineColor(kRed); l.SetLineWidth(2); l.SetLineStyle(2); l.Draw("SAME"); // print the results main_c.Update(); main_c.Print("AllResults-1dHistoCheck.gif","gif"); if (combinedFailed) cout << "Final Result: fail" << endl; else cout << "Final Result: pass" << endl; //delete pc; return 0; }
TCanvas *PlotDataMCMC(TChain *data, TChain *mc, TChain *mc2, TString branchname, TString binning, TString category, TString selection, TString dataLabel, TString mcLabel, TString mc2Label, TString xLabel, TString yLabelUnit, bool logy=false, bool usePU=true, bool smear=false, bool scale=false){ TString yLabel; TCanvas *c = new TCanvas("c",""); TString branchNameData=branchname; TString branchNameMC=branchname; ElectronCategory_class cutter; TCut selection_data=""; if(category.Sizeof()>1) selection_data = cutter.GetCut(category, false,0); selection_data+=selection; TCut selection_MC=""; if(category.Sizeof()>1) selection_MC = cutter.GetCut(category, true,0); selection_MC+=selection; if(smear){ branchNameMC.ReplaceAll("invMass_SC_regrCorr_pho ","(invMass_SC_regrCorr_pho*sqrt(smearEle[0]*smearEle[1]))"); branchNameMC.ReplaceAll("energySCEle_regrCorr_pho ","(energySCEle_regrCorr_pho*smearEle) "); branchNameMC.ReplaceAll("energySCEle_regrCorr_pho[0]","(energySCEle_regrCorr_pho[0]*smearEle[0])"); branchNameMC.ReplaceAll("energySCEle_regrCorr_pho[1]","(energySCEle_regrCorr_pho[1]*smearEle[1])"); } if(scale){ branchNameData.ReplaceAll("invMass_SC_regrCorr_pho ","(invMass_SC_regrCorr_pho*sqrt(corrEle[0]*corrEle[1]))"); branchNameData.ReplaceAll("energySCEle_regrCorr_pho ","(energySCEle_regrCorr_pho*corrEle)"); branchNameData.ReplaceAll("energySCEle_regrCorr_pho[0]","(energySCEle_regrCorr_pho[0]*corrEle[0])"); branchNameData.ReplaceAll("energySCEle_regrCorr_pho[1]","(energySCEle_regrCorr_pho[1]*corrEle[1])"); } //std::cout << branchNameData << "\t" << branchNameMC << std::endl; data->Draw(branchNameData+">>data_hist"+binning, selection_data); if(mc!=NULL){ if(usePU) mc->Draw(branchNameMC+">>mc_hist"+binning, selection_MC *"puWeight"); else mc->Draw(branchNameMC+">>mc_hist"+binning, selection_MC); } if(mc2!=NULL){ if(usePU) mc2->Draw(branchNameMC+">>mc2_hist"+binning, selection_data *"puWeight"); else mc2->Draw(branchNameMC+">>mc2_hist"+binning, selection_data); } c->Clear(); TH1F *d = (TH1F *) gROOT->FindObject("data_hist"); TH1F *s = (TH1F *) gROOT->FindObject("mc_hist"); TH1F *s2 = (TH1F *) gROOT->FindObject("mc2_hist"); if(s==NULL){ std::cerr << "[WARNING] no mc" << std::endl; s=d; } if(s2==NULL){ std::cerr << "[WARNING] no mc2" << std::endl; s2=s; } std::cout << s->GetEntries() << "\t" << s2->GetEntries() << "\t" << d->GetEntries() << std::endl; //d->SaveAs("tmp/d_hist.root"); s->SaveAs("tmp/s_hist.root"); s2->SaveAs("tmp/s2_hist.root"); yLabel.Form("Events /(%.2f %s)", s->GetBinWidth(2), yLabelUnit.Data()); float max = 1.1 * std::max( d->GetMaximum(),///d->Integral(), s->GetMaximum() ///s->Integral() ); max=1.1*d->GetMaximum(); std::cout << "max = " << max << std::endl; std::cout << "nEvents data: " << d->Integral() << "\t" << d->GetEntries() << std::endl; std::cout << "nEvents signal: " << s->Integral() << "\t" << s->GetEntries() << std::endl; std::cout << "nEvents signal2: " << s2->Integral() << "\t" << s2->GetEntries() << std::endl; if(logy){ max*=10; d->GetYaxis()->SetRangeUser(0.1,max); s->GetYaxis()->SetRangeUser(0.1,max); s2->GetYaxis()->SetRangeUser(0.1,max); c->SetLogy(); } else { d->GetYaxis()->SetRangeUser(0,max); s->GetYaxis()->SetRangeUser(0,max); s2->GetYaxis()->SetRangeUser(0,max); } s->GetYaxis()->SetTitle(yLabel); s->GetXaxis()->SetTitle(xLabel); s2->GetYaxis()->SetTitle(yLabel); s2->GetXaxis()->SetTitle(xLabel); d->GetYaxis()->SetTitle(yLabel); d->GetXaxis()->SetTitle(xLabel); d->SetMarkerStyle(20); d->SetMarkerSize(1); if(d != s){ s->SetMarkerStyle(20); s->SetMarkerSize(1); s->SetFillStyle(3001); s->SetFillColor(kRed); } if(s2 != s){ //s2->SetMarkerStyle(1); //s2->SetMarkerSize(0); //s->SetFillStyle(0); //s->SetFillColor(kB); s2->SetLineWidth(3); s2->SetLineColor(kBlack); } TH1F* s_norm = (TH1F *) (s->DrawNormalized("hist", d->Integral())); TH1F* s2_norm = (TH1F *) (s2->DrawNormalized("hist same", d->Integral())); //TH1F* d_norm = s_norm; //if(d!=s) d_norm = (TH1F *) (d->DrawNormalized("p same", d->Integral())); if(d!=s) d->Draw("p same"); if(logy){ //d_norm->GetYaxis()->SetRangeUser(0.1,max); s_norm->GetYaxis()->SetRangeUser(0.1,max); c->SetLogy(); } else { //d_norm->GetYaxis()->SetRangeUser(0,max); s_norm->GetYaxis()->SetRangeUser(0,max); } std::cout << "Variable & Data & Simulation & Simulation2 \\" << std::endl; std::cout << "Mean & " << d->GetMean() << " " << d->GetMeanError() << " & " << s_norm->GetMean() << " " << s_norm->GetMeanError() << " & " << s2_norm->GetMean() << " " << s2_norm->GetMeanError() << " \\" << std::endl; std::cout << "Std. dev. & " << d->GetRMS() << " " << d->GetRMSError() << " & " << s_norm->GetRMS() << " " << s_norm->GetRMSError() << " & " << s2_norm->GetRMS() << " " << s2_norm->GetRMSError() << " \\" << std::endl; std::cout << "\\hline" << std::endl; std::cout << "$\\Chi^2$ " << d->Chi2Test(s_norm, "UW CHI2/NDF NORM") << std::endl; TLegend *leg = new TLegend(0.6,0.8,1,1); if(dataLabel !="") leg->AddEntry(d,dataLabel,"p"); if(mcLabel !="") leg->AddEntry(s,mcLabel, "lf"); if(mc2Label !="") leg->AddEntry(s2,mc2Label, "l"); leg->SetBorderSize(1); leg->SetFillColor(0); leg->SetTextSize(0.04); if(dataLabel !="" && mcLabel !="") leg->Draw(); //c->GetListOfPrimitives()->Add(leg,""); TPaveText *pv = new TPaveText(0.23,0.95,0.6,1,"NDC"); pv->AddText("CMS Preliminary 2016"); pv->SetFillColor(0); pv->SetBorderSize(0); pv->Draw(); return c; }
TCanvas *PlotDataMC(TChain *data, TChain *mc, TString branchname, TString binning, TString category, TString selection, TString dataLabel, TString mcLabel, TString xLabel, TString yLabelUnit, bool logy=false, bool usePU=true, bool smear=false, bool scale=false){ TString yLabel; std::cout<<"entering"<<std::endl; TCanvas *c = new TCanvas("c",""); TString branchNameData=branchname; TString branchNameMC=branchname; ElectronCategory_class cutter; std::cout<<"entering2"<<std::endl; TCut selection_data=""; if(category.Sizeof()>1) selection_data = cutter.GetCut(category, false,0,true); selection_data.Print(); // return NULL; selection_data+=selection; TCut selection_MC=""; if(category.Sizeof()>1) selection_MC = cutter.GetCut(category, false,0); selection_MC+=selection; std::cout<<"qui"<<std::endl; if(smear){ branchNameMC.ReplaceAll("invMass_SC_regrCorr_pho ","(invMass_SC_regrCorr_pho*sqrt(smearEle[0]*smearEle[1]))"); branchNameMC.ReplaceAll("energySCEle_regrCorr_pho ","(energySCEle_regrCorr_pho*smearEle) "); branchNameMC.ReplaceAll("energySCEle_regrCorr_pho[0]","(energySCEle_regrCorr_pho[0]*smearEle[0])"); branchNameMC.ReplaceAll("energySCEle_regrCorr_pho[1]","(energySCEle_regrCorr_pho[1]*smearEle[1])"); } if(scale){ branchNameData.ReplaceAll("invMass_SC_regrCorr_pho ","(invMass_SC_regrCorr_pho*sqrt(corrEle[0]*corrEle[1]))"); branchNameData.ReplaceAll("energySCEle_regrCorr_pho ","(energySCEle_regrCorr_pho*corrEle)"); branchNameData.ReplaceAll("energySCEle_regrCorr_pho[0]","(energySCEle_regrCorr_pho[0]*corrEle[0])"); branchNameData.ReplaceAll("energySCEle_regrCorr_pho[1]","(energySCEle_regrCorr_pho[1]*corrEle[1])"); branchNameData.ReplaceAll("energySCEle_regrCorr_ele ","(energySCEle_regrCorr_ele*corrEle)"); branchNameData.ReplaceAll("energySCEle_regrCorr_ele[0]","(energySCEle_regrCorr_ele[0]*corrEle[0])"); branchNameData.ReplaceAll("energySCEle_regrCorr_ele[1]","(energySCEle_regrCorr_ele[1]*corrEle[1])"); } //std::cout << branchNameData << "\t" << branchNameMC << std::endl; if(branchname=="HLT"){ TH1F *hlt_data = new TH1F("data_hist","",500,0,500); TH1F *hlt_mc = new TH1F("mc_hist","",500,0,500); std::vector< std::string > *HLTNames = new std::vector<std::string>; ///< List of HLT names std::vector<Bool_t> *HLTResults = new std::vector<Bool_t>; ///< 0=fail, 1=fire data->SetBranchAddress("HLTNames", &HLTNames); data->SetBranchAddress("HLTResults", &HLTResults); data->GetEntries(); for(Long64_t jentry=0; jentry < data->GetEntriesFast(); jentry++){ data->GetEntry(jentry); std::vector<Bool_t>::const_iterator hltRes_itr=HLTResults->begin(); for(std::vector<std::string>::const_iterator hlt_itr=HLTNames->begin(); hlt_itr!=HLTNames->end(); hlt_itr++,hltRes_itr++){ std::cout << *hlt_itr << std::endl; hlt_data->Fill(hlt_itr-HLTNames->begin(),*hltRes_itr); } } data->ResetBranchAddresses(); mc->SetBranchAddress("HLTNames", &HLTNames); mc->SetBranchAddress("HLTResults", &HLTResults); mc->GetEntries(); for(Long64_t jentry=0; jentry < mc->GetEntriesFast(); jentry++){ mc->GetEntry(jentry); std::vector<Bool_t>::const_iterator hltRes_itr=HLTResults->begin(); for(std::vector<std::string>::const_iterator hlt_itr=HLTNames->begin(); hlt_itr!=HLTNames->end(); hlt_itr++,hltRes_itr++){ std::cout << *hlt_itr << std::endl; hlt_mc->Fill(hlt_itr-HLTNames->begin(),*hltRes_itr); } } for(std::vector<std::string>::const_iterator hlt_itr=HLTNames->begin(); hlt_itr!=HLTNames->end(); hlt_itr++){ int index=hlt_itr-HLTNames->begin()+1; if(hlt_mc->GetBinContent(index)>0) hlt_mc->GetXaxis()->SetBinLabel(index,(*hlt_itr).c_str()); } } else { std::cout<<"qui"<<std::endl; data->Draw(branchNameData+">>data_hist"+binning, selection_data); if(mc!=NULL){ if(usePU) mc->Draw(branchNameMC+">>mc_hist"+binning, selection_MC *"puWeight"); else mc->Draw(branchNameMC+">>mc_hist"+binning, selection_MC); std::cout<<"qui"<<std::endl; } } c->Clear(); TH1F *d = (TH1F *) gROOT->FindObject("data_hist"); TH1F *s = (TH1F *) gROOT->FindObject("mc_hist"); if(s==NULL) s=d; //d->SaveAs("tmp/d_hist.root"); s->SaveAs("tmp/s_hist.root"); std::cout<<"qui"<<std::endl; yLabel.Form("Events /(%.2f %s)", s->GetBinWidth(2), yLabelUnit.Data()); float max = 1.1 * std::max( d->GetMaximum(),///d->Integral(), s->GetMaximum() ///s->Integral() ); max=1.1*d->GetMaximum(); std::cout << "max = " << max << std::endl; std::cout << "nEvents data: " << d->Integral() << "\t" << d->GetEntries() << std::endl; std::cout << "nEvents signal: " << s->Integral() << "\t" << s->GetEntries() << std::endl; if(logy){ max*=10; d->GetYaxis()->SetRangeUser(0.1,max); s->GetYaxis()->SetRangeUser(0.1,max); c->SetLogy(); } else { d->GetYaxis()->SetRangeUser(0,max); s->GetYaxis()->SetRangeUser(0,max); } s->GetYaxis()->SetTitle(yLabel); s->GetXaxis()->SetTitle(xLabel); d->GetYaxis()->SetTitle(yLabel); d->GetXaxis()->SetTitle(xLabel); d->SetMarkerStyle(20); d->SetMarkerSize(1); if(d != s){ s->SetMarkerStyle(20); s->SetMarkerSize(1); s->SetFillStyle(3001); s->SetFillColor(kRed); } TH1F* s_norm = (TH1F *) (s->DrawNormalized("hist", d->Integral())); //TH1F* d_norm = s_norm; //if(d!=s) d_norm = (TH1F *) (d->DrawNormalized("p same", d->Integral())); if(d!=s) d->Draw("p same"); if(logy){ //d_norm->GetYaxis()->SetRangeUser(0.1,max); s_norm->GetYaxis()->SetRangeUser(0.1,max); c->SetLogy(); } else { //d_norm->GetYaxis()->SetRangeUser(0,max); s_norm->GetYaxis()->SetRangeUser(0,max); } std::cout << "Variable & Data & Simulation \\" << std::endl; std::cout << "Mean & " << d->GetMean() << " " << d->GetMeanError() << " & " << s_norm->GetMean() << " " << s_norm->GetMeanError() << " \\" << std::endl; std::cout << "Std. dev. & " << d->GetRMS() << " " << d->GetRMSError() << " & " << s_norm->GetRMS() << " " << s_norm->GetRMSError() << " \\" << std::endl; std::cout << "\\hline" << std::endl; std::cout << "$\\Chi^2$ " << d->Chi2Test(s_norm, "UW CHI2/NDF NORM") << std::endl; TLegend *leg = new TLegend(0.6,0.8,1,1); if(dataLabel !="") leg->AddEntry(d,dataLabel,"p"); if(mcLabel !="") leg->AddEntry(s,mcLabel, "lf"); leg->SetBorderSize(1); leg->SetFillColor(0); leg->SetTextSize(0.04); if(dataLabel !="" && mcLabel !="") leg->Draw(); //c->GetListOfPrimitives()->Add(leg,""); TPaveText *pv = new TPaveText(0.2,0.95,0.7,1,"NDC"); pv->AddText("CMS Preliminary 2016"); pv->SetFillColor(0); pv->SetBorderSize(0); pv->Draw(); return c; }
void ReactorNuAnalysis() { // -------- VARIABLE DEFINITIONS and SETUP -------- // Style settings gStyle->SetOptStat(""); // Constants Double_t NuSpectrumMinE = 0.0; // [MeV] Double_t NuSpectrumMaxE = 10.0; // [MeV] Int_t seed = 43534; const Double_t Gfermi = 1.16637e-11; // [MeV^-2] const Double_t Sin2ThetaW = 0.2387; const Double_t InverseMeVtoCm = 1.97e-11; const Double_t elementaryCharge = 1.602176565e-19; // Spectrum files (these are just samples for now) const char ReactorNeutronBackgroundFile[] = "SampleData.txt"; // Define constants relevant for this run Double_t OnOffTimeRatio = 1.0/1.0; Double_t time = 100 * 24.0*3600.0; // [sec] Double_t detMass = 5000.0; // [g] Double_t distance = 200.0; // [cm] Double_t activity = 6.0/200.0/elementaryCharge; // [sec^-1] const Int_t nNeutrons = 14; const Int_t nProtons = 14; const Double_t Qweak = nNeutrons - (1 - 4*Sin2ThetaW) * nProtons; const Double_t NucleonMass = (nNeutrons * 939.565) + (nProtons * 938.272); // [MeV] // Define the histograms TH1F* RecoilEvtHistogram = new TH1F("RecoilEvtHistogram","^{28}Si recoil energy spectrum;Energy [eV];Events / 10 eV",50,0.0,500.0); TH1F* NeutrinoEvtHistogram = new TH1F("NeutrinoEvtHistogram","#bar{#nu}_{e} energy spectrum;Energy [MeV];Events / 0.5 MeV",50,0.0,20); TH1F* TheoryRecoilEvtHistogram = new TH1F("TheoryRecoilEvtHistogram","High-statistics (\"theoretical\") Coherent Recoil Spectrum;Energy [eV];Events / 10 eV",50,0.0,500.0); TH1F* TheoryNeutrinoEvtHistogram = new TH1F("TheoryNeutrinoEvtHistogram","High-statistics (\"theoretical\") Neutrino Energy Spectrum;Energy [MeV] / 0.5 MeV;Events",50,0.0,20); TH1F* TheoryRecoilEvtHistogramFit = new TH1F("TheoryRecoilEvtHistogram","MC Fit;Events",50,0.0,0.002); TH1F* EMNoLukeBackground = new TH1F("EMNoLukeBackground","Background from EM recoils (before Luke Effect amplification;Energy [MeV];Events)",50,0.0,0.002); TH1F* ReactorNeutronBackground = new TH1F("ReactorNeutronBackground","Background from reactor neutrons;Energy [MeV];Events",50,0.0,0.002); TH1F* ReactorOnCosmoNeutronBackground = new TH1F("ReactorOnCosmoNeutronBackground","Reactor-on background from muon-induced neutrons;Energy [MeV];Events)",50,0.0,0.002); TH1F* ReactorOffCosmoNeutronBackground = new TH1F("ReactorOffCosmoNeutronBackground","Reactor-off background from muon-induced neutrons;Energy [MeV];Events)",50,0.0,0.002); TH1F* ReactorOnHisto = new TH1F("ReactorOnHisto","Recoil Spectrum for Reactor-On Data;Energy [MeV];Events",50,0.0,0.002); TH1F* ReactorOffHisto = new TH1F("ReactorOffHisto","Recoil Spectrum for Reactor-Off Data;Energy [MeV];Events",50,0.0,0.002); TH1F* BackgroundSubtractedSignal = new TH1F("BackgroundSubtractedSignal","Recoil Spectrum for Reactor-Off Data;Energy [MeV];Events",50,0.0,0.002); // Energy spectra // (Spectral parameterizations from arXiv:1101.2663v3) TF1* NeutrinoEnergySpectrum = new TF1("NeutrinoSpectrum", "TMath::Exp([0] + [1]*x + [2]*TMath::Power(x,2) + [3]*TMath::Power(x,3) + [4]*TMath::Power(x,4) + [5]*TMath::Power(x,5))", NuSpectrumMinE, NuSpectrumMaxE); NeutrinoEnergySpectrum->SetParameters(3.217, -3.111, 1.395, -0.369, 0.04445, -0.002053); TF1* IntegratedRecoilSpectrum = new TF1("IntegratedRecoilSpectrum", "TMath::Power([0]*[1]*[3],2)/(4*TMath::Pi()) * [2] * (x/(1 + [2]/(2*x))) * (1 - ([2]/(4*x*x)) * (x/(1 + [2]/(2*x))))", NuSpectrumMinE, NuSpectrumMaxE); IntegratedRecoilSpectrum->SetParameters(Gfermi, Qweak, NucleonMass, InverseMeVtoCm); TF1* RecoilSpectrum = new TF1("RecoilSpectrum","IntegratedRecoilSpectrum * NeutrinoSpectrum", 0.0, 10.0); TF1* DiffRecoilSpectrumAtConstE = new TF1("DiffRecoilSpectrumAtConstE", "(x<[4])*TMath::Power([0]*[1],2)/(4*TMath::Pi()) * [2] * (1 - ([2] * x)/(2 * TMath::Power([3],2))) + (x>[4])*0", NuSpectrumMinE, 0.01); DiffRecoilSpectrumAtConstE->SetParameters(Gfermi, Qweak, NucleonMass); // -------- HISTOGRAM FILLING -------- // Fill "experimental" histograms Int_t nEvt = GenerateNumOfNuRecoils(time, detMass, distance, activity, nNeutrons, nProtons, RecoilSpectrum, NuSpectrumMinE, NuSpectrumMaxE, seed); FillNuRecoilSpectrum(RecoilEvtHistogram, NeutrinoEvtHistogram, nEvt, nNeutrons, nProtons, RecoilSpectrum, DiffRecoilSpectrumAtConstE, NuSpectrumMinE, NuSpectrumMaxE, seed+4); FillRecoilSpectrumFromFile(ReactorNeutronBackground, 100.0, 10.0, ReactorNeutronBackgroundFile, seed+1); // Testing purposes only. CHANGE ME!! FillRecoilSpectrumFromFile(ReactorOnCosmoNeutronBackground, 50.0, 10.0, ReactorNeutronBackgroundFile, seed+2); // Testing purposes only. CHANGE ME!! FillRecoilSpectrumFromFile(ReactorOffCosmoNeutronBackground, 50.0, 10.0, ReactorNeutronBackgroundFile, seed+3); // Testing purposes only. CHANGE ME!! cout << "nEvt: " << nEvt << endl; // Fill high-statistics "theoretical" histograms FillNuRecoilSpectrum(TheoryRecoilEvtHistogram, TheoryNeutrinoEvtHistogram, 10000, nNeutrons, nProtons, RecoilSpectrum, DiffRecoilSpectrumAtConstE, NuSpectrumMinE, NuSpectrumMaxE, seed+5); TheoryNeutrinoEvtHistogram->Scale(nEvt/TheoryNeutrinoEvtHistogram->GetEntries()); TheoryRecoilEvtHistogram->Scale(nEvt/TheoryNeutrinoEvtHistogram->GetEntries()); // Combine the histograms into total ReactorOnHisto->Add(RecoilEvtHistogram); ReactorOnHisto->Add(ReactorNeutronBackground); ReactorOnHisto->Add(ReactorOnCosmoNeutronBackground); ReactorOffHisto->Add(ReactorOffCosmoNeutronBackground); // -------- HYPOTHESIS TESTING -------- cout << "p-value between Reactor-On and Reactor-Off Data: " << ReactorOnHisto->Chi2Test(ReactorOffHisto) << endl; cout << "p-value between the simulated data and the Monte Carlo histogram: " << RecoilEvtHistogram->Chi2Test(TheoryRecoilEvtHistogram) << endl; // -------- BACKGROUND SUBTRACTION and FITTING -------- // Normalize reactor-off data to reactor-on data by exposure BackgroundSubtractedSignal->Add(ReactorOnHisto, ReactorOffHisto, 1.0, -1.0*OnOffTimeRatio); // Use TFractionFitter to do fitting TObjArray *FractionFitData = new TObjArray(2); FractionFitData->Add(TheoryRecoilEvtHistogram); FractionFitData->Add(ReactorOffHisto); TFractionFitter* ffit = new TFractionFitter(ReactorOnHisto, FractionFitData); ffit->Constrain(0,0.1,10.0); ffit->Constrain(1,1.0,1.0); Int_t status = ffit->Fit(); TH1F* result = (TH1F*) ffit->GetPlot(); // Build a stacked histogram for plotting Double_t param, error; THStack *ReactorOnStackedFit = new THStack("ReactorOnStackedFit","Signal fits for Reactor-On data"); ffit->GetResult(0,param,error); TheoryRecoilEvtHistogramFit->Add(TheoryRecoilEvtHistogram,param); ReactorOnStackedFit->Add(TheoryRecoilEvtHistogramFit); ReactorOnStackedFit->Add(ReactorOffHisto); // -------- MAKE PLOTS -------- // Set drawing settings RecoilEvtHistogram->SetLineColor(1); NeutrinoEvtHistogram->SetLineColor(1); TheoryRecoilEvtHistogram->SetLineColor(2); TheoryNeutrinoEvtHistogram->SetLineColor(2); ReactorOnHisto->SetLineColor(1); result->SetLineColor(2); // Draw everything TCanvas* c1 = new TCanvas("c1"); RecoilEvtHistogram->Draw("E1"); TheoryRecoilEvtHistogram->Draw("same"); legend1 = new TLegend(0.6,0.7,0.89,0.89); legend1->AddEntry(RecoilEvtHistogram,"Data","lep"); legend1->AddEntry(TheoryRecoilEvtHistogram,"Monte Carlo","l"); legend1->SetFillColor(0); legend1->Draw(); TCanvas* c2 = new TCanvas("c2"); NeutrinoEvtHistogram->Draw("E1"); TheoryNeutrinoEvtHistogram->Draw("same"); legend2 = new TLegend(0.6,0.7,0.89,0.89); legend2->AddEntry(RecoilEvtHistogram,"Data","lep"); legend2->AddEntry(TheoryRecoilEvtHistogram,"Monte Carlo","l"); legend2->SetFillColor(0); legend2->Draw(); TCanvas* c3 = new TCanvas("c3"); ReactorOnHisto->Draw("E1"); ReactorOffHisto->Draw("E1,same"); legend3 = new TLegend(0.6,0.7,0.89,0.89); legend3->AddEntry(ReactorOnHisto,"Reactor On","lep"); legend3->AddEntry(ReactorOffHisto,"Reactor Off","lep"); legend3->SetFillColor(0); legend3->Draw(); TCanvas* c4 = new TCanvas("c4"); ReactorNeutronBackground->Draw("E1"); //This plot is broken: THStack is not being used correctly /*TCanvas* c5 = new TCanvas("c5"); ReactorOnHisto->Draw("E1"); TheoryRecoilEvtHistogramFit->SetFillColor(kRed); TheoryRecoilEvtHistogramFit->SetMarkerStyle(1); TheoryRecoilEvtHistogramFit->SetMarkerColor(kRed); ReactorOffHisto->SetFillColor(kBlue); ReactorOffHisto->SetMarkerStyle(1); ReactorOffHisto->SetMarkerColor(kBlue); ReactorOnStackedFit->Draw("same"); legend5 = new TLegend(0.6,0.7,0.89,0.89); legend5->AddEntry(ReactorOnHisto,"Reactor On","lep"); legend5->AddEntry(ReactorOffHisto,"Reactor Off"); legend5->AddEntry(TheoryRecoilEvtHistogramFit,"Coherent Scattering"); legend5->SetFillColor(0); legend5->Draw();*/ WriteHistogramToFile(RecoilEvtHistogram, "histogramOutput.txt"); WriteNuRecoilEvents("MonoenergeticEvents.txt", 0.811, nEvt, nNeutrons, nProtons, RecoilSpectrum, DiffRecoilSpectrumAtConstE, NuSpectrumMinE, NuSpectrumMaxE, seed+5); }