int main(int argc, char* argv[]){ if (argc != 3 && argc != 1) return 0; TH1::AddDirectory(false); gROOT->ProcessLine(".x /user2/sfarry/WJet/root/lhcbStyle.C"); if (argc == 1){ TFile* file0 = TFile::Open("root://hepgrid11.ph.liv.ac.uk///dpm/ph.liv.ac.uk/home/lhcb/electroweak/zmumu.pythia.root"); TTree* t = (TTree*)file0->Get("Zjet"); TObjArray* hists = get_mass_v_vars(t); TFile* f = new TFile("output.root","RECREATE"); hists->Write(); f->Close(); } else if (argc == 3){ char* input = argv[1]; char* output = argv[2]; TFile* f = TFile::Open(input, "READ"); TTree* t = (TTree*)f->Get("Zjet"); TObjArray *hists = 0; if ( t ) { hists = get_mass_v_vars(t); } if (hists){ TFile* g = TFile::Open(output, "RECREATE"); hists->Write(); g->Close(); } } return 0; }
/* *************************************************************************** * * * * Format: * * * * Save into a format to be used in main code * * * * *************************************************************************** */ void GeomAcc::Format(TString saveName, TString pol){ TString plotName; if(pol == "NoPol/") plotName = "GeoEff"; else if (pol == "Long/") plotName = "GeoLongEff"; else if (pol == "Trans/") plotName = "GeoTransEff"; TFile *f1 = TFile::Open("Output/" + saveName); TH2D *GeoEff2 = (TH2D*) f1->Get(plotName); GeoEff2->SetName("Geometric Acceptance"); // //hack to use existing description plot // TFile *f2 = TFile::Open("Description/" + saveName); TH1 * Descrip = (TH1*) f2->Get("Description"); TObjArray * histList = new TObjArray(0); histList->Add(GeoEff2); histList->Add(Descrip); TFile* saveFile = new TFile("Efficiency/"+ pol+ saveName, "recreate"); histList->Write(); saveFile->Close(); return; }
void DrawGlobal(TObjArray List,TFile *in, TFile *out){ TObjArray List; TCanvas *MeanTk = new TCanvas("MeanTk","MeanTk",10,10,900,500); TIFTree->Project("h0","Tracks.MeanTrack:number","Clusters.entries_all>2000"); h0->SetTitle("Number of Events with at least on Track/Total number of Events"); h0->GetXaxis()->SetTitle("Run Number"); h0->GetXaxis()->CenterTitle(1); h0->GetYaxis()->SetTitle("Fraction of Events with nTracks non zero"); h0->GetYaxis()->CenterTitle(1); h0->SetMarkerStyle(20); h0->SetStats(0); h0->Draw(); List.Add(MeanTk); TCanvas *Events = new TCanvas("Events","Events",10,10,900,500); TIFTree->Project("h3","Clusters.entries_all:number","Clusters.entries_all>2000"); h3->SetTitle("Total Number of Events"); h3->GetXaxis()->SetTitle("Run Number"); h3->GetXaxis()->CenterTitle(1); h3->GetYaxis()->SetTitle("Events"); h3->GetYaxis()->CenterTitle(1); h3->SetMarkerStyle(20); h3->SetStats(0); h3->Draw(); List.Add(Events); TCanvas *nTracks = new TCanvas("nTracks","nTracks",10,10,900,500); TIFTree->Project("h","Tracks.mean:number","Clusters.entries_all>2000"); h->SetTitle("Mean Track number per Event"); h->GetXaxis()->SetTitle("Run Number"); h->GetXaxis()->CenterTitle(1); h->GetYaxis()->SetTitle("Mean Track number per Event"); h->GetYaxis()->CenterTitle(1); h->SetMarkerStyle(20); h->SetStats(0); h->Draw(); List.Add(nTracks); TCanvas *nRecHits= new TCanvas("nRecHits","nRecHits",10,10,900,500); TIFTree->Project("h1","RecHits.mean:number","Clusters.entries_all>2000"); h1->SetTitle("Mean RecHits Number per Event"); h1->GetXaxis()->SetTitle("Run Number"); h1->GetXaxis()->CenterTitle(1); h1->GetYaxis()->SetTitle("Mean RecHits Number per Event"); h1->GetYaxis()->CenterTitle(1); h1->SetMarkerStyle(20); h1->SetStats(0); h1->Draw(); List.Add(nRecHits); TCanvas *nCluster= new TCanvas("nClusters","nClusters",10,10,900,500); TIFTree->Project("h2","Clusters.mean_corr:number","Clusters.entries_all>2000"); h2->SetTitle("Mean Number of Cluster per Event"); h2->GetXaxis()->SetTitle("Run Number"); h2->GetXaxis()->CenterTitle(1); h2->GetYaxis()->SetTitle("Mean Number of Cluster per Event"); h2->GetYaxis()->CenterTitle(1); h2->SetMarkerStyle(20); h2->SetStats(0); h2->Draw(); List.Add(nClusters); out->cd(); List.Write(); // out->Close(); in->cd(); }
/* vector<std::pair<double, double> > fit_mass(RooDataSet* ds, string oFile, string cut, string massvar = "Z0_M"){ RooRealVar m( massvar.c_str(), massvar.c_str(), 60000., 120000. ); RooPlot* plot = m.frame(); // Breit Wigner - Z Lineshape RooRealVar m0( "m0", "m0", 0 ); RooRealVar width( "width", "width", 1500, 0, 5000 ); RooBreitWigner bw( "gauss", "gauss", m, m0, width ); // Crystal-Ball - Detector response + FSR RooRealVar mean( "mean", "mean", 90300, 70000, 110000 ); RooRealVar sigma( "sigma", "sigma", 500, 0, 5000); RooRealVar alpha( "alpha", "alpha", 2.2, 0.01, 5 ); RooRealVar n( "n", "n", 0.48, 0.01, 80 ); RooCBShape cb( "cb", "cb", m, mean, sigma, alpha, n ); //exponential - DY component + background RooRealVar lambda("lambda", "slope", -2e-5, -30., 0.); RooExponential expo("expo", "exponential PDF", m, lambda); //Set cache for FFT convolution m.setBins(10000, "cache"); m.setMin("cache", 50500); m.setMax("cache", 129500); //convolve PDFs RooFFTConvPdf pdf( "pdf", "pdf", m, cb, bw ); //Background fraction RooRealVar b("b", "background", 0.7, 0, 1); RooAddPdf sum("sum", "crystal ball + gaussian + expo", RooArgList(pdf, expo), RooArgList(b)); //sum.fitTo(*ds, RooFit::Extended()); sum.fitTo(*ds); //Make mass plot TCanvas* canv = new TCanvas( "canv", "canv", 800.0, 600.0 ); plot -> GetXaxis() -> SetTitle( "M_{#mu#mu} [GeV]" ); plot -> GetYaxis() -> SetTitleOffset( 1.5 ); ds->plotOn( plot ); sum.plotOn(plot); //print chi2 on plot and add tpavetext ostringstream sstream; sstream<<"#chi^{2}/nDoF = "<<plot->chiSquare(); TPaveText* p = new TPaveText(0.15, 0.7, 0.5, 0.9, "NDC"); p->SetFillStyle(0); p->SetBorderSize(0.0); plot->addObject(p); p->AddText(cut.c_str()); p->AddText(sstream.str().c_str()); plot->Draw(); p->Draw(); canv->SaveAs( ("BWxCB_"+oFile+".pdf").c_str() ); std::vector< std::pair<double, double> > parms; // return as pair with value and error of mean parms.push_back(std::pair<double, double>(mean.getVal() , mean.getError())); parms.push_back(std::pair<double, double>(sigma.getVal() , sigma.getError())); return parms; } TObjArray* get_mass_v_vars(RooDataSet* dsUp, RooDataSet* dsDown){ //mass variable RooRealVar m( "Z0_M", "Z0_M", 60000., 120000. ); //other variables needed to make dataset int nvars = 4; string vars[] = { "muplus_ETA", "muminus_ETA", "muplus_PHI", "muminus_PHI"}; double los[] = { 2.0, 2.0, -TMath::Pi(), -TMath::Pi() }; double his[] = { 4.5, 4.5, TMath::Pi(), TMath::Pi() }; int binss[] = { 10, 10, 10, 10 }; TObjArray* hists = new TObjArray(); //fit_mass(ds, "", ""); for (int i = 0 ; i < nvars ; ++i){ string var = vars[i] ; double lo = los[i] ; double hi = his[i] ; int bins = binss[i]; vector<RooDataSet*> magup_datasets ; vector<RooDataSet*> magdown_datasets ; for (int i = 0 ; i < bins ; ++i) { ostringstream cutup, cutdown; double binlo = lo + i*((hi - lo)/bins); double binhi = lo + (i+1)*((hi-lo)/bins); cutup <<var<<">"<<binlo<<" && "<<var<<"<"<<binhi; //add dataset with specific cuts magup_datasets.push_back((RooDataSet*)dsUp->reduce(cutup.str().c_str())); magdown_datasets.push_back((RooDataSet*)dsDown->reduce(cutup.str().c_str())); } //make mass histogram TH1F* magup_hist = new TH1F(("mass_v_"+var+"_magup").c_str() , ("mass_v_"+var+"_magup").c_str() , bins, lo, hi); TH1F* magdown_hist = new TH1F(("mass_v_"+var+"_magdown").c_str() , ("mass_v_"+var+"_magdown").c_str() , bins, lo, hi); TH1F* magup_width = new TH1F(("width_v_"+var+"_magup").c_str() , ("width_v_"+var+"_magup").c_str() , bins, lo, hi); TH1F* magdown_width = new TH1F(("width_v_"+var+"_magdown").c_str() , ("width_v_"+var+"_magdown").c_str() , bins, lo, hi); //calculate latex version of variable if possible string latexvar; if (var.find("ETA") != std::string::npos) latexvar = "#eta"; else if (var.find("PHI") != std::string::npos ) latexvar = "#phi"; else latexvar = var; for (int i = 0 ; i < bins ; ++i) { ostringstream s1, s2; s1<<var<<"_magup_"<<i; s2<<var<<"_magdown_"<<i; double binlo = lo + i*((hi - lo)/bins); double binhi = lo + (i+1)*((hi-lo)/bins); //cut to be presented on plot ostringstream label; label<<binlo<<" < "<<latexvar<<" < "<<binhi; std::vector<std::pair<double, double> > magup_result = fit_mass(magup_datasets.at(i), s1.str(), label.str()); std::vector<std::pair<double, double> > magdown_result = fit_mass(magdown_datasets.at(i), s2.str(), label.str()); magup_hist->SetBinContent(i+1, magup_result.at(0).first); magup_hist->SetBinError(i+1, magup_result.at(0).second); magdown_hist->SetBinContent(i+1, magdown_result.at(0).first); magdown_hist->SetBinError(i+1, magdown_result.at(0).second); magup_width->SetBinContent(i+1, magup_result.at(1).first); magup_width->SetBinError(i+1, magup_result.at(1).second); magdown_width->SetBinContent(i+1, magdown_result.at(1).first); magdown_width->SetBinError(i+1, magdown_result.at(1).second); } TCanvas* canv = new TCanvas( "canv", "canv", 800.0, 600.0 ); magup_hist->SetXTitle(latexvar.c_str()); magup_hist->SetYTitle("Fitted Z0 Mass"); magdown_hist->SetMarkerColor(2); magdown_hist->SetMarkerStyle(2); magup_hist->Draw("e1"); magdown_hist->Draw("e1same"); canv->SaveAs(("mass_v_"+var+".pdf").c_str()); hists->Add(magup_hist); hists->Add(magdown_hist); hists->Add(magup_width); hists->Add(magdown_width); } return hists; } TObjArray* get_mass_v_vars(TTree* t){ TCut cut("muminus_PT > 20000 && muplus_PT > 20000 && muplus_ETA > 2.0 && muplus_ETA < 4.5 && muminus_ETA > 2.0 && muminus_ETA < 4.5 && Z0_M > 60000 && Z0_M < 120000"); //mass variable RooRealVar m( "Z0_M", "Z0_M", 60000., 120000. ); //other variables needed to make dataset RooRealVar pt1("muplus_PT" , "muplus_PT" , 20000, 1000000); RooRealVar pt2("muminus_PT" , "muminus_PT" , 20000, 1000000); RooRealVar eta1("muplus_ETA" , "muplus_ETA" , 2, 4.5); RooRealVar eta2("muminus_ETA", "muminus_ETA" , 2, 4.5); RooRealVar phi1("muplus_PHI" , "muplus_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar phi2("muminus_PHI", "muminus_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar polarity("Polarity", "Polarity", -2, 2); TFile f("temp.root","RECREATE"); TTree* upTree = (TTree*)t->CopyTree("Polarity > 0"); TTree* downTree = (TTree*)t->CopyTree("Polarity < 0"); cout<<"Number of entries in trees: "<<t->GetEntries()<<" "<<upTree->GetEntries()<<" "<<downTree->GetEntries()<<endl; RooDataSet* dsUp = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*upTree), RooFit::Cut(cut.GetTitle())); RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*downTree), RooFit::Cut(cut.GetTitle())); cout<<"Number of entries in datasets: "<<dsUp->sumEntries()<<" "<<dsDwn->sumEntries()<<endl; TObjArray* hists = get_mass_v_vars(dsUp, dsDwn); return hists; } TObjArray* get_mass_v_vars(TTree* t, TTree* u){ TCut cut("muminus_PT > 20000 && muplus_PT > 20000 && muplus_ETA > 2.0 && muplus_ETA < 4.5 && muminus_ETA > 2.0 && muminus_ETA < 4.5 && Z0_M > 60000 && Z0_M < 120000"); //mass variable RooRealVar m( "Z0_M", "Z0_M", 60000., 120000. ); //other variables needed to make dataset RooRealVar pt1("muplus_PT" , "muplus_PT" , 20000, 1000000); RooRealVar pt2("muminus_PT" , "muminus_PT" , 20000, 1000000); RooRealVar eta1("muplus_ETA" , "muplus_ETA" , 2, 4.5); RooRealVar eta2("muminus_ETA", "muminus_ETA" , 2, 4.5); RooRealVar phi1("muplus_PHI" , "muplus_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar phi2("muminus_PHI", "muminus_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar polarity("Polarity", "Polarity", -2, 2); RooDataSet* dsUp = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*t), RooFit::Cut(cut.GetTitle())); RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*u), RooFit::Cut(cut.GetTitle())); cout<<"Number of entries in datasets: "<<dsUp->sumEntries()<<" "<<dsDwn->sumEntries()<<endl; TObjArray* hists = get_mass_v_vars(dsUp, dsDwn); return hists; } TObjArray* get_refit_mass_v_vars(RooDataSet* dsUp, RooDataSet* dsDown){ //As previous function with refit //should be merged RooRealVar m( "Z0_Refit_M", "Z0_Refit_M", 60000., 120000. ); RooRealVar eta1("muplus_Refit_ETA" , "muplus_Refit_ETA" , 2, 4.5); RooRealVar eta2("muminus_Refit_ETA", "muminus_Refit_ETA" , 2, 4.5); RooRealVar phi1("muplus_Refit_PHI" , "muplus_Refit_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar phi2("muminus_Refit_PHI", "muminus_Refit_PHI" , -TMath::Pi(), TMath::Pi()); int nvars = 4; string vars[] = {"muplus_Refit_ETA", "muminus_Refit_ETA", "muplus_Refit_PHI", "muminus_Refit_PHI"}; double los[] = {2.0, 2.0, -TMath::Pi(), -TMath::Pi()}; double his[] = {4.5, 4.5, TMath::Pi(), TMath::Pi()}; int binss[] = {10, 10, 10, 10}; TObjArray* hists = new TObjArray(); for (int i = 0 ; i < nvars ; ++i){ string var = vars[i]; double lo = los[i]; double hi = his[i]; int bins = binss[i]; vector<RooDataSet*> magup_datasets; vector<RooDataSet*> magdown_datasets; for (int i = 0 ; i < bins ; ++i) { ostringstream cutup, cutdown; double binlo = lo + i*((hi - lo)/bins); double binhi = lo + (i+1)*((hi-lo)/bins); cutup <<var<<">"<<binlo<<" && "<<var<<"<"<<binhi ; cutdown<<var<<">"<<binlo<<" && "<<var<<"<"<<binhi; //add dataset with specific cuts magup_datasets.push_back((RooDataSet*)dsUp->reduce(cutup.str().c_str())); magdown_datasets.push_back((RooDataSet*)dsDown->reduce(cutdown.str().c_str())); } TH1F* magup_hist = new TH1F(("mass_v_"+var+"_refit_magup").c_str() , ("mass_v_"+var+"_refit_magup").c_str(), bins, lo, hi); TH1F* magdown_hist = new TH1F(("mass_v_"+var+"_refit_magdown").c_str(), ("mass_v_"+var+"_refit_magdown").c_str(), bins, lo, hi); TH1F* magup_width = new TH1F(("width_v_"+var+"_refit_magup").c_str() , ("width_v_"+var+"_refit_magup").c_str() , bins, lo, hi); TH1F* magdown_width = new TH1F(("width_v_"+var+"_refit_magdown").c_str() , ("width_v_"+var+"_refit_magdown").c_str() , bins, lo, hi); string latexvar; if (var.find("ETA") != std::string::npos) latexvar = "#eta"; else if (var.find("PHI") != std::string::npos ) latexvar = "#phi"; else latexvar = var; for (int i = 0 ; i < bins ; ++i) { ostringstream s1, s2; s1<<var<<"_refit_magup_"<<i; s2<<var<<"_refit_magdown_"<<i; double binlo = lo + i*((hi - lo)/bins); double binhi = lo + (i+1)*((hi-lo)/bins); //cut to be presented on plot ostringstream label; label<<binlo<<" < "<<latexvar<<" < "<<binhi; std::vector< std::pair<double, double> > magup_result = fit_mass(magup_datasets.at(i), s1.str(), label.str(), "Z0_Refit_M"); std::vector< std::pair<double, double> > magdown_result = fit_mass(magdown_datasets.at(i), s1.str(), label.str(), "Z0_Refit_M"); magup_hist->SetBinContent (i+1, magup_result.at(0).first); magup_hist->SetBinError (i+1, magup_result.at(0).second); magdown_hist->SetBinContent (i+1, magdown_result.at(0).first); magdown_hist->SetBinError (i+1, magdown_result.at(0).second); magup_width->SetBinContent (i+1, magup_result.at(1).first); magup_width->SetBinError (i+1, magup_result.at(1).second); magdown_width->SetBinContent(i+1, magdown_result.at(1).first); magdown_width->SetBinError (i+1, magdown_result.at(1).second); } TCanvas* canv = new TCanvas( "canv", "canv", 800.0, 600.0 ); magup_hist->SetXTitle(latexvar.c_str()); magup_hist->SetYTitle("Fitted Z0 Mass"); magdown_hist->SetLineColor(2); magdown_hist->SetMarkerColor(2); magdown_hist->SetMarkerStyle(20); magup_hist->Draw("e1"); magdown_hist->Draw("e1same"); canv->SaveAs(("mass_v_"+var+"_refit.pdf").c_str()); hists->Add(magup_hist); hists->Add(magdown_hist); hists->Add(magup_width); hists->Add(magdown_width); } return hists; } TObjArray* get_refit_mass_v_vars(TTree* t){ // As previous function with refit // should be merged TCut cut("muminus_Refit_PT > 20000 && muplus_Refit_PT > 20000 && muplus_Refit_ETA > 2.0 && muplus_Refit_ETA < 4.5 && muminus_Refit_ETA > 2.0 && muminus_Refit_ETA < 4.5 && Z0_Refit_M > 60000 && Z0_Refit_M < 120000"); RooRealVar m( "Z0_Refit_M", "Z0_Refit_M", 60000., 120000. ); RooRealVar pt1("muplus_Refit_PT" , "muplus_Refit_PT" , 20000, 1000000); RooRealVar pt2("muminus_Refit_PT" , "muminus_Refit_PT" , 20000, 1000000); RooRealVar eta1("muplus_Refit_ETA" , "muplus_Refit_ETA" , 2, 4.5); RooRealVar eta2("muminus_Refit_ETA", "muminus_Refit_ETA" , 2, 4.5); RooRealVar phi1("muplus_Refit_PHI" , "muplus_Refit_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar phi2("muminus_Refit_PHI", "muminus_Refit_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar polarity("Polarity", "Polarity", -2, 2); TFile* g = new TFile("temp.root", "RECREATE"); TTree* upTree = (TTree*)t->CopyTree("Polarity > 0"); TTree* dwnTree = (TTree*)t->CopyTree("Polarity < 0"); RooDataSet* dsUp = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*upTree), RooFit::Cut(cut.GetTitle())); RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*dwnTree), RooFit::Cut(cut.GetTitle())); return get_refit_mass_v_vars(dsUp, dsDwn); } TObjArray* get_refit_mass_v_vars(TTree* t, TTree* u){ // As previous function with refit // should be merged TCut cut("muminus_Refit_PT > 20000 && muplus_Refit_PT > 20000 && muplus_Refit_ETA > 2.0 && muplus_Refit_ETA < 4.5 && muminus_Refit_ETA > 2.0 && muminus_Refit_ETA < 4.5 && Z0_Refit_M > 60000 && Z0_Refit_M < 120000"); RooRealVar m( "Z0_Refit_M", "Z0_Refit_M", 60000., 120000. ); RooRealVar pt1("muplus_Refit_PT" , "muplus_Refit_PT" , 20000, 1000000); RooRealVar pt2("muminus_Refit_PT" , "muminus_Refit_PT" , 20000, 1000000); RooRealVar eta1("muplus_Refit_ETA" , "muplus_Refit_ETA" , 2, 4.5); RooRealVar eta2("muminus_Refit_ETA", "muminus_Refit_ETA" , 2, 4.5); RooRealVar phi1("muplus_Refit_PHI" , "muplus_Refit_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar phi2("muminus_Refit_PHI", "muminus_Refit_PHI" , -TMath::Pi(), TMath::Pi()); RooRealVar polarity("Polarity", "Polarity", -2, 2); RooDataSet* dsUp = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*t), RooFit::Cut(cut.GetTitle())); RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*u), RooFit::Cut(cut.GetTitle())); return get_refit_mass_v_vars(dsUp, dsDwn); } int main(int argc, char* argv[]){ if (argc != 3 && argc != 1 && argc != 4) return 0; TH1::AddDirectory(false); gROOT->ProcessLine(".x /user2/sfarry/WJet/root/lhcbStyle.C"); if (argc == 1){ TFile* file0 = TFile::Open("root://hepgrid11.ph.liv.ac.uk///dpm/ph.liv.ac.uk/home/lhcb/refit/ZMuMu.Refit.2015.root"); TTree* t = (TTree*)file0->Get("ZMuMu/DecayTree"); TObjArray* hists = get_mass_v_vars(t); TObjArray* refit_hists = get_refit_mass_v_vars(t); TFile* f = new TFile("test.root","RECREATE"); hists->Write(); refit_hists->Write(); f->Close(); } else if (argc == 3){ char* input = argv[1]; char* output = argv[2]; TFile* f = TFile::Open(input, "READ"); RooDataSet* dsUp = (RooDataSet*)f->Get("dataup"); RooDataSet* dsDown = (RooDataSet*)f->Get("datadown"); TTree* t = (TTree*)f->Get("ZMuMu/DecayTree"); TObjArray* branches = t->GetListOfBranches(); bool has_refit = false; for (int i = 0 ; i < branches->GetEntries() ; ++i){ TBranch* branch = (TBranch*)branches->At(i); string name = branch->GetName(); //if (strncmp((name, "boson", 5) == 0){ if (name.find("boson") == 0){ std::string replace = name.replace(0, 5, "Z0"); branch->SetNameTitle(replace.c_str(), replace.c_str()); } if (name.find("Refit") != std::string::npos) has_refit = true; } TObjArray *hists = 0; TObjArray *refit_hists = 0; if ( dsUp && dsDown ) { hists = get_mass_v_vars(dsUp, dsDown); refit_hists = get_refit_mass_v_vars(dsUp, dsDown); } else if ( t ) { hists = get_mass_v_vars(t); if (has_refit) refit_hists = get_refit_mass_v_vars(t); } if (hists){ TFile* g = TFile::Open(output, "RECREATE"); hists->Write(); if (refit_hists) refit_hists->Write(); g->Close(); } } else if (argc == 4){ char* inputUp = argv[1]; char* inputDown = argv[2]; char* output = argv[3]; TFile* f = TFile::Open(inputUp, "READ"); TFile* g = TFile::Open(inputDown, "READ"); TTree* t = (TTree*)f->Get("ZMuMu/DecayTree"); TTree* u = (TTree*)g->Get("ZMuMu/DecayTree"); cout<<t<<" "<<u<<endl; cout<<"okay so far"<<endl; TObjArray* branches = t->GetListOfBranches(); cout<<"got list of branches"<<endl; bool has_refit = false; for (int i = 0 ; i < branches->GetEntries() ; ++i){ TBranch* branch = (TBranch*)branches->At(i); string name = branch->GetName(); //if (strncmp((name, "boson", 5) == 0){ if (name.find("boson") == 0){ std::string replace = name.replace(0, 5, "Z0"); branch->SetNameTitle(replace.c_str(), replace.c_str()); } if (name.find("Refit") != std::string::npos) has_refit = true; } branches = u->GetListOfBranches(); for (int i = 0 ; i < branches->GetEntries() ; ++i){ TBranch* branch = (TBranch*)branches->At(i); string name = branch->GetName(); //if (strncmp((name, "boson", 5) == 0){ if (name.find("boson") == 0){ std::string replace = name.replace(0, 5, "Z0"); branch->SetNameTitle(replace.c_str(), replace.c_str()); } if (name.find("Refit") != std::string::npos) has_refit = true; } cout<<"renamed branches"<<endl; TObjArray *hists = 0; TObjArray *refit_hists = 0; if ( t && u ) { hists = get_mass_v_vars(t, u); if (has_refit) refit_hists = get_refit_mass_v_vars(t, u); } if (hists){ TFile* g = TFile::Open(output, "RECREATE"); hists->Write(); if (refit_hists) refit_hists->Write(); g->Close(); } } return 0; } */ int main(int argc, char* argv[]){ if (argc != 3 && argc != 1 && argc != 4) return 0; TH1::AddDirectory(false); gROOT->ProcessLine(".x /user2/sfarry/Analyses/WJet/root/lhcbStyle.C"); Fitter z0_2015; z0_2015.fitvar="Z0_M"; z0_2015.fitmodel = Fitter::z0; z0_2015.lo = 60000.; z0_2015.hi = 120000; z0_2015.vars = {"muplus_ETA", "muminus_ETA", "muplus_PHI", "muminus_PHI"}; z0_2015.los = {2.0, 2.0, -TMath::Pi(), -TMath::Pi() }; z0_2015.his = {4.5, 4.5, TMath::Pi(), TMath::Pi() }; z0_2015.bins = { 10, 10, 10, 10 }; z0_2015.vars2d = { {"muplus_ETA", "muplus_PHI"}, {"muminus_ETA", "muminus_PHI"} }; z0_2015.los2d = { {2.0, -TMath::Pi()}, {2.0, -TMath::Pi()} }; z0_2015.his2d = { {4.5, TMath::Pi()}, {4.5, TMath::Pi()} }; z0_2015.bins2d = { {5, 5}, {5, 5} }; Fitter z0_2015_refit; z0_2015_refit.fitvar="Z0_Refit_M"; z0_2015_refit.fitmodel = Fitter::z0; z0_2015_refit.lo = 60000.; z0_2015_refit.hi = 120000; z0_2015_refit.vars = {"muplus_Refit_ETA", "muminus_Refit_ETA", "muplus_Refit_PHI", "muminus_Refit_PHI"}; z0_2015_refit.los = {2.0, 2.0, -TMath::Pi(), -TMath::Pi()}; z0_2015_refit.his = {4.5, 4.5, TMath::Pi(), TMath::Pi()}; z0_2015_refit.bins = {10, 10, 10, 10}; z0_2015_refit.vars2d = { {"muplus_Refit_ETA", "muplus_Refit_PHI"}, {"muminus_Refit_ETA", "muminus_Refit_PHI"} }; z0_2015_refit.los2d = { {2.0, -TMath::Pi()}, {2.0, -TMath::Pi()} }; z0_2015_refit.his2d = { {4.5, TMath::Pi()}, {4.5, TMath::Pi()} }; z0_2015_refit.bins2d = { {5, 5}, {5, 5} }; string input = "root://hepgrid11.ph.liv.ac.uk///dpm/ph.liv.ac.uk/home/lhcb/refit/ZMuMu.Refit.2015.root"; string output = "output.root"; if (argc > 1){ input = argv[1]; } if (argc > 2){ output = argv[2]; } TFile* f = TFile::Open(input.c_str(), "READ"); RooDataSet* dsUp = (RooDataSet*)f->Get("dsUp"); RooDataSet* dsDown = (RooDataSet*)f->Get("dsDown"); RooDataSet* dsUp_Refit = (RooDataSet*)f->Get("dsUp_Refit"); RooDataSet* dsDown_Refit = (RooDataSet*)f->Get("dsDown_Refit"); TObjArray *hists = 0; TObjArray *refit_hists = 0; if ( dsUp && dsDown && dsUp_Refit && dsDown_Refit ) { hists = z0_2015.get_mass_v_vars(dsUp); refit_hists = z0_2015_refit.get_mass_v_vars(dsUp_Refit); } if (hists){ TFile* g = TFile::Open(output.c_str(), "RECREATE"); hists->Write(); if (refit_hists) refit_hists->Write(); g->Close(); } return 0; }
//------------------------------------------------------------------------------------------------------------------------------------------- void ComparisonDataMC(TString fileNameData = "Data/efficiency_new.root", TString fileNameSim ="MonteCarlo/efficiency_new.root", Bool_t integrated = kFALSE) { // Open input Data files TFile *fileData = new TFile(fileNameData.Data(), "read"); if (!fileData || !fileData->IsOpen()) { printf("cannot open file %s \n",fileNameData.Data()); return; } // Open input Sim files TFile *fileSim = new TFile(fileNameSim.Data(), "read"); if (!fileSim || !fileSim->IsOpen()) { printf("cannot open file %s \n",fileNameSim.Data()); return; } TString hname = integrated ? "integratedTracking" : "tracking"; // Get Global Data and Sim graphs // TGraphAsymmErrors *effVScentData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny("trackingEffVscentrality")); // if (!effVScentData) { // printf("Efficiency vs centrality from data not found\n"); // return; // } // TGraphAsymmErrors *effVScentSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny("trackingEffVscentrality")); // if (!effVScentSim) { // printf("Efficiency vs centrality from sim not found\n"); // return; // } TGraphAsymmErrors *effVSrunData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny("trackingEffVsRun")); if (!effVSrunData) { printf("Efficiency vs run from data not found\n"); return; } TGraphAsymmErrors *effVSrunSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny("trackingEffVsRun")); if (!effVSrunSim) { printf("Efficiency vs run from sim not found\n"); return; } TGraphAsymmErrors *effVSyData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny(Form("%sEffVsy",hname.Data()))); if (!effVSyData) { printf("Efficiency vs rapidity from data not found\n"); return; } TGraphAsymmErrors *effVSySim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny(Form("%sEffVsy",hname.Data()))); if (!effVSySim) { printf("Efficiency vs rapidity from sim not found\n"); return; } TGraphAsymmErrors *effVSptData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny(Form("%sEffVspt",hname.Data()))); if (!effVSptData) { printf("Efficiency vs pt from data not found\n"); return; } TGraphAsymmErrors *effVSptSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny(Form("%sEffVspt",hname.Data()))); if (!effVSptSim) { printf("Efficiency vs pt from sim not found\n"); return; } TGraphAsymmErrors *effVSphiData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny(Form("%sEffVsphi",hname.Data()))); if (!effVSphiData) { printf("Efficiency vs phi from data not found\n"); return; } TGraphAsymmErrors *effVSphiSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny(Form("%sEffVsphi",hname.Data()))); if (!effVSphiSim) { printf("Efficiency vs phi from sim not found\n"); return; } // Create an array list with the global ratios TObjArray globalRatios; // Create an array with the global plots of the individual efficencies and the ratios TObjArray globalRatiosAndEff; // globalRatios.Add(CreateRatioGraph("RatioEffVsCent","data/sim tracking efficiency versus centrality",effVScentData,effVScentSim)); //---- Eff vs run TGraphAsymmErrors* effVSrunDataCopy = static_cast<TGraphAsymmErrors*>(effVSrunData->Clone()); // We make clones to do not modify them TGraphAsymmErrors* effVSrunSimCopy = static_cast<TGraphAsymmErrors*>(effVSrunSim->Clone()); TGraphAsymmErrors *ratioRun = CreateRatioGraph("RatioEffVsRun","data/sim tracking efficiency versus run",*effVSrunData,*effVSrunSim); globalRatios.Add(ratioRun); TGraphAsymmErrors* ratioRunCopy = static_cast<TGraphAsymmErrors*>(ratioRun->Clone()); globalRatiosAndEff.Add(DrawRatio("RatioEffVSRunAndEff","Comparison Data&MC tracking efficiency versus run", effVSrunDataCopy,effVSrunSimCopy,ratioRunCopy)); //----- //---- Eff vs y TGraphAsymmErrors* effVSyDataCopy = static_cast<TGraphAsymmErrors*>(effVSyData->Clone()); // We make clones to do not modify them TGraphAsymmErrors* effVSySimCopy = static_cast<TGraphAsymmErrors*>(effVSySim->Clone()); TGraphAsymmErrors *ratioY = CreateRatioGraph("RatioEffVsY","data/sim tracking efficiency versus rapidity",*effVSyData,*effVSySim); globalRatios.Add(ratioY); TGraphAsymmErrors* ratioYCopy = static_cast<TGraphAsymmErrors*>(ratioY->Clone()); globalRatiosAndEff.Add(DrawRatio("RatioEffVSyAndEff","Comparison Data&MC tracking efficiency versus rapidity", effVSyDataCopy,effVSySimCopy,ratioYCopy)); //----- //-----Eff vs Pt TGraphAsymmErrors* effVSptDataCopy = static_cast<TGraphAsymmErrors*>(effVSptData->Clone()); // We make clones to do not modify them TGraphAsymmErrors* effVSptSimCopy = static_cast<TGraphAsymmErrors*>(effVSptSim->Clone()); TGraphAsymmErrors *ratioPt = CreateRatioGraph("RatioEffVsPt","data/sim tracking efficiency versus Pt",*effVSptData,*effVSptSim); globalRatios.Add(ratioPt); TGraphAsymmErrors* ratioPtCopy = static_cast<TGraphAsymmErrors*>(ratioPt->Clone()); globalRatiosAndEff.Add(DrawRatio("RatioEffVSptAndEff","Comparison Data&MC tracking efficiency versus Pt",effVSptDataCopy,effVSptSimCopy,ratioPtCopy)); //----- //----Eff vs phi TGraphAsymmErrors* effVSphiDataCopy = static_cast<TGraphAsymmErrors*>(effVSphiData->Clone()); // We make clones to do not modify them TGraphAsymmErrors* effVSphiSimCopy = static_cast<TGraphAsymmErrors*>(effVSphiSim->Clone()); TGraphAsymmErrors *ratioPhi = CreateRatioGraph("RatioEffVsPhi","data/sim tracking efficiency versus phi",*effVSphiData,*effVSphiSim); globalRatios.Add(ratioPhi); TGraphAsymmErrors* ratioPhiCopy = static_cast<TGraphAsymmErrors*>(ratioPhi->Clone()); globalRatiosAndEff.Add(DrawRatio("RatioEffVSphiAndEff","Comparison Data&MC tracking efficiency versus phi",effVSphiDataCopy,effVSphiSimCopy,ratioPhiCopy)); //------- //----Eff vs y vs phi TH2F *effVSyVSphiData = static_cast<TH2F*>(fileData->FindObjectAny("trackingEffVsphi-y")); if (!effVSyVSphiData) { printf("Efficiency vs rapidity vs phi from data not found\n"); return; } TH2F *effVSyVSphiSim = static_cast<TH2F*>(fileSim->FindObjectAny("trackingEffVsphi-y")); if (!effVSyVSphiSim) { printf("Efficiency vs rapidity vs phi from sim not found\n"); return; } Int_t nBins2dX = effVSyVSphiData->GetXaxis()->GetNbins(); Int_t nBins2dY = effVSyVSphiData->GetYaxis()->GetNbins(); Double_t effData2D,effSim2D,ratio2D; TH2F *effVSphiVSyRatio = new TH2F("RatioEffVSphiVSy","EffData/EffSim vs phi vs y",nBins2dX, effVSyVSphiData->GetXaxis()->GetBinLowEdge(1), effVSyVSphiData->GetXaxis()->GetBinUpEdge(nBins2dX),nBins2dY, effVSyVSphiData->GetYaxis()->GetBinLowEdge(1), effVSyVSphiData->GetYaxis()->GetBinUpEdge(nBins2dY)); effVSphiVSyRatio->GetXaxis()->SetTitle("phi"); effVSphiVSyRatio->GetYaxis()->SetTitle("y"); for (Int_t i = 1 ; i <= nBins2dX ; i++ ) { for (Int_t j = 1 ; j <= nBins2dY ; j++ ) { effData2D = effVSyVSphiData->GetBinContent(i,j); effSim2D = effVSyVSphiSim->GetBinContent(i,j); if (effData2D > 0. && effSim2D > 0.) { ratio2D = effData2D/effSim2D; // ratio2DErrh = rat*TMath::Sqrt(effDErrh*effDErrh/effD*effD + effSErrl*effSErrl/effS*effS); // ratio2DErrl = rat*TMath::Sqrt(effDErrl*effDErrl/effD*effD + effSErrh*effSErrh/effS*effS); } if (effData2D == 0 && effSim2D == 0) { ratio2D = 1.; // ratio2DErrh = 0.; // ratio2DErrl = 0.; } if (effData2D == 0 && effSim2D > 0.) { ratio2D = 0.; // ratio2DErrh = 0.; // ratio2DErrl = 0.; } if (effData2D > 0. && effSim2D == 0) { ratio2D = 2.; // ratio2DErrh = 0.; // ratio2DErrl = 0.; } effVSphiVSyRatio->SetBinContent(i,j,ratio2D); } } TH2F *effVSphiVSyRatioRapBins = new TH2F(); effVSphiVSyRatioRapBins->GetXaxis()->SetTitle("phi"); effVSphiVSyRatioRapBins->GetYaxis()->SetTitle("y"); effVSphiVSyRatioRapBins->SetName("RatioEffVSphiVSyRapBins"); effVSphiVSyRatioRapBins->SetTitle("EffData/EffSim vs phi vs y"); Int_t nxBins = effVSphiVSyRatio->GetXaxis()->GetNbins(); Int_t nyBins = effVSphiVSyRatio->GetYaxis()->GetNbins(); Double_t xBinEdge[nxBins+1]; Double_t yBinEdge[nyBins+1]; for (Int_t ybin = 0 ; ybin <= nyBins ; ybin++) { yBinEdge[ybin] = 2*TMath::ATan(TMath::Exp((effVSphiVSyRatio->GetYaxis()->GetBinLowEdge(ybin+1)))); } for (Int_t xbin = 0 ; xbin <= nxBins ; xbin++) { xBinEdge[xbin] = effVSphiVSyRatio->GetXaxis()->GetBinLowEdge(xbin+1); } effVSphiVSyRatioRapBins->SetBins(nxBins,xBinEdge,nyBins,yBinEdge); for (Int_t xbin = 1 ; xbin <= nxBins ; xbin++) { for (Int_t ybin = 1 ; ybin <= nyBins ; ybin++) { effVSphiVSyRatioRapBins->SetBinContent(xbin,ybin,effVSphiVSyRatio->GetBinContent(xbin,ybin)); } } globalRatiosAndEff.Add(effVSphiVSyRatio); globalRatiosAndEff.Add(effVSphiVSyRatioRapBins); //-------- TString hname2 = integrated ? "IntegratedChamber" : "Chamber"; // Get Chamber and DE Data and Sim graphs // TObjArray *listChEffVSrunData = static_cast<TObjArray*>(fileData->FindObjectAny("ChambersEffVSrun")); // if (!listChEffVSrunData) { // printf("list of Chamber efficiencies vs run from data not found\n"); // return; // } // TObjArray *listChEffVSrunSim = static_cast<TObjArray*>(fileSim->FindObjectAny("ChambersEffVSrun")); // if (!listChEffVSrunSim) { // printf("list of Chamber efficiencies vs run from sim not found\n"); // return; // } TObjArray *listChEffVSDEData = static_cast<TObjArray*>(fileData->FindObjectAny(Form("%sEffVsDE",hname2.Data()))); if (!listChEffVSDEData) { printf("list of Chamber efficiencies per DE from data not found\n"); return; } TObjArray *listChEffVSDESim = static_cast<TObjArray*>(fileSim->FindObjectAny(Form("%sEffVsDE",hname2.Data()))); if (!listChEffVSDESim) { printf("list of Chamber efficiencies per DE from sim not found\n"); return; } // TObjArray *listDEEffVSrunData = static_cast<TObjArray*>(fileData->FindObjectAny("DEEffVSrun")); // if (!listDEEffVSrunData) { // printf("list of DE efficiencies vs run from data not found\n"); // return; // } // TObjArray *listDEEffVSrunSim = static_cast<TObjArray*>(fileSim->FindObjectAny("DEEffVSrun")); // if (!listDEEffVSrunSim) { // printf("list of DE efficiencies vs run from sim not found\n"); // return; // } // Graph for global efficiency vs run TGraphAsymmErrors* gData ;//= static_cast<TGraphAsymmErrors*>(listChEffVSrunData->At(0)); TGraphAsymmErrors* gSim ;//= static_cast<TGraphAsymmErrors*>(listChEffVSrunSim->At(0)); //----Eff vs run // TGraphAsymmErrors *ratioEffvsrRun = CreateRatioGraph("RatioEffVsRun","data/sim tracking efficiency versus run",*gData,*gSim); // globalRatios.Add(ratioEffvsrRun); // // TGraphAsymmErrors* ratioEffvsrRunCopy = static_cast<TGraphAsymmErrors*>(ratioEffvsrRun->Clone()); // // globalRatiosAndEff.Add(DrawRatio("RatioEffVsRunAndEff","Comparison Data&MC tracking efficiency versus run",gData,gSim,ratioEffvsrRunCopy)); //------- //globalRatios.Add(CreateRatioGraph("RatioEffVsRun","data/sim tracking efficiency versus run",*gData,*gSim)); // Create a list with the Chamber and DE ratios // TObjArray chamberVSrunRatios; // TObjArray deVSrunRatios; TObjArray chamberVSdeRatios; // TObjArray chamberVSrunRatiosAndEff; // TObjArray deVSrunRatiosAndEff; TObjArray chamberVSdeRatiosAndEff; // Compute the ratios for Chamber vs run // for (Int_t nList = 1 ; nList < listChEffVSrunData->GetEntries() ; nList++) // { // gData = static_cast<TGraphAsymmErrors*>(listChEffVSrunData->At(nList)); // gSim = static_cast<TGraphAsymmErrors*>(listChEffVSrunSim->At(nList)); // if (!gData || !gSim ) // { // printf("Error readig from Chamber efficiency vs run list \n"); // return; // } // //----Eff of Chs vs run // TString name = Form("RatioEffCh%dVsRun",nList); TString title = Form("Chamber %d data/sim tracking efficiency versus run",nList); // // TGraphAsymmErrors *ratioEffChVsrRun = CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim); // chamberVSrunRatios.Add(ratioEffChVsrRun); // // TGraphAsymmErrors* ratioEffChVsrRunCopy = static_cast<TGraphAsymmErrors*>(ratioEffChVsrRun->Clone()); // // TString nameRatio = Form("RatioEffCh%dVsRunAndEff",nList); TString titleRatio = Form("Comparison Data&MC Ch%d tracking efficiency versus run",nList); // chamberVSrunRatiosAndEff.Add(DrawRatio(nameRatio.Data(),titleRatio.Data(),gData,gSim,ratioEffChVsrRunCopy)); // //------- // // //// chamberVSrunRatios.Add(CreateRatioGraph(,,*gData,*gSim)); // // } //Load the mapping for the DE histos AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB"); AliCDBManager::Instance()->SetRun(0); AliMUONCDB::LoadMapping(); AliMpDEIterator deit; // Loop over Chambers for (Int_t ich = 0 ; ich < 10 ; ich++) { // Compute the ratios for DE vs run deit.First(ich); // while ( !deit.IsDone() ) // { // TString currentDEName = Form("EffDE%dVSrun",deit.CurrentDEId()); // gData = static_cast<TGraphAsymmErrors*>(listDEEffVSrunData->FindObject(currentDEName.Data())); // gSim = static_cast<TGraphAsymmErrors*>(listDEEffVSrunSim->FindObject(currentDEName.Data())); // // TString name = Form("RatioEffDE%dVsRun",deit.CurrentDEId()); TString title = Form("DE %d data/sim tracking efficiency versus run",deit.CurrentDEId()); // if (!gData || !gSim ) // { // printf("Error readig from DE efficiency vs run list \n"); // return; // } // //----Eff of DEs vs run // TGraphAsymmErrors *ratioEffDEvsRun = CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim); // deVSrunRatios.Add(ratioEffDEvsRun); // // TGraphAsymmErrors* ratioEffDEvsRunCopy = static_cast<TGraphAsymmErrors*>(ratioEffDEvsRun->Clone()); // // TString nameRatio = Form("RatioEffDE%dVsRunAndEff",deit.CurrentDEId()); TString titleRatio = Form("Comparison Data&MC DE%d tracking efficiency versus run",deit.CurrentDEId()); // deVSrunRatiosAndEff.Add(DrawRatio(nameRatio.Data(),titleRatio.Data(),gData,gSim,ratioEffDEvsRunCopy)); // //------- // //// deVSrunRatios.Add(CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim)); // // deit.Next(); // } // Compute the ratios for Ch vs DE TString hname3 = integrated ? "integratedEff" : "eff"; gData = static_cast<TGraphAsymmErrors*>(listChEffVSDEData->FindObject(Form("%sCh%dVsDE",hname3.Data(),ich+1))); gSim = static_cast<TGraphAsymmErrors*>(listChEffVSDESim->FindObject(Form("%sCh%dVsDE",hname3.Data(),ich+1))); if (!gData || !gSim ) { printf("Error reading from Chamber efficiency per DE list \n"); return; } TString name = Form("RatioEffCh%dVsDE",ich+1); TString title = Form("Chamber %d data/sim tracking efficiency versus DE",ich+1); //----Eff of CHs vs DE TGraphAsymmErrors *ratioEffChvsDE = CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim); chamberVSdeRatios.Add(ratioEffChvsDE); TGraphAsymmErrors* ratioEffChvsDECopy = static_cast<TGraphAsymmErrors*>(ratioEffChvsDE->Clone()); TString nameRatio = Form("RatioEffCh%dVsDEAndEff",ich+1); TString titleRatio = Form("Comparison Data&MC Ch%d tracking efficiency versus DE",ich+1); chamberVSdeRatiosAndEff.Add(DrawRatio(nameRatio.Data(),titleRatio.Data(),gData,gSim,ratioEffChvsDECopy)); //------- // chamberVSdeRatios.Add(CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim)); } //Beautify graphs BeautifyGraphs(globalRatios,"EffData/EffSim"); // BeautifyGraphs(deVSrunRatios,"EffData/EffSim"); // BeautifyGraphs(chamberVSrunRatios,"EffData/EffSim"); BeautifyGraphs(chamberVSdeRatios,"EffData/EffSim"); // BeautifyGraphs(globalRatiosAndEff,"EffData/EffSim"); // BeautifyGraphs(deVSrunRatiosAndEff,"EffData/EffSim"); // BeautifyGraphs(chamberVSrunRatiosAndEff,"EffData/EffSim"); // BeautifyGraphs(chamberVSdeRatiosAndEff,"EffData/EffSim"); // set bin labels // SetRunLabel(deVSrunRatios,irun,runs); // SetRunLabel(chamberVSrunRatios,irun,runs); // SetRunLabel(globalRatios,irun,runs,1); //Write it in such a way the number is the position on the list of the graph you want to label // // save output TFile* file = new TFile("EffComparison.root","update"); globalRatios.Write("GlobalEffRatios", TObject::kOverwrite | TObject::kSingleKey); // chamberVSrunRatios.Write("ChambersEffVSrunRatios", TObject::kOverwrite | TObject::kSingleKey); // deVSrunRatios.Write("DEEffVSrunRatios", TObject::kOverwrite | TObject::kSingleKey); chamberVSdeRatios.Write("ChamberEffperDERatios", TObject::kOverwrite | TObject::kSingleKey); globalRatiosAndEff.Write("GlobalEffRatiosAndEffs", TObject::kOverwrite | TObject::kSingleKey); // chamberVSrunRatiosAndEff.Write("ChambersEffVSrunRatiosAndEff", TObject::kOverwrite | TObject::kSingleKey); // deVSrunRatiosAndEff.Write("DEEffVSrunRatiosAndEff", TObject::kOverwrite | TObject::kSingleKey); chamberVSdeRatiosAndEff.Write("ChamberEffperDERatiosAndEff", TObject::kOverwrite | TObject::kSingleKey); file->Close(); fileData->Close(); fileSim->Close(); }
int rdMu2bbc( TString fullName="ccX", int nEve=10000, Int_t nFiles = 4, char* file="inp/R5112017.lis", // min-b //char* file="inp/R5118053.lis", // prodPP char* inDir = "./", char* outDir = "outBbc/" ){ gROOT->LoadMacro("$STAR/StRoot/StMuDSTMaker/COMMON/macros/loadSharedLibraries.C"); loadSharedLibraries(); cout << " loading done " << endl; gSystem->Load("myTest1"); // create chain chain = new StChain("StChain"); printf("adding muDst from '%s' ....\n",file); // Now we add Makers to the chain... muMk = new StMuDstMaker(0,0,inDir,file,"MuDst.root",nFiles); TChain* tree=muMk->chain(); assert(tree); int nEntries=tree->GetEntries(); printf("total eve in chain =%d\n",nEntries); myMk3=new StBbcVertexMaker("bbcVertex","MuDst"); TObjArray HList; myMk3->SetHList(&HList); myMk3->readCalib("outBbc/bbcEcalib2.dat"); myMk3->readCalib("outBbc/bbcWcalib2.dat"); myMk3->setTdcCalib(2.0); // cm/tdc ch gMessMgr->SwitchOff("D"); gMessMgr->SwitchOn("I"); chain->Init(); chain->ls(3); // return; int eventCounter=0; int stat=0; int t1=time(0); //--------------------------------------------------- while ( stat==0 ) {// loop over events if(eventCounter>=nEve) break; eventCounter++; chain->Clear(); stat = chain->Make(); if(eventCounter%1000!=0)continue; printf("\n\n ====================%d processing ==============\n", eventCounter); } printf("sorting done, nEve=%d of %d\n",nEve, nEntries); int t2=time(0); float rate=1.*eventCounter/(t2-t1); float nMnts=(t2-t1)/60.; printf("sorting done %d of nEve=%d, CPU rate=%.1f Hz, tot %.1f minutes\n",eventCounter,nEntries,rate,nMnts); chain->Finish(); // HList.ls(); fullName+=".hist.root"; TFile f( outDir+fullName,"recreate"); assert(f.IsOpen()); printf("%d histos are written to '%s' ...\n",HList.GetEntries(),fullName.Data()); HList.Write(); f.Close(); assert(!f.IsOpen()); }
//_____________________________ void muIDCutsOptim::Loop() { // In a ROOT session, you can do: // root> .L muIDCutsOptim.C // root> muIDCutsOptim t // root> t.GetEntry(12); // Fill t data members with entry number 12 // root> t.Show(); // Show values of entry 12 // root> t.Show(16); // Read and show values of entry 16 // root> t.Loop(); // Loop on all entries // // This is the loop skeleton where: // jentry is the global entry number in the chain // ientry is the entry number in the current Tree // Note that the argument to GetEntry must be: // jentry for TChain::GetEntry // ientry for TTree::GetEntry and TBranch::GetEntry // if (fChain == 0) return; //===== Definition of file type, particle and if we want the high purity cut included in the soft muon ID cuts const char* fileType = "MC"; const char* particle = "JPsi"; fIspp = kFALSE; fIncludeHighPurity = kFALSE; //===== Long64_t nentries(0); if ( !strcmp(fileType,"MC") ) nentries = fChain->GetEntries(); else nentries = 1500000; std::cout << "# Events = " << nentries << std::endl; //===== Definition of some cuts Double_t leMinvSig = 3.0; // Signal range Double_t ueMinvSig = 3.2; Double_t leMinvBkg1 = 2.7; // Bkg 1 range (sideband) Double_t ueMinvBkg1 = 2.9; Double_t leMinvBkg2 = 3.3; // Bkg 1 range (sideband) Double_t ueMinvBkg2 = 3.5; Double_t Ptmin = 3.0; // Pt cut (6.5) (3.0) Double_t Ptmax = 6.5; // (12.0) (6.5) Double_t Ymin = 2.0; // Y cut (0.0) (2.0) Double_t Ymax = 2.4; // (2.4) (2.4) //===== //===== Definition of MuID variables and binning const int nvar = 19; const char* varname[19] = {"isGoodMuon", "highPurity", "TrkMuArb", "TMOneStaTight", "nPixValHits", "nMuValHits", "nTrkHits", "normChi2_inner", "normChi2_global", "nPixWMea", "nTrkWMea", "StationsMatched", "dxy", "dxyErr", "dz", "dzErr", "ptErr_inner", "ptErr_global","VtxProb"}; const int nbins[19] = {2, 2, 2, 2, 11, 56, 36, 100, 100, 6, 19, 7, 100, 100, 100, 100, 100, 100, 200}; const double lowedge[19] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; const double hiedge[19] = {2, 2, 2, 2, 11, 56, 36, 10, 50, 6, 19, 7, 2, 0.25, 20, 5, 0.15, 0.15, 1.}; //===== SelectBranches(nvar,varname); // Activates only desired branches (General and MuID ones in this case) //====== Create histograms and arrays to store them ======== TObjArray* aDistr = new TObjArray(); TObjArray* aSig = new TObjArray(); TObjArray* aBkg = new TObjArray(); TObjArray* aSigC = new TObjArray(); TObjArray* aBkgC = new TObjArray(); TObjArray* aGlob = new TObjArray(); TObjArray* aMinvCuts = new TObjArray(); TObjArray* aSigSoftMuCutsButOne = new TObjArray(); TObjArray* aBkgSoftMuCutsButOne = new TObjArray(); TObjArray* aSigSoftMuCuts = new TObjArray(); TObjArray* aBkgSoftMuCuts = new TObjArray(); map<TString, TH1F*> hists_sig, hists_bkg, hists_sig_distr, hists_bkg_distr, hists_distr, hists_sig_distr_CutTest, hists_bkg_distr_CutTest, hists_sig_SofMu, hists_bkg_SofMu; TString sHPName(""); if ( fIncludeHighPurity ) sHPName += "highPurity"; // This is for the histograms creation TObjArray* dummyA(0x0); TString partType(""); for (int i=0; i<nvar; i++) { // Single cuts histos hists_sig[Form("%s",varname[i])] = new TH1F(Form("h%s_sig",varname[i]),Form("Signal di-#mu %s cut distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_bkg[Form("%s",varname[i])] = new TH1F(Form("h%s_bkg",varname[i]),Form("Background di-#mu %s cut distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]); // Variable distributions histos hists_sig_distr[Form("%s",varname[i])] = new TH1F(Form("h%s_sig_distr",varname[i]),Form("Signal single-#mu %s distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_bkg_distr[Form("%s",varname[i])] = new TH1F(Form("h%s_bkg_distr",varname[i]),Form("Background single-#mu %s distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]); partType.Clear(); if ( !strcmp(varname[i],"VtxProb") ) partType += "di-#mu"; else partType += "di-#mu"; hists_distr[Form("%s",varname[i])] = new TH1F(Form("h%s_distr",varname[i]),Form("Sig+Bkg %s %s distribution",partType.Data(),varname[i]),nbins[i],lowedge[i],hiedge[i]); dummyA = new TObjArray(); dummyA->SetName(Form("mInv_%s",varname[i])); aMinvCuts->Add(dummyA); if ( !strcmp(varname[i],"isGoodMuon") || !strcmp(varname[i],sHPName.Data()) || !strcmp(varname[i],"nPixWMea") || !strcmp(varname[i],"nTrkWMea") || !strcmp(varname[i],"dxy") || !strcmp(varname[i],"dz") ) { // Histos for all the soft muon cuts applied but the one on the histo hists_sig_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuNoCut_%s_sig",varname[i]),Form("Signal single-#mu %s distribution (w/ rest of soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_bkg_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuNoCut_%s_bkg",varname[i]),Form("Background single-#mu %s distribution (w/ rest of soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_sig_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_sig",varname[i]),Form("Signal di-#mu %s cut distribution (w/ all Soft MuID cuts except %s)",varname[i],varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_bkg_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_bkg",varname[i]),Form("Background di-#mu %s cut distribution (w/ all Soft MuID cuts except %s)",varname[i],varname[i]),nbins[i],lowedge[i],hiedge[i]); } else { // Histos for all the soft muon cuts applied hists_sig_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuFull_%s_sig",varname[i]),Form("Signal %s %s distribution (w/ all Soft MuID cuts)",partType.Data(),varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_bkg_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuFull_%s_bkg",varname[i]),Form("Signal %s %s distribution (w/ all Soft MuID cuts)",partType.Data(),varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_sig_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_sig",varname[i]),Form("Signal di-#mu %s cut distribution (w/ all Soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]); hists_bkg_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_bkg",varname[i]),Form("Background di-#mu %s cut distribution (w/ all Soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]); } } // Histos for global distributions TH1* hpt = new TH1D("hPtSig",Form("Dimuon p_{T} distribution (%2.1f < m_{#mu^{+}#mu^{-}} < %2.1f)",leMinvSig,ueMinvSig),300,0.0,15.0); TH1* hptw = new TH1D("hPtSigW",Form("Dimuon p_{T} distribution weighted (%2.1f < m_{#mu^{+}#mu^{-}} < %2.1f)",leMinvSig,ueMinvSig),300,0.0,15.0); TH1* hMinvw = new TH1D("hmInv","Dimuon m_{inv} distribution",600,0.,15.0); TH1* hRapw = new TH1D("hRap","Dimuon rapidity distribution",180,-4.5,4.5); TH1* hPtw = new TH1D("hPt","Dimuon p_{T} distribution",300,0.0,15.0); TH1* hCent = new TH1D("hCent","Centrality distribution",200,0.,100); TH1* hCentw = new TH1D("hCentw","Weighted centrality distribution",200,0.,100); //====================== TLorentzVector *tlvmupl(0x0); TLorentzVector *tlvmumi(0x0); TLorentzVector *tlvqq(0x0); Long64_t nbytes = 0, nb = 0; //*************** Event loop for (Long64_t jentry=0; jentry<nentries;jentry++) { Long64_t ientry = LoadTree(jentry); if (ientry < 0) break; nb = fChain->GetEntry(jentry); nbytes += nb; if ( jentry % 1000 == 0 ) std::cout << jentry << "/" << nentries << std::endl; Double_t weight = fChain->GetWeight()*GetNColl(Centrality); // This is the weight for the Pt and centrality. The weight stored in the chain is filterEficiency/nentries //Fill centrality histo hCentw->Fill(Centrality/2.,weight); hCent->Fill(Centrality/2.); //*************** Loop on reco dimuons // for (int i=0; i<Reco_QQ_size; i++) // { Int_t i(0); Bool_t kQQfound(kFALSE); while ( i < Reco_QQ_size && !kQQfound ) // This is just to take only the first dimuon passing the basic conditions, to not double count single muons { if ( !isTriggerSelected(i) || Reco_QQ_sign[i]!=0 ) { i++; continue; // Checks if the event is selected by the trigger } // if (Reco_QQ_sign[i]!=0) continue; tlvmupl = (TLorentzVector*) Reco_QQ_mupl_4mom->At(i); tlvmumi = (TLorentzVector*) Reco_QQ_mumi_4mom->At(i); if (!IsAccept(tlvmupl->Pt(), tlvmupl->Eta()) || !IsAccept(tlvmumi->Pt(), tlvmumi->Eta())) { i++; continue; // Basic single muon kinematic cuts } tlvqq = (TLorentzVector*) Reco_QQ_4mom->At(i); Double_t mass = tlvqq->M(); Double_t QQPt = tlvqq->Pt(); Double_t QQY = TMath::Abs(tlvqq->Rapidity()); if ( QQPt < Ptmin || QQPt > Ptmax || QQY < Ymin || QQY > Ymax ) { i++; continue; // The simulation is restricted to pt in [Ptmin,Ptmax], so this rejects background dmuons outside the range } bool issig = (mass>leMinvSig && mass<ueMinvSig); bool isbkg = ((mass>leMinvBkg1 && mass<ueMinvBkg1) || (mass>leMinvBkg2 && mass<ueMinvBkg2)); if ( !issig && ! isbkg ) { i++; continue; // We keep only dimuons in the sidebands and signal ranges } kQQfound = kTRUE; // If at this point the dimuon has passed the basic conditions we keep only this dimuon from the event const double varValP[19] = {Reco_QQ_mupl_isGoodMuon[i],Reco_QQ_mupl_highPurity[i],Reco_QQ_mupl_TrkMuArb[i],Reco_QQ_mupl_TMOneStaTight[i],Reco_QQ_mupl_nPixValHits[i],Reco_QQ_mupl_nMuValHits[i],Reco_QQ_mupl_nTrkHits[i],Reco_QQ_mupl_normChi2_inner[i],Reco_QQ_mupl_normChi2_global[i],Reco_QQ_mupl_nPixWMea[i],Reco_QQ_mupl_nTrkWMea[i],Reco_QQ_mupl_StationsMatched[i],Reco_QQ_mupl_dxy[i],Reco_QQ_mupl_dxyErr[i],Reco_QQ_mupl_dz[i],Reco_QQ_mupl_dzErr[i],Reco_QQ_mupl_ptErr_inner[i],Reco_QQ_mupl_ptErr_global[i],Reco_QQ_VtxProb[i]}; const double varValM[19] = {Reco_QQ_mumi_isGoodMuon[i],Reco_QQ_mumi_highPurity[i],Reco_QQ_mumi_TrkMuArb[i],Reco_QQ_mumi_TMOneStaTight[i],Reco_QQ_mumi_nPixValHits[i],Reco_QQ_mumi_nMuValHits[i],Reco_QQ_mumi_nTrkHits[i],Reco_QQ_mumi_normChi2_inner[i],Reco_QQ_mumi_normChi2_global[i],Reco_QQ_mumi_nPixWMea[i],Reco_QQ_mumi_nTrkWMea[i],Reco_QQ_mumi_StationsMatched[i],Reco_QQ_mumi_dxy[i],Reco_QQ_mumi_dxyErr[i],Reco_QQ_mumi_dz[i],Reco_QQ_mumi_dzErr[i],Reco_QQ_mumi_ptErr_inner[i],Reco_QQ_mumi_ptErr_global[i],0.}; //Reco_QQ_VtxProb set to 0. since it is a dimuon variable //************************************************** //*************** Fill histos ********************** //************************************************** //===== General distributions hMinvw->Fill(mass,weight); hRapw->Fill(tlvqq->Rapidity(),weight); hPtw->Fill(QQPt,weight); if (issig) { hpt->Fill(QQPt); hptw->Fill(QQPt,weight); } //===== //===== MuID distributions for (int ihist=0; ihist<nvar; ihist++) { Bool_t isQQVar = kFALSE; if ( !strcmp(varname[ihist],"VtxProb") ) isQQVar = kTRUE; // Just to avoid filling the histos twice if testing a variable corresponding to a dimuon hists_distr[varname[ihist]]->Fill(varValP[ihist],weight); // Signal+ Background variable distribution if ( !isQQVar ) hists_distr[varname[ihist]]->Fill(varValM[ihist],weight); if (issig) { hists_sig_distr[varname[ihist]]->Fill(varValP[ihist],weight); // Signal variable distribution if ( !isQQVar ) hists_sig_distr[varname[ihist]]->Fill(varValM[ihist],weight); } if (isbkg) { hists_bkg_distr[varname[ihist]]->Fill(varValP[ihist],weight); // Background variable distribution if ( !isQQVar ) hists_bkg_distr[varname[ihist]]->Fill(varValM[ihist],weight); } ////_______ Soft muons cut testing MuID distributions Int_t nTest = whichMuIDVar(varname[ihist]); // If the variable is not on the soft muon cuts the full cut is applied if (isSoftMuon(varValP,nTest)) { if (issig) hists_sig_distr_CutTest[varname[ihist]]->Fill(varValP[ihist],weight); // Variable distribution with the rest of soft MuID cuts applied (all the soft muon cuts if the variable does't belong to the soft cut) if (isbkg) hists_bkg_distr_CutTest[varname[ihist]]->Fill(varValP[ihist],weight); } if ( !isQQVar && isSoftMuon(varValM,nTest) ) { if (issig) hists_sig_distr_CutTest[varname[ihist]]->Fill(varValM[ihist],weight); if (isbkg) hists_bkg_distr_CutTest[varname[ihist]]->Fill(varValM[ihist],weight); } ////_______ dummyA = static_cast<TObjArray*>(aMinvCuts->FindObject(Form("mInv_%s",varname[ihist]))); TH1* dummyH(0x0); Double_t nBins = hists_sig[varname[ihist]]->GetNbinsX(); for ( Int_t j=1 ; j<=nBins ; j++) { //// Cuts on MuID variables Double_t cutVal = hists_sig[varname[ihist]]->GetBinLowEdge(j); if (Cut(varname[ihist],i,cutVal)) { if (issig) hists_sig[varname[ihist]]->Fill(hists_sig[varname[ihist]]->GetBinCenter(j),weight); // Variable cut distribution if (isbkg) hists_bkg[varname[ihist]]->Fill(hists_bkg[varname[ihist]]->GetBinCenter(j),weight); if ( !(dummyH = static_cast<TH1*>(dummyA->FindObject(Form("mInv_%s_Cut%2.4f",varname[ihist],cutVal)))) ) // Creates the minv histogram and store in array (only once) { dummyH = new TH1D(Form("mInv_%s_Cut%2.4f",varname[ihist],cutVal),Form("Dimuon m_{inv} distribution (cut on %s: %2.4f)",varname[ihist],cutVal),600,0.,15.0); dummyA->Add(dummyH); } dummyH->Fill(mass,weight); // Invariant mass histo for each variable cut if ( isSoftMuon(varValP,nTest) && isSoftMuon(varValM,nTest) ) // If the variable is not in the soft MuID cut, the full soft cut is applied and the variable cut distribution is filled { if (issig) hists_sig_SofMu[varname[ihist]]->Fill(hists_sig[varname[ihist]]->GetBinCenter(j),weight); if (isbkg) hists_bkg_SofMu[varname[ihist]]->Fill(hists_bkg[varname[ihist]]->GetBinCenter(j),weight); } } } } //======= i++; } } //====== Save histos ====== TFile *f = new TFile(Form("histos_%s_%s_%s_Pt%2.1f_%2.1f_Y%2.1f_%2.1f.root",fileType,particle,fIncludeHighPurity ? "HPincl" : "NoHPincl",Ptmin,Ptmax,Ymin,Ymax),"RECREATE"); for (int i=0; i<nvar; i++) { aSigC->Add(hists_sig[varname[i]]); aBkgC->Add(hists_bkg[varname[i]]); aSig->Add(hists_sig_distr[varname[i]]); aBkg->Add(hists_bkg_distr[varname[i]]); aDistr->Add(hists_distr[varname[i]]); aSigSoftMuCutsButOne->Add(hists_sig_distr_CutTest[varname[i]]); aBkgSoftMuCutsButOne->Add(hists_bkg_distr_CutTest[varname[i]]); aSigSoftMuCuts->Add(hists_sig_SofMu[varname[i]]); aBkgSoftMuCuts->Add(hists_bkg_SofMu[varname[i]]); } aSigC->Write("SigSingleCut", TObject::kOverwrite | TObject::kSingleKey); aBkgC->Write("BkgSingleCut", TObject::kOverwrite | TObject::kSingleKey); aSig->Write("SigDistr", TObject::kOverwrite | TObject::kSingleKey); aBkg->Write("BkgDistr", TObject::kOverwrite | TObject::kSingleKey); aDistr->Write("Distr", TObject::kOverwrite | TObject::kSingleKey); aSigSoftMuCutsButOne->Write("SigDistrSoftMuCutButOne", TObject::kOverwrite | TObject::kSingleKey); aBkgSoftMuCutsButOne->Write("BkgDistrSoftMuCutButOne", TObject::kOverwrite | TObject::kSingleKey); aSigSoftMuCuts->Write("SigSoftMuCut", TObject::kOverwrite | TObject::kSingleKey); aBkgSoftMuCuts->Write("BkgSoftMuCut", TObject::kOverwrite | TObject::kSingleKey); aGlob->Add(hMinvw); aGlob->Add(hRapw); aGlob->Add(hPtw); aGlob->Add(hpt); aGlob->Add(hptw); aGlob->Add(hCent); aGlob->Add(hCentw); aGlob->Write("Global", TObject::kOverwrite | TObject::kSingleKey); aMinvCuts->Write("MinvWCuts", TObject::kOverwrite | TObject::kSingleKey); f->Close(); //========= }
void GeomAcc::Calculate(TString geomTuple, TString saveName){ TFile* file = new TFile(geomTuple); TTree* tree=(TTree*)file->Get("SelectJpsi/JpsiGen"); double JpsiPT, JpsiRap, CosTheta; double MuNegDau, MuPosDau; tree->SetBranchAddress("JPsi_PT",&JpsiPT); tree->SetBranchAddress("JPsi_RAPIDITY",&JpsiRap); tree->SetBranchAddress("JPsi_COSTHETA",&CosTheta); tree->SetBranchAddress("MuMinus_THETA",&MuNegDau); tree->SetBranchAddress("MuPlus_THETA",&MuPosDau); int xbin = 20; int ybin = 5; TH2D *Num = new TH2D("Num","Num",xbin,0.0,10000.0, ybin,2.0,4.2); TH2D *Den = new TH2D("Den","Den",xbin,0.0,10000.0, ybin,2.0,4.2); TH2D *NumLong = new TH2D("NumLong","NumLong",xbin,0.0,10000.0, ybin,2.0,4.2); TH2D *DenLong = new TH2D("DenLong","DenLong",xbin,0.0,10000.0, ybin,2.0,4.2); TH2D *NumTrans = new TH2D("NumTrans","NumTrans",xbin,0.0,10000.0, ybin,2.0,4.2); TH2D *DenTrans = new TH2D("DenTrans","DenTrans",xbin,0.0,10000.0, ybin,2.0,4.2); for(int i=0; i<tree->GetEntries(); i++) { tree->GetEntry(i); Den->Fill(JpsiPT,JpsiRap); DenLong->Fill(JpsiPT,JpsiRap,(1-CosTheta*CosTheta)); DenTrans->Fill(JpsiPT,JpsiRap,(1+CosTheta*CosTheta)); // //Calculate Daughters in acceptance criteria // bool inAcc = Cut(MuPosDau, MuNegDau); if(inAcc) { Num->Fill(JpsiPT,JpsiRap); NumLong->Fill(JpsiPT,JpsiRap,(1-CosTheta*CosTheta)); NumTrans->Fill(JpsiPT,JpsiRap,(1+CosTheta*CosTheta)); } } // //Calculate efficiency // TH2D GeoEff = (Eff(Num, Den, xbin, ybin, "GeoEff")); TH2D GeoLongEff = (Eff(NumLong, DenLong, xbin, ybin,"GeoLongEff")); TH2D GeoTransEff = (Eff(NumTrans, DenTrans, xbin, ybin,"GeoTransEff")); TObjArray* histList = new TObjArray(0); histList->Add(Num); histList->Add(Den); histList->Add(&GeoEff); histList->Add(NumLong); histList->Add(DenLong); histList->Add(&GeoLongEff); histList->Add(NumTrans); histList->Add(DenTrans); histList->Add(&GeoTransEff); TFile* saveFile = new TFile("Output/"+saveName, "recreate"); histList->Write(); saveFile->Close(); // // Save into final usable format in Efficiency folder // Format(saveName, "NoPol/"); Format(saveName, "Long/"); Format(saveName, "Trans/"); return; }
void saveHistRoot(const char *cfile){ cout<<"File to be saved = "<<cfile<<endl; TFile *outputFile = new TFile(cfile,"recreate"); hdN_dPhiTrkNJet->Write(), hdN_dPhiTrkAJet->Write(); hdN_dEtaTrkNJet->Write(), hdN_dEtaTrkAJet->Write(); hdN_dRTrkNJet->Write(), hdN_dRTrkAJet->Write(); hdN_dPhiTrkTrk_dPhiTrkJet->Write(); hdN_dEtaTrkTrk_dEtaTrkJet->Write(); hdN_dRTrkTrk_dRTrkJet->Write(); hdN_dPhiTrkTrk_dRTrkJet->Write(); hdN_dEtadPhiTrkNJet->Write(), hdN_dEtadPhiTrkAJet->Write(); hdNdPt_NJet->Write(), hdNdPt_AJet->Write(); // dN/dpT nomalization /* for(int i=0; i<ptBins.size(); i++){ float dbin = hdNdPt_NJet_vbin->GetBinWidth(i+1); float dn_N = hdNdPt_NJet_vbin->GetBinContent(i+1); float dn_A = hdNdPt_AJet_vbin->GetBinContent(i+1); float edn_N = hdNdPt_NJet_vbin->GetBinError(i+1); float edn_A = hdNdPt_AJet_vbin->GetBinError(i+1); hdNdPt_NJet_vbin->SetBinContent(i+1,dn_N/dbin); hdNdPt_AJet_vbin->SetBinContent(i+1,dn_A/dbin); hdNdPt_NJet_vbin->SetBinError(i+1,edn_N/dbin); hdNdPt_AJet_vbin->SetBinError(i+1,edn_A/dbin); } */ hdNdPt_NJet_vbin->Write(), hdNdPt_AJet_vbin->Write(); hdNdZ_NJet->Write(), hdNdZ_AJet->Write(); hdNdNR_NJet->Write(), hdNdNR_AJet->Write(); hdNdNRW_NJet->Write(), hdNdNRW_AJet->Write(); hdNdJetEt_NJet->Write(), hdNdJetEt_AJet->Write(); hdNdTrkSPt_NJet->Write(), hdNdTrkSPt_AJet->Write(); hdNPtEtRatio_NJet->Write(), hdNPtEtRatio_AJet->Write(); hdNPtEtAsymm_NJet->Write(), hdNPtEtAsymm_AJet->Write(); dJetDist = outputFile->mkdir("jetDist"), dJetDist->cd(); hdEtadPhiJetArray.Write(); dTrkDist = outputFile->mkdir("trkDist"), dTrkDist->cd(); hdEtadPhiTrkArray.Write(); dTrkWDist = outputFile->mkdir("trkWDist"), dTrkWDist->cd(); hdEtadPhiTrkWArray.Write(); dJetTagDist = outputFile->mkdir("jetTagDist"), dJetTagDist->cd(); hdEtadPhiJetTagArray.Write(); dTrkTagDist = outputFile->mkdir("trkTagDist"), dTrkTagDist->cd(); hdEtadPhiTrkTagArray.Write(); dTrkWTagDist = outputFile->mkdir("trkWTagDist"), dTrkWTagDist->cd(); hdEtadPhiTrkWTagArray.Write(); }