int main(int argc, char **argv) { TString xvar = "TMath::Power(J_psi_1S_MM/1000,2)"; TString xvarname = "q2"; TString type = "All"; TCut extCut = ""; string drawopt = ""; TString outFileName = ""; bool rel = false, doSys = false, percent = false, jpsi = false, pythia6 = false; int xnbins = 12; double def_xbins[] = {0.1, 2.0, 4.0, 6.0, 8.0, 9.1, 10.1, 11.0, 12.5, 15.0, 16.0, 18.0, 20.0}; //double def_xbins[] = {1.1, 6.0, 15.0, 20.0}; double * xbins = &def_xbins[0]; if(argc > 1) { for(int a = 1; a < argc; a++) { string arg = argv[a]; string str = arg.substr(2,arg.length()-2); if(arg.find("-t") != string::npos) type = (TString)str; if(arg == "-r") rel = true; if(arg.find("-b") != string::npos ) xbins = decodeBinning(str,&xnbins); if(arg.find("-c") != string::npos ) xbins = decodeBinning(str,&xnbins,"custom"); if(arg.find("-C") != string::npos ) extCut = (TCut)((TString)str); if(arg == "-highq2Cut") extCut = (TCut)"( TMath::Power(J_psi_1S_MM/1000,2) > 15. && TMath::Power(J_psi_1S_MM/1000,2) < 20. )"; if(arg == "-Pythia6") pythia6 = true; if(arg.find("-X") != string::npos) { xvar = str; xvarname = xvar; } if(arg.find("-D") != string::npos) drawopt = str; if(arg.find("-sys") != string::npos) doSys = true; if(arg.find("-percent") != string::npos) percent = true; if(arg.find("-o") != string::npos) outFileName = str; if(arg.find("-jpsi") != string::npos) jpsi = true; } } if(jpsi) { if(xvarname=="q2") xbins = decodeBinning("[1,0,25]",&xnbins); rel = false; doSys = false; } // Set trees of cancdidates previously created TString mctype = "MC_Pythia8_NBweighted"; if(pythia6) mctype = "MC_Pythia6_NBweighted"; TString weight = "MCnorm*(lifeTimeW > 0)*(physRate_pol0_noDecay > 0)"; cout << "Using: " << mctype << endl; cout << "Plotting: " << xvar << endl; cout << "Binning: ["; for(int i = 0; i < xnbins; i++) cout << xbins[i] << ","; cout << xbins[xnbins] << "]" << endl; TString namefileMCgeom = "/afs/cern.ch/work/p/pluca/weighted/Lmumu/Lb2Lmumu_geom"+mctype+".root"; TString namefileMC = "/afs/cern.ch/work/p/pluca/weighted/Lmumu/Lb2Lmumu_"+mctype+".root"; TString namefileMCjpsi = "/afs/cern.ch/work/p/pluca/weighted/Lmumu/Lb2JpsiL_"+mctype+".root"; TString namefileMCjpsiGeom = "/afs/cern.ch/work/p/pluca/weighted/Lmumu/Lb2JpsiL_geom"+mctype+".root"; TString namefileDataJpsi = "/afs/cern.ch/work/p/pluca/weighted/Lmumu/Lb2Lmumu_CL_NBweighted.root"; TString nameGeomTree = "MCtree"; if(xvar=="cosThetaB") nameGeomTree = "MCtreeDecay"; TFile * MCfile = TFile::Open(namefileMCgeom); TTree * treeMCgeom = (TTree *)MCfile->Get(nameGeomTree); MCfile = TFile::Open(namefileMC); TTree * treeMC = (TTree *)MCfile->Get("tree"); TTree * treeMCGen = (TTree *)MCfile->Get("MCtreeDecay"); TTree * treeMCAllGen = (TTree *)MCfile->Get("MCtree"); MCfile = TFile::Open("/afs/cern.ch/work/p/pluca/weighted/Lmumu/trainingSamples.root"); TTree * treeMCmva = (TTree *)MCfile->Get("sigTestSample"); TTree * treeMCjpsi = NULL, * treeMCjpsi_Gen = NULL, * treeMCjpsi_AllGen = NULL, * treeMCjpsi_geom = NULL; if(rel || jpsi) { MCfile = TFile::Open(namefileMCjpsi); if(jpsi) { treeMC = (TTree *)MCfile->Get("tree"); treeMCmva = (TTree *)MCfile->Get("tree"); treeMCGen = (TTree *)MCfile->Get("MCtreeDecay"); treeMCAllGen = (TTree *)MCfile->Get("MCtree"); } else { treeMCjpsi = (TTree *)MCfile->Get("tree"); treeMCjpsi_Gen = (TTree *)MCfile->Get("MCtreeDecay"); treeMCjpsi_AllGen = (TTree *)MCfile->Get("MCtree"); } MCfile = TFile::Open(namefileMCjpsiGeom); if(jpsi) treeMCgeom = (TTree *)MCfile->Get(nameGeomTree); else treeMCjpsi_geom = (TTree *)MCfile->Get(nameGeomTree); /* MCfile = TFile::Open(namefileMC); treeMCjpsi = (TTree *)MCfile->Get("tree"); treeMCjpsi_Gen = (TTree *)MCfile->Get("MCtreeDecay"); treeMCjpsi_AllGen = (TTree *)MCfile->Get("MCtree"); MCfile = TFile::Open(namefileMCgeom); treeMCjpsi_geom = (TTree *)MCfile->Get(nameGeomTree); */ } TCut geomCut = CutsDef::geomCut; TCut baseCut = extCut + CutsDef::baseCutMuMu; if(jpsi) baseCut = extCut + CutsDef::baseCutJpsi; TCut baseJpsiCut = extCut + CutsDef::baseCutJpsi; TCut binCut = "TMath::Power(J_psi_1S_MM/1000,2) > 9.1 && TMath::Power(J_psi_1S_MM/1000,2) < 10.1"; if(type == "DD") { baseCut += CutsDef::DDcut; baseJpsiCut += CutsDef::DDcut; } else if(type == "LL") { baseCut += CutsDef::LLcut; baseJpsiCut += CutsDef::LLcut; } cout << "Analysisng " << type << " events" << endl; //TCut simpleEffCut = geomCut + (TCut)"TMath::Sqrt(TMath::Power(pplus_TRUEP_X,2) + TMath::Power(pplus_TRUEP_Y,2) + TMath::Power(pplus_TRUEP_Z,2)) > 6000 && TMath::Sqrt(TMath::Power(piminus_TRUEP_X,2) + TMath::Power(piminus_TRUEP_Y,2) + TMath::Power(piminus_TRUEP_Z,2)) > 2000 && TMath::Sqrt(TMath::Power(muminus_TRUEP_X,2) + TMath::Power(muminus_TRUEP_Y,2) + TMath::Power(muminus_TRUEP_Z,2)) > 3000 && TMath::Sqrt(TMath::Power(muplus_TRUEP_X,2) + TMath::Power(muplus_TRUEP_Y,2) + TMath::Power(muplus_TRUEP_Z,2)) > 3000 && pplus_TRUEPT > 400 && muplus_TRUEPT > 100 && muminus_TRUEPT > 100"; TString myName = "Lbeff"; if(rel) myName = "Lbreleff"; if(doSys) myName += "AndSys"; if(jpsi) myName += "_Jpsi"; myName += ("vs"+xvarname+"_"+type+".root"); if(outFileName!="") myName = outFileName; TFile * histFile = new TFile(myName,"recreate"); /** Calc efficiencies and systematics */ vector <TString> effnames; effnames.push_back("geom"); effnames.push_back("det"); effnames.push_back("reco"); effnames.push_back("mva"); effnames.push_back("trig"); vector <TH1F * > hdefault; vector <TH1F * > lfsys_plus, lfsys_minus; vector <TH1F * > decaysys, DDsys; vector <TH1F * > polsys_minus, polsys_plus; vector <TH1F * > poljpsi1, poljpsi2, poljpsi3, poljpsi4, poljpsi5, poljpsi6, poljpsi7, poljpsi8; cout << "Analysing GEO sys" << endl; getAllEffSys("GEO", xvar, xnbins, xbins, weight, treeMCgeom, geomCut+extCut, treeMCgeom, extCut, treeMCjpsi_geom, geomCut+extCut+binCut, treeMCjpsi_geom, extCut+binCut, &hdefault, &lfsys_plus, &lfsys_minus, &decaysys, &polsys_minus, &polsys_plus, &poljpsi1, &poljpsi2, &poljpsi3, &poljpsi4, &poljpsi5, &poljpsi6, &poljpsi7, &poljpsi8, &DDsys, doSys, "-f0.5", jpsi); cout << "Analysing DET sys" << endl; if(xvar=="cosThetaB") getAllEffSys("DET", xvar, xnbins, xbins, weight, treeMCGen, extCut, treeMCgeom, geomCut+extCut, treeMCjpsi_Gen, extCut+binCut, treeMCjpsi_AllGen, geomCut+extCut+binCut, &hdefault, &lfsys_plus, &lfsys_minus, &decaysys, &polsys_minus, &polsys_plus, &poljpsi1, &poljpsi2, &poljpsi3, &poljpsi4, &poljpsi5, &poljpsi6, &poljpsi7, &poljpsi8, &DDsys, doSys, "", jpsi ); else getAllEffSys("DET", xvar, xnbins, xbins, weight, treeMCGen, extCut, treeMCAllGen, extCut, treeMCjpsi_Gen, extCut+binCut, treeMCjpsi_AllGen, extCut+binCut, &hdefault, &lfsys_plus, &lfsys_minus, &decaysys, &polsys_minus, &polsys_plus, &poljpsi1, &poljpsi2, &poljpsi3, &poljpsi4, &poljpsi5, &poljpsi6, &poljpsi7, &poljpsi8, &DDsys, doSys, "", jpsi ); cout << "Analysing RECO sys" << endl; getAllEffSys("RECO", xvar, xnbins, xbins, weight, treeMC, baseCut, treeMCGen, extCut, treeMCjpsi, baseJpsiCut+binCut, treeMCjpsi_Gen, extCut+binCut, &hdefault, &lfsys_plus, &lfsys_minus, &decaysys, &polsys_minus, &polsys_plus, &poljpsi1, &poljpsi2, &poljpsi3, &poljpsi4, &poljpsi5, &poljpsi6, &poljpsi7, &poljpsi8, &DDsys, doSys, "", jpsi ); cout << "Analysing MVA sys" << endl; getAllEffSys("MVA", xvar, xnbins, xbins, weight, treeMCmva, baseCut+CutsDef::MVAcut, treeMCmva, baseCut, treeMCjpsi, baseJpsiCut+CutsDef::MVAcut+binCut, treeMCjpsi, baseJpsiCut+binCut, &hdefault, &lfsys_plus, &lfsys_minus, &decaysys, &polsys_minus, &polsys_plus, &poljpsi1, &poljpsi2, &poljpsi3, &poljpsi4, &poljpsi5, &poljpsi6, &poljpsi7, &poljpsi8, &DDsys, doSys, "", jpsi ); cout << "Analysing TRIG sys" << endl; getAllEffSys("TRIG", xvar, xnbins, xbins, weight, treeMC, baseCut+CutsDef::MVAcut+CutsDef::TrigPassed, treeMC, baseCut+CutsDef::MVAcut, treeMCjpsi, baseJpsiCut+CutsDef::MVAcut+CutsDef::TrigPassed+binCut, treeMCjpsi, baseJpsiCut+CutsDef::MVAcut+binCut, &hdefault, &lfsys_plus, &lfsys_minus, &decaysys, &polsys_minus, &polsys_plus, &poljpsi1, &poljpsi2, &poljpsi3, &poljpsi4, &poljpsi5, &poljpsi6, &poljpsi7, &poljpsi8, &DDsys, doSys, "", jpsi ); TH1F * toteff_lowSel = NULL; if(rel || jpsi) { TString polweight = "physRate_polp006"; if(jpsi) polweight = "physRate_pol0"; TH1F * mva_lowSel = getEff("UPPER", xvar, xnbins, xbins, treeMCmva, baseCut+CutsDef::MVAcut, treeMCmva, baseCut, weight+"*lifeTimeW*pt_weight*"+polweight, treeMCjpsi, baseJpsiCut+CutsDef::MVAcut_lowSel+binCut, treeMCjpsi, baseJpsiCut+binCut, weight+"*lifeTimeW*physRate_pol0*pt_weight" ); mva_lowSel->Write("hmvaeff_lowSel"); TH1F * uppereff_lowSel = (TH1F *)hdefault[2]->Clone("huppereff_lowSel"); uppereff_lowSel->Multiply(hdefault[3]); uppereff_lowSel->Multiply(mva_lowSel); toteff_lowSel = (TH1F *)hdefault[0]->Clone("htoteff_lowSel"); toteff_lowSel->Multiply(hdefault[1]); toteff_lowSel->Multiply(uppereff_lowSel); uppereff_lowSel->Write("huppereff_lowSel"); toteff_lowSel->Write("htoteff_lowSel"); } //Simply model //TH1F * simpleeff = getEff("SIMPLY", xvar, xnbins, xbins, // treeMCgeom, simpleEffCut, treeMCgeom, "", weight); TCanvas * c = new TCanvas(); gStyle->SetOptStat(0); gStyle->SetOptFit(); TH1F * uppereff = (TH1F *)hdefault[2]->Clone("huppereff"); uppereff->Multiply(hdefault[3]); uppereff->Multiply(hdefault[4]); TH1F * toteff = (TH1F *)hdefault[0]->Clone("htoteff"); if(xvar=="cosThetaB") hdefault[1]->Scale(1./hdefault[1]->Integral()); toteff->Multiply(hdefault[1]); toteff->Multiply(uppereff); toteff->SetTitle("Total eff"); //toteff->Fit("pol2"); c->Print("effvs"+xvarname+"_"+type+"_tot.pdf"); toteff->Write("htoteff"); //uppereff->Fit("pol2"); c->Print("effvs"+xvarname+"_"+type+"_upper.pdf"); uppereff->Write("huppereff"); TH1F * tot_nodet_eff = (TH1F *)hdefault[0]->Clone("htot_nodet_eff"); tot_nodet_eff->Multiply(uppereff); tot_nodet_eff->Write("htot_nodet_eff"); //simpleeff->Write("simplified_eff"); for(unsigned i = 0; i < effnames.size(); i++) { //hdefault[i]->Fit("pol2"); if(!jpsi) for(int b = 0; b < hdefault[i]->GetNbinsX(); b++) { hdefault[i]->SetBinContent(hdefault[i]->GetXaxis()->FindBin(8.5),0); hdefault[i]->SetBinError(hdefault[i]->GetXaxis()->FindBin(8.5),0); hdefault[i]->SetBinContent(hdefault[i]->GetXaxis()->FindBin(10.5),0); hdefault[i]->SetBinError(hdefault[i]->GetXaxis()->FindBin(10.5),0); } if(rel) hdefault[i]->SetMinimum(0.5); if(rel) hdefault[i]->SetMaximum(1.5); hdefault[i]->Draw(); c->Print("effvs"+xvarname+"_"+type+"_"+effnames[i]+".pdf"); hdefault[i]->Write("h"+effnames[i]+"eff"); } gStyle->SetOptFit(0); /** Printing out efficiencies and systematics **/ vector <TString> sysnames; sysnames.push_back("Lifetime"); sysnames.push_back("Decay Model"); sysnames.push_back("Polarization"); if(type=="DD") sysnames.push_back("DD vtx"); /** Print efficiencies */ cout << "\n\n" << xvarname << " bin " << " \t\t\t& "; for(unsigned s = 0; s < effnames.size(); s++) cout << effnames[s] << " \t\t\t\t& "; cout << "Upper \t\t\t\t& Total \\\\" << endl; TGraphErrors * grtoteff = new TGraphErrors(); TGraphErrors * grtoteff_lowSel = new TGraphErrors(); for(int j = 1; j <= toteff->GetNbinsX(); j++) { if((xbins[j]==11 && !rel) || xbins[j]==15) continue; if(xbins[j]==9.1 || xbins[j-1]==10.1) continue; cout << fixed << setprecision(1) << "eff " << xbins[j-1] << "-" << xbins[j] << fixed << setprecision(5) << " \t & "; for(unsigned i = 0; i < hdefault.size(); i++) cout << "$" << hdefault[i]->GetBinContent(j) << " \\pm " << hdefault[i]->GetBinError(j) << "$ \t & "; cout << "$" << uppereff->GetBinContent(j) << " \\pm " << uppereff->GetBinError(j) << "$ \t & "; cout << "$" << toteff->GetBinContent(j) << " \\pm " << toteff->GetBinError(j) << "$ \\\\ " << endl; grtoteff->SetPoint(j,toteff->GetBinCenter(j),toteff->GetBinContent(j)); grtoteff->SetPointError(j,toteff->GetBinWidth(j)/2.,toteff->GetBinError(j)); if(toteff_lowSel) grtoteff_lowSel->SetPoint(j,toteff_lowSel->GetBinCenter(j),toteff_lowSel->GetBinContent(j)); if(toteff_lowSel) grtoteff_lowSel->SetPointError(j,toteff_lowSel->GetBinWidth(j)/2.,toteff_lowSel->GetBinError(j)); } grtoteff->Write("toteff"); if(toteff_lowSel) grtoteff_lowSel->Write("toteff_lowSel"); if(!doSys) { delete MCfile; delete histFile; return 0; } /** Print sys separate in efficiency */ vector < TH1F * > tmp; vector < vector < TH1F * > > sys_eff(4,tmp); vector < TH1F * > tot_sys_eff; cout << endl << endl << endl; if(!percent) cout << "\n\n" << xvarname << " bin\t\t& Value \t & Stats"; else cout << "\n\n" << xvarname << " bin "; for(unsigned s = 0; s < sysnames.size(); s++) cout << "\t& " << sysnames[s]; cout << " \\\\" << endl; for(int j = 1; j <= toteff->GetNbinsX(); j++) { if((xbins[j]==11 && !rel) || xbins[j]==15) continue; if(xbins[j]==9.1 || xbins[j-1]==10.1) continue; cout << "-----------------------------------------------------------------------------------------" << endl; cout << fixed << setprecision(1) << xbins[j-1] << "-" << xbins[j] << fixed << setprecision(3) << endl; cout << "-----------------------------------------------------------------------------------------" << endl; if(!percent) cout << fixed << setprecision(5); for(unsigned i = 0; i < effnames.size(); i++) { if(j==1) { sys_eff[0].push_back((TH1F*)toteff->Clone("sys_lf_"+effnames[i])); sys_eff[1].push_back((TH1F*)toteff->Clone("sys_decay_"+effnames[i])); sys_eff[2].push_back((TH1F*)toteff->Clone("sys_pol_"+effnames[i])); sys_eff[3].push_back((TH1F*)toteff->Clone("sys_DD_"+effnames[i])); tot_sys_eff.push_back((TH1F*)toteff->Clone("tot_sys_eff")); sys_eff[0][i]->Reset(); sys_eff[1][i]->Reset(); sys_eff[2][i]->Reset(); sys_eff[3][i]->Reset(); tot_sys_eff[i]->Reset(); } double lf_sys = createSys(j,hdefault[i], lfsys_minus[i], lfsys_plus[i]); double decay_sys = createSys(j,hdefault[i], decaysys[i], decaysys[i]); double DD_sys = 0; double pol_sys = createSys(j, hdefault[i], polsys_minus[i], polsys_plus[i]); pol_sys = createSys(j, hdefault[i], poljpsi1[i], poljpsi2[i], pol_sys); pol_sys = createSys(j, hdefault[i], poljpsi3[i], poljpsi4[i], pol_sys); pol_sys = createSys(j, hdefault[i], poljpsi5[i], poljpsi6[i], pol_sys); pol_sys = createSys(j, hdefault[i], poljpsi7[i], poljpsi8[i], pol_sys); double cureff = hdefault[i]->GetBinContent(j); double curerr = hdefault[i]->GetBinError(j); double tot_eff_sys = TMath::Sqrt( TMath::Power(lf_sys,2) + TMath::Power(pol_sys,2) + TMath::Power(decay_sys,2) ); if(type=="DD") { DD_sys = createSys(j, hdefault[i], DDsys[i], DDsys[i]); tot_eff_sys = TMath::Sqrt( TMath::Power(tot_eff_sys,2) + TMath::Power(DD_sys,2) ); sys_eff[3][i]->SetBinContent(j,DD_sys); } cout << effnames[i] << " \t & "; if(percent) { cout << lf_sys*100 << "\\% \t & " << decay_sys*100 << "\\% \t & " << pol_sys*100 << "\\% \t"; if(type=="DD") cout << " & " << DD_sys*100 << " \t "; } else { cout << cureff << " \t & " << curerr << " \t & "; cout << lf_sys*cureff << " \t & " << decay_sys*cureff << " \t & " << pol_sys*cureff << " \t"; if(type=="DD") cout << " & " << DD_sys*cureff << " \t"; } cout << " \\\\ " << endl; sys_eff[0][i]->SetBinContent(j,lf_sys); sys_eff[1][i]->SetBinContent(j,decay_sys); sys_eff[2][i]->SetBinContent(j,pol_sys); tot_sys_eff[i]->SetBinContent(j,tot_eff_sys); } } /** Print total sys */ vector< TH1F * > sys; TH1F * tot_sys = getErrHist(toteff); for(unsigned s = 0; s < sysnames.size(); s++) { TH1F * tmp_sys = NULL; for(unsigned i = 0; i < effnames.size(); i++) tmp_sys = sqSum(tmp_sys,sys_eff[s][i]); sys.push_back( tmp_sys ); tmp_sys->Write("sys_"+sysnames[s]); tot_sys = sqSum(tot_sys,tmp_sys); } tot_sys->Write("sys_tot"); cout << endl << endl << endl; if(!percent) cout << "\n\n" << xvarname << " bin\t\t& Value \t & Stats"; else cout << "\n\n" << xvarname << " bin "; for(unsigned s = 0; s < sysnames.size(); s++) cout << " \t & " << sysnames[s]; cout << " \t & Total \\\\" << endl; for(unsigned i = 0; i < effnames.size(); i++) { TGraphErrors * grtot_eff = new TGraphErrors(); cout << endl << effnames[i] << endl; for(int j = 1; j <= toteff->GetNbinsX(); j++) { if((xbins[j]==11 && !rel) || xbins[j]==15) continue; cout << fixed << setprecision(1) << xbins[j-1] << "-" << xbins[j] << fixed << setprecision(3) << " \t & "; double cureff = hdefault[i]->GetBinContent(j); if(!percent) cout << fixed << setprecision(5) << cureff << " \t & " << hdefault[i]->GetBinError(j) << " \t & "; for(unsigned s = 0; s < sysnames.size(); s++) if(percent) cout << sys_eff[s][i]->GetBinContent(j)*100 << "\\% \t & "; else cout << sys_eff[s][i]->GetBinContent(j)*cureff << " \t & "; if(percent) cout << tot_sys_eff[i]->GetBinContent(j)*100 << "\\%"; else cout << tot_sys_eff[i]->GetBinContent(j)*cureff; cout << " \\\\ " << endl; grtot_eff->SetPoint(j,tot_sys_eff[i]->GetBinCenter(j),tot_sys_eff[i]->GetBinContent(j)); grtot_eff->SetPointError(j,tot_sys_eff[i]->GetBinWidth(j)/2.,0.); } grtot_eff->Write(effnames[i]+"sys"); } cout << endl << endl; if(!percent) cout << "\n\n" << xvarname << " bin\t\t& Value \t\t & Stats"; else cout << "\n\n" << xvarname << " bin "; for(unsigned s = 0; s < sysnames.size(); s++) cout << " \t\t & " << sysnames[s]; cout << " \\\\" << endl; TGraphErrors * grtot = new TGraphErrors(); for(int j = 1; j <= toteff->GetNbinsX(); j++) { if((xbins[j]==11 && !rel) || xbins[j]==15) continue; cout << fixed << setprecision(1) << xbins[j-1] << "-" << xbins[j] << fixed << setprecision(3); double cureff = toteff->GetBinContent(j); if(!percent) cout << fixed << setprecision(5) << cureff << " \t\t & " << toteff->GetBinError(j); for(unsigned s = 0; s < sysnames.size(); s++) if(percent) cout << " \t\t\t & " << sys[s]->GetBinContent(j)*100 << "\\% "; else cout << " \t\t\t & " << sys[s]->GetBinContent(j)*cureff; cout << " \\\\ " << endl; grtot->SetPoint(j,tot_sys->GetBinCenter(j),tot_sys->GetBinContent(j)); grtot->SetPointError(j,tot_sys->GetBinWidth(j)/2.,0.); } grtot->Write("totsys"); /* cout << "\n\n" << xvarname << " bin\t\t& Value \\\\" << endl; for(int j = 1; j <= toteff->GetNbinsX(); j++) { if((xbins[j]==11 && !rel) || xbins[j]==15) continue; cout << fixed << setprecision(1) << xbins[j-1] << "-" << xbins[j] << fixed << setprecision(5) << " \t & "; cout << "$" << toteff->GetBinContent(j) << " \\pm " << tot_sys->GetBinContent(j)*toteff->GetBinContent(j) << "$ \\\\ " << endl; } */ delete MCfile; delete histFile; return 0; }
void DrawFits(TemplateFIT * FIT,FileSaver finalHistos,FileSaver Plots){ std::string pathdata = (FIT->GetName() + "/Fit Results/Data"); std::string pathtemplP= (FIT->GetName() + "/Fit Results/ScaledTemplatesP"); std::string pathtemplD= (FIT->GetName() + "/Fit Results/ScaledTemplatesD"); std::string pathtemplHe=(FIT->GetName() + "/Fit Results/ScaledTemplatesHe"); std::string pathfit = (FIT->GetName() + "/Fit Results/FractionFits"); std::string pathtrans = (FIT->GetName() + "/Fit Results/TrasnferFunctions"); std::string pathres = (FIT->GetName() + "/Fit Results/"); TFile * infile = finalHistos.GetFile(); for(int i=1; i<FIT->GetBinning().size();i++){ std::string pathbinP = pathtemplP + "/Bin"+to_string(i); std::string pathbinD = pathtemplD + "/Bin"+to_string(i); std::string pathbinHe = pathtemplHe+ "/Bin"+to_string(i); std::string pathbindata = pathdata + "/Bin"+to_string(i); std::string pathbinfit = pathfit + "/Bin"+to_string(i); std::vector<TH1F*> TemplatesP=GetListOfTemplates(infile, pathbinP); std::vector<TH1F*> TemplatesD=GetListOfTemplates(infile, pathbinD); std::vector<TH1F*> TemplatesHe=GetListOfTemplates(infile, pathbinHe); std::vector<TH1F*> Datas =GetListOfTemplates(infile, pathbindata); std::vector<TH1F*> Fits =GetListOfTemplates(infile, pathbinfit); std::vector<TH1F*> Transfer =GetListOfTemplates(infile, pathtrans); cout<<pathbinHe<<" "<<TemplatesHe.size()<<" "<<TemplatesHe[0]<<endl; TCanvas * c1 = new TCanvas("Modified Templates"); c1->SetCanvasSize(2000,1500); for(int j=TemplatesP.size()-1;j>=0;j--){ if(j==0) PlotDistribution(gPad, TemplatesP[j],"Reconstructed Mass [GeV/c^2]","Counts",1,"same",1,TemplatesP[j]->GetBinContent(TemplatesP[j]->GetMaximumBin())*1.13,10); else PlotDistribution(gPad, TemplatesP[j],"Reconstructed Mass [GeV/c^2]","Counts",colorbase + j,"same",1,TemplatesP[j]->GetBinContent(TemplatesP[j]->GetMaximumBin())*1.13,7,"",false,false,true); } Plots.Add(c1); Plots.writeObjsInFolder((FIT->GetName()+"/Fits/Bin"+to_string(i)).c_str()); TCanvas * c2 = new TCanvas("Modified T. Fits"); c2->SetCanvasSize(2000,1500); PlotDistribution(gPad, TemplatesP[0], "Reconstructed Mass [GeV/c^2]","Counts",2,"same",1,Datas[0]->GetBinContent(Datas[0]->GetMaximumBin())*1.13,10,"Original Protons MC Template"); PlotDistribution(gPad, TemplatesD[0], "Reconstructed Mass [GeV/c^2]","Counts",4,"same",1,1e5,10,"Original Deuterons MC Template"); PlotDistribution(gPad, TemplatesHe[0],"Reconstructed Mass [GeV/c^2]","Counts",3,"same",1,1e5,10,"Original He Fragm. MC Template"); for(int j=TemplatesP.size()-1;j>=1;j--){ PlotDistribution(gPad, TemplatesP[j],"Reconstructed Mass [GeV/c^2]","Counts",2,"same",1,1e5,1,"",false,false,true); PlotDistribution(gPad, TemplatesD[j],"Reconstructed Mass [GeV/c^2]","Counts",4,"same",1,1e5,1,"",false,false,true); //PlotDistribution(gPad, TemplatesHe[j],"Reconstructed Mass [GeV/c^2]","Counts",3,"same",1,1e5,1,"",false,false,true); } PlotDistribution(gPad, Datas[0],"Reconstructed Mass [GeV/c^2]","Counts",1,"ePsame",1,1e5,3,"ISS data",false,true); Plots.Add(c2); Plots.writeObjsInFolder((FIT->GetName()+"/Fits/Bin"+to_string(i)).c_str()); TCanvas * c3 = new TCanvas("Template Fits"); c3->SetCanvasSize(2000,1500); PlotDistribution(gPad, TemplatesP[0] ,"Reconstructed Mass [GeV/c^2]","Counts",2,"same",1,Datas[0]->GetBinContent(Datas[0]->GetMaximumBin())*1.13,2,"Original Protons MC Template"); PlotDistribution(gPad, TemplatesD[0] ,"Reconstructed Mass [GeV/c^2]","Counts",4,"same",1,1e5,2,"Original Deuterons MC Template"); PlotDistribution(gPad, TemplatesHe[0],"Reconstructed Mass [GeV/c^2]","Counts",3,"same",1,1e5,2,"Original He Fragm. MC Template"); PlotDistribution(gPad, TemplatesP[1] ,"Reconstructed Mass [GeV/c^2]","Counts",2,"same",1,Datas[0]->GetBinContent(Datas[0]->GetMaximumBin())*1.13,10,"Best #chi^{2} Protons MC Template"); PlotDistribution(gPad, TemplatesD[1] ,"Reconstructed Mass [GeV/c^2]","Counts",4,"same",1,1e5,10,"Best #chi^{2} Deuterons MC Template"); PlotDistribution(gPad, TemplatesHe[1],"Reconstructed Mass [GeV/c^2]","Counts",3,"same",1,1e5,10,"Best #chi^{2} he Fragm. MC Template"); PlotDistribution(gPad, Datas[0],"Reconstructed Mass [GeV/c^2]","Counts",1,"ePsame",1,1e5,3,"ISS data",false,true); if(Fits.size()>0) PlotDistribution(gPad, Fits[0],"Reconstructed Mass [gev/c^2]","counts",6,"same",1,1e5,4,"Fraction Fit"); Plots.Add(c3); Plots.writeObjsInFolder((FIT->GetName()+"/Fits/Bin"+to_string(i)).c_str()); TCanvas * c5 = new TCanvas("Transfer Functions"); c5->SetCanvasSize(2000,1500); for(int j=0;j<Transfer.size();j++){ Transfer[j]->Smooth(3); PlotDistribution(gPad, Transfer[j],"Reconstructed Mass [GeV/c^2]","Prim. / (Prim. + Sec.)",j,"hist,same",0,1,7,("Bin. "+to_string(j)).c_str(),false,false); } Plots.Add(c5); Plots.writeObjsInFolder((FIT->GetName()+"/Fits").c_str()); TCanvas * c4 = new TCanvas("ChiSquare"); c4->SetCanvasSize(2000,1500); gPad->SetLogz(); TH2F * Chi = (TH2F*) infile->Get((FIT->GetName()+"/Fit Results/Spreads/ChiSquare/ChiSquare Bin "+to_string(i)).c_str()); Chi->GetZaxis()->SetRangeUser(0.2,100); PlotTH2F(gPad, Chi, "Additive #sigma","Mean shift", "colz"); Plots.Add(c4); Plots.writeObjsInFolder((FIT->GetName()+"/Fits/Bin"+to_string(i)).c_str()); TCanvas * c6 = new TCanvas("OverCutoff Events"); c6->SetCanvasSize(2000,1500); TH1F * OverCutoffP = (TH1F *) TemplatesP[1]->Clone(); OverCutoffP->Multiply(Transfer[i]); TH1F * OverCutoffD = (TH1F *) TemplatesD[1]->Clone(); OverCutoffD->Multiply(Transfer[i]); TH1F * NoCutoffP = (TH1F *) TemplatesP[1]->Clone(); NoCutoffP->Scale( OverCutoffP->GetBinContent(OverCutoffP->GetMaximumBin())/ NoCutoffP->GetBinContent(NoCutoffP->GetMaximumBin()) ); PlotDistribution(gPad, NoCutoffP,"Reconstructed Mass [GeV/c^2]","Primary Counts",2,"same",1,Datas[1]->GetBinContent(Datas[1]->GetMaximumBin())*1.13,3,"Best #chi^{2} Protons MC Template"); PlotDistribution(gPad, OverCutoffP,"Reconstructed Mass [GeV/c^2]","Counts",2,"same",1,Datas[0]->GetBinContent(Datas[0]->GetMaximumBin())*1.13,10,"Best #chi^{2} Protons MC (Cutoff filtered)"); PlotDistribution(gPad, OverCutoffD,"Reconstructed Mass [GeV/c^2]","Counts",4,"same",1,Datas[0]->GetBinContent(Datas[0]->GetMaximumBin())*1.13,10,"Best #chi^{2} Deutons MC (Cutoff filtered)"); PlotDistribution(gPad, Datas[1],"Reconstructed Mass [GeV/c^2]","Primary Counts",1,"ePsame",1,Datas[1]->GetBinContent(Datas[1]->GetMaximumBin())*1.13,3,"ISS data",false,true); Plots.Add(c6); Plots.writeObjsInFolder((FIT->GetName()+"/Fits/Bin"+to_string(i)).c_str()); } return; }
void ExtractOutputHistos(Bool_t onlyPrims=0,Bool_t onlyPion=0,Int_t plotFlag=0) { // gROOT->SetStyle("Plain"); gStyle->SetPalette(1); const Int_t nbins=20; Double_t ptmin=0.06;//04; Double_t ptmax=2.0;//GeV Double_t logxmin = TMath::Log10(ptmin); Double_t logxmax = TMath::Log10(ptmax); Double_t binwidth = (logxmax-logxmin)/(nbins+1); enum {nb=nbins+1}; Double_t xbins[nb]; xbins[0] = ptmin; for (Int_t i=1;i<=nbins;i++) { xbins[i] = ptmin + TMath::Power(10,logxmin+(i)*binwidth); // cout<<xbins[i]<<endl; } // TH1F *h = new TH1F("h","hist with log x axis",nbins,xbins); TH1F *hMultCount = new TH1F("mult","averaged multiplicity (charg. prim)",80,-4.,4.); hMultCount->GetXaxis()->SetTitle("eta"); hMultCount->GetYaxis()->SetTitle("N/d#eta"); TH1F *hAllMC = new TH1F("allMC","All Tracks MC primaries",nbins,xbins); TH1F *hAllFound = new TH1F("allFound","All Tracks found",nbins,xbins); TH1F *hImperfect = new TH1F("imperfect","Imperfect tracks",nbins,xbins); TH1F *hPerfect = new TH1F("perfect","Perfect tracks",nbins,xbins); TH1F *hEff = new TH1F("efficiency","Efficiency (Perfect tracks in \"ALL MC\")",nbins,xbins); TH1F *hFake = new TH1F("fake","Fake tracks (Inperfect tracks in \"ALL MC\")",nbins,xbins); TH1F *hPurity = new TH1F("purity","Purity (Perfect tracks in \"All Found\")",nbins,xbins); TH1F *hAnna = new TH1F("annaEff","AnnalisaEff ",nbins,xbins); TH1F *hNoMCTrack = new TH1F("noMCtrack","noMCtrack ",nbins,xbins); TH1F *hEta = new TH1F("","",50,-2,2); // TH1F *hEtaMC = new TH1F("","",50,-2,2); TH2D *h2Ddca = new TH2D("dca2D","DCAvsPt2D",nbins,xbins,50,-0.05,0.05); TH2D *h2Dpt = new TH2D("dPt2D","dPtdvsPt2D",nbins,xbins,50,-25,25); // open run loader and load gAlice, kinematics and header AliRunLoader* runLoader = AliRunLoader::Open("galice.root"); if (!runLoader) { Error("Check kine", "getting run loader from file %s failed", "galice.root"); return; } runLoader->LoadgAlice(); gAlice = runLoader->GetAliRun(); if (!gAlice) { Error("Check kine", "no galice object found"); return; } runLoader->LoadHeader(); runLoader->LoadKinematics(); TFile* esdFile = TFile::Open("AliESDs.root"); if (!esdFile || !esdFile->IsOpen()) { Error("CheckESD", "opening ESD file %s failed", "AliESDs.root"); return; } AliESDEvent *esd = new AliESDEvent(); TTree* tree = (TTree*) esdFile->Get("esdTree"); if (!tree) { Error("CheckESD", "no ESD tree found"); return; } esd->ReadFromTree(tree); Int_t nTrackTotalMC = 0; Int_t nTrackFound = 0; Int_t nTrackImperfect = 0; Int_t nTrackPerfect = 0; Int_t nNoMCTrack = 0; for(Int_t iEv =0; iEv<tree->GetEntries(); iEv++){ tree->GetEvent(iEv); runLoader->GetEvent(iEv); printf("+++ event %i (of %lld) +++++++++++++++++++++++ # ESDtracks: %d \n",iEv,tree->GetEntries()-1,esd->GetNumberOfTracks()); Int_t nESDtracks = esd->GetNumberOfTracks(); for (Int_t iTrack = 0; iTrack < nESDtracks; iTrack++) { AliESDtrack* track = esd->GetTrack(iTrack); if (!(iTrack%1000)) printf("event %i: ESD track count %d (of %d)\n",iEv,iTrack,nESDtracks); Int_t label = track->GetLabel(); Int_t idx[12]; // Int_t ncl = track->GetITSclusters(idx); if(label<0) { // cout<< " ESD track label " << label; // cout<<" ---> imperfect track (label "<<label<<"<0) !! -> track Pt: "<< track->Pt() << endl; } AliStack* stack = runLoader->Stack(); // nTrackTotalMC += stack->GetNprimary(); TParticle* particle = stack->Particle(TMath::Abs(label)); Double_t pt = track->Pt(); if(particle) { if (TMath::Abs(particle->Eta())>etaCut) continue; Double_t ptMC = particle->Pt(); // Efficiencies if (onlyPion && TMath::Abs(particle->GetPdgCode())!=211) continue; if ( (!onlyPrims) || stack->IsPhysicalPrimary(TMath::Abs(label))) { // cout<<" # clusters "<<ncl<<endl; nTrackFound++; hAllFound->Fill(ptMC); hEta->Fill(track->Eta()); if (label<0) { nTrackImperfect++; hImperfect->Fill(ptMC); } else { nTrackPerfect++; hPerfect->Fill(ptMC); } } // following only for "true tracks, pions if(particle->Pt() < 0.001)continue; if (TMath::Abs(particle->GetPdgCode())!=211) continue; if (label>0) { // Impact parameters for Pions only Double_t dca = track->GetD(0,0,0.5); h2Ddca->Fill(ptMC,dca); // Pt resolution for Pions only Double_t dPt = (pt-ptMC)/ptMC*100; h2Dpt->Fill(ptMC,dPt); } } else { nNoMCTrackFound++; hNoMCTrack->Fill(pt); cout<<" according MC particle not found"<<endl; } } //entries track esd }//entries tree runLoader->UnloadHeader(); runLoader->UnloadKinematics(); delete runLoader; // Count trackable MC tracks CountTrackableMCs(hAllMC, onlyPrims, onlyPion); // Count trackable MC tracks CountPrimaries(hMultCount); // Get Errors right hMultCount->Sumw2(); hAllMC->Sumw2(); hAllFound->Sumw2(); hPerfect->Sumw2(); hImperfect->Sumw2(); h2Dpt->Sumw2(); h2Ddca->Sumw2(); // -- Global efficienies nTrackTotalMC = hAllMC->GetEntries(); Double_t eff = ((Double_t)nTrackPerfect)/nTrackTotalMC; printf("-> Total number of events: %lld -> MCtracks %d -> nPerfect %d -> Eff: %3.2lf \n", tree->GetEntries(),nTrackTotalMC,nTrackPerfect,eff); Double_t purity = ((Double_t)nTrackPerfect)/nTrackFound; printf("-> Total number of events: %lld -> FoundTracks %d -> nPerfect %d -> Purity: %3.2lf \n", tree->GetEntries(),nTrackFound,nTrackPerfect,purity); // Efficiencies - and normalize to 100% TF1 f1("f1","100+x*0",0.,1.e3); hPurity->Divide(hPerfect,hAllFound,1,1,"b"); hPurity->Multiply(&f1); hPurity->SetMarkerColor(kGreen); hPurity->SetMarkerStyle(21); hPurity->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hPurity->SetStats(0); hPurity->GetYaxis()->SetRangeUser(0,100); hPurity->SetTitle("Efficiency & Purity"); hEff->Divide(hPerfect,hAllMC,1,1,"b"); hEff->Multiply(&f1); hEff->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hEff->SetMarkerColor(kBlue); hEff->SetMarkerStyle(21); hEff->SetStats(0); hFake->Divide(hImperfect,hAllMC,1,1,"b"); hFake->Multiply(&f1); hFake->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hFake->SetMarkerColor(kRed); hFake->SetMarkerStyle(21); hFake->SetStats(0); hAnna->Divide(hAllFound,hAllMC,1,1,"b"); hAnna->Multiply(&f1); hAnna->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hAnna->SetMarkerColor(kBlack); hAnna->SetMarkerStyle(21); hAnna->SetStats(0); TCanvas *c1 = new TCanvas("c1","NoMCTrackFound");//,200,10,900,900); TVirtualPad *pad = c1->cd(); pad->SetGridx(); pad->SetGridy(); hNoMCTrack->Draw(); TCanvas *c2 = new TCanvas("c2","Eff&Purity");//,200,10,900,900); TVirtualPad *pad = c2->cd(); pad->SetGridx(); pad->SetGridy(); // pad->SetLogx(); hPurity->Draw("E"); hEff->Draw("Same E"); hFake->Draw("Same E"); hAnna->Draw("Same E"); TLegend *leg = new TLegend(0.1,0.8,0.6,0.9);leg->SetFillColor(0); leg->AddEntry(hPurity,"Purity (\"Perfect tracks\" within \"Found Tracks\")","PE"); leg->AddEntry(hEff,"Efficiency (\"Perfect tracks\" within \"MC findable Tracks\")","PE"); leg->AddEntry(hFake,"Fake (\"Inperfect tracks\" within \"MC findable Tracks\")","PE"); leg->AddEntry(hAnna,"AnnaLisa - Efficiency (\"Found tracks\" within \"MC findable Tracks\")","PE"); leg->Draw(); if (plotFlag==1){ hAllMC->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hAllMC->Draw(); // MC pt distribution hAllFound->SetLineColor(2); hAllFound->Draw("same"); // MC pt distribution } /* .L ~/ITSupgrade/BuildDetector/DetectorK.cxx+ // All NEW DetectorK its("ALICE","ITS"); its.MakeAliceAllNew(0); its.SetMaxRadiusOfSlowDetectors(0.01); its.SolveViaBilloir(0); TGraph *c = its.GetGraphRecoEfficiency(0,3,2); c->Draw("C"); // Current DetectorK its("ALICE","ITS"); its.MakeAliceCurrent(0,0); its.SetMaxRadiusOfSlowDetectors(0.01); its.SolveViaBilloir(0); TGraph *c = its.GetGraphRecoEfficiency(0,4,2); c->Draw("C"); */ TCanvas *c3 = new TCanvas("c3","impact");//,200,10,900,900); c3->Divide(2,1); c3->cd(1); // Impact parameter // Impact parameter resolution --------------- h2Ddca->Draw("colz"); h2Ddca->FitSlicesY() ; TH2D *dcaM = (TH2D*)gDirectory->Get("dca2D_1"); dcaM->Draw("same"); TH2D *dcaRMS = (TH2D*)gDirectory->Get("dca2D_2"); //dcaRMS->Draw(); TGraphErrors *d0 = new TGraphErrors(); for (Int_t ibin =1; ibin<=dcaRMS->GetXaxis()->GetNbins(); ibin++) { d0->SetPoint( ibin-1,dcaRMS->GetBinCenter(ibin),dcaRMS->GetBinContent(ibin)*1e4); // microns d0->SetPointError(ibin-1,0,dcaRMS->GetBinError(ibin)*1e4); // microns } d0->SetMarkerStyle(21); d0->SetMaximum(200); d0->SetMinimum(0); d0->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); d0->GetYaxis()->SetTitle("R-#phi Pointing Resolution (#mum)"); d0->SetName("dca"); d0->SetTitle("DCAvsPt"); c3->cd(1); h2Ddca->Draw("surf2"); c3->cd(2); d0->Draw("APE"); // PT RESOLUTION ------------ TCanvas *c4 = new TCanvas("c4","pt resolution");//,200,10,900,900); c4->Divide(2,1); c4->cd(1); // Impact parameter h2Dpt->Draw("colz"); h2Dpt->FitSlicesY() ; TH2D *dPtM = (TH2D*)gDirectory->Get("dPt2D_1"); dPtM->Draw("same"); TH2D *dPtRMS = (TH2D*)gDirectory->Get("dPt2D_2"); // dPtRMS->Draw(""); TGraphErrors *gPt = new TGraphErrors(); for (Int_t ibin =1; ibin<=dPtRMS->GetXaxis()->GetNbins(); ibin++) { gPt->SetPoint( ibin-1,dPtRMS->GetBinCenter(ibin),dPtRMS->GetBinContent(ibin)); gPt->SetPointError(ibin-1,0,dPtRMS->GetBinError(ibin)); } gPt->SetMarkerStyle(21); gPt->SetMaximum(20); gPt->SetMinimum(0); gPt->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); gPt->GetYaxis()->SetTitle("relative momentum resolution (%)"); gPt->SetName("dPt"); gPt->SetTitle("DPTvsPt"); c4->cd(1); h2Dpt->Draw("surf2"); c4->cd(2); gPt->Draw("APE"); // EXPORT -------- TFile f("histos.root","RECREATE"); hMultCount->Write(); hAllMC->Write(); hAllFound->Write(); hImperfect->Write(); hPerfect->Write(); hNoMCTrack->Write(); hPurity->Write(); hEff->Write(); hFake->Write(); hAnna->Write(); h2Ddca->Write(); d0->Write(); h2Dpt->Write(); gPt->Write(); f.Close(); return; }
void plotMerged(Bool_t onlyPlot=0) { gStyle->SetPalette(1); TFile f("histoSum.root","UPDATE"); TH1F* hAllMC = f.Get("allMC"); TH1F* hAllFound= f.Get("allFound"); TH1F* hImperfect= f.Get("imperfect"); TH1F* hPerfect= f.Get("perfect"); TH1F* hNoMCTrack= f.Get("noMCtrack"); // have to be recalculated TH1F* hPurity = f.Get("purity"); TH1F* hEff= f.Get("efficiency"); TH1F* hFake= f.Get("fake"); TH1F* hAnna= f.Get("annaEff"); TH2D* h2Ddca= f.Get("dca2D"); TGraphErrors *d0= f.Get("dca"); TH2D* h2Dpt= f.Get("dPt2D"); TGraphErrors *gPt= f.Get("dPt"); if (!onlyPlot) { /* // Get Errors right hAllMC->Sumw2(); hAllFound->Sumw2(); hPerfect->Sumw2(); hImperfect->Sumw2(); h2Dpt->Sumw2(); h2Ddca->Sumw2(); */ // Efficiencies - and normalize to 100% TF1 f1("f1","100+x*0",0.,1.e3); hPurity->Divide(hPerfect,hAllFound,1,1,"b"); hPurity->Multiply(&f1); hPurity->SetMarkerColor(kGreen); hPurity->SetMarkerStyle(21); hPurity->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hPurity->SetStats(0); hPurity->GetYaxis()->SetRangeUser(0,100); hPurity->SetTitle("Efficiency & Purity"); hEff->Divide(hPerfect,hAllMC,1,1,"b"); hEff->Multiply(&f1); hEff->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hEff->SetMarkerColor(kBlue); hEff->SetMarkerStyle(21); hEff->SetStats(0); hFake->Divide(hImperfect,hAllMC,1,1,"b"); hFake->Multiply(&f1); hFake->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hFake->SetMarkerColor(kRed); hFake->SetMarkerStyle(21); hFake->SetStats(0); hAnna->Divide(hAllFound,hAllMC,1,1,"b"); hAnna->Multiply(&f1); hAnna->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); hAnna->SetMarkerColor(kBlack); hAnna->SetMarkerStyle(21); hAnna->SetStats(0); // Impact parameter resolution --------------- TCanvas *c3 = new TCanvas("c3","impact");//,200,10,900,900); c3->Divide(2,1); c3->cd(1); h2Ddca->DrawCopy("colz"); h2Ddca->FitSlicesY() ; TH2D *dcaM = (TH2D*)gDirectory->Get("dca2D_1"); dcaM->Draw("same"); TH2D *dcaRMS = (TH2D*)gDirectory->Get("dca2D_2"); //dcaRMS->Draw(); TGraphErrors *d0 = new TGraphErrors(); for (Int_t ibin =1; ibin<=dcaRMS->GetXaxis()->GetNbins(); ibin++) { d0->SetPoint( ibin-1,dcaRMS->GetBinCenter(ibin),dcaRMS->GetBinContent(ibin)*1e4); // microns d0->SetPointError(ibin-1,0,dcaRMS->GetBinError(ibin)*1e4); // microns } d0->SetMarkerStyle(21); d0->SetMaximum(200); d0->SetMinimum(0); d0->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); d0->GetYaxis()->SetTitle("R-#phi Pointing Resolution (#mum)"); d0->SetName("dca"); d0->SetTitle("DCAvsPt"); // c3->cd(1); h2Ddca->Draw("surf2"); c3->cd(2); d0->Draw("APE"); // PT RESOLUTION ------------ TCanvas *c4 = new TCanvas("c4","pt resolution");//,200,10,900,900); c4->Divide(2,1); c4->cd(1); h2Dpt->DrawCopy("colz"); h2Dpt->FitSlicesY() ; TH2D *dPtM = (TH2D*)gDirectory->Get("dPt2D_1"); dPtM->Draw("same"); TH2D *dPtRMS = (TH2D*)gDirectory->Get("dPt2D_2"); // dPtRMS->Draw(""); TGraphErrors *gPt = new TGraphErrors(); for (Int_t ibin =1; ibin<=dPtRMS->GetXaxis()->GetNbins(); ibin++) { gPt->SetPoint( ibin-1,dPtRMS->GetBinCenter(ibin),dPtRMS->GetBinContent(ibin)); gPt->SetPointError(ibin-1,0,dPtRMS->GetBinError(ibin)); } gPt->SetMarkerStyle(21); gPt->SetMaximum(20); gPt->SetMinimum(0); gPt->GetXaxis()->SetTitle("transverse momentum p_{t} (GeV)"); gPt->GetYaxis()->SetTitle("relative momentum resolution (%)"); gPt->SetName("dPt"); gPt->SetTitle("DPTvsPt"); // c4->cd(1); h2Dpt->Draw("surf2"); c4->cd(2); gPt->Draw("APE"); // overwrite with normalized graphs hPurity->Write(); hEff->Write(); hFake->Write(); hAnna->Write(); h2Ddca->Write(); d0->Write(); h2Dpt->Write(); gPt->Write(); } // Plots TCanvas *c2 = new TCanvas("c2","Eff&Purity");//,200,10,900,900); TVirtualPad *pad = c2->cd(); pad->SetGridx(); pad->SetGridy(); // pad->SetLogx(); TLegend *leg = new TLegend(0.1,0.8,0.6,0.9);leg->SetFillColor(0); leg->AddEntry(hPurity,"Purity (\"Perfect tracks\" within \"Found Tracks\")","PE"); leg->AddEntry(hEff,"Efficiency (\"Perfect tracks\" within \"MC findable Tracks\")","PE"); leg->AddEntry(hFake,"Fake (\"Inperfect tracks\" within \"MC findable Tracks\")","PE"); leg->AddEntry(hAnna,"AnnaLisa - Efficiency (\"Found tracks\" within \"MC findable Tracks\")","PE"); hPurity->DrawCopy("E"); hEff->DrawCopy("Same E"); hFake->DrawCopy("Same E"); hAnna->DrawCopy("Same E"); leg->Draw(); c2->SaveAs("EffPlot.png"); f.Close(); }
void syst_MCeta(double E = 0.9 , int cut = 5){ int typeMC = 10; if(E==7){ cout<<"This systematic can't be applied to 7 TeV Data. Exiting now ..."<<endl; return; } ostringstream outstr(""); outstr << "hyp" << 1 << "_niter" << 0 << "_cut" << cut << "_DataType" << 0; TString tbase = fileManager(3,typeMC,E,1,0,0,outstr.str()); TFile* fbase = TFile::Open(tbase,"READ"); cout<<"Base file : "<<tbase<<endl; if(fbase==0){ cout<<"ERROR !! The base file is not present. Please run the code after making the base files ! Exiting now ..."<<endl; return; } TH1F* hbase = (TH1F*) fbase->Get("unfolding/nch_data_corrected"); if(hbase==0){ cout<<"ERROR !! The base plot is void. Exiting now ..."<<endl; return; } //------------------------------------------------------------------------------------ //------------------- Doing the eta dependence systematic ------------------------- //------------------------------------------------------------------------------------ // base = D6T , syst = 413 (mtx=ProQ20) //getting the syst base file outstr.str(""); outstr << "hyp" << 1 << "_niter" << 0 << "_cut" << cut << "_DataType" << 10; TString tsyst1 = fileManager(3,10,0.9,1,0,0,outstr.str()); TFile* fsyst1 = TFile::Open(tsyst1,"READ"); cout<<"syst1 file : "<<tsyst1<<endl; if(fsyst1==0){ cout<<"ERROR !! The syst1 file is not present. Please run the code after making the syst1 files ! Exiting now ..."<<endl; return; } TH1F* hsyst1 = (TH1F*) fsyst1->Get("unfolding/nch_data_corrected"); if(hsyst1==0){ cout<<"ERROR !! The syst1 plot is void. Exiting now ..."<<endl; return; } //getting the syst syst file outstr.str(""); outstr << "hyp" << 1 << "_niter" << 0 << "_cut" << cut << "_DataType" << 10; TString tsyst2 = fileManager(3,10,0.9,1,413,-1,outstr.str()); TFile* fsyst2 = TFile::Open(tsyst2,"READ"); cout<<"syst2 file : "<<tsyst2<<endl; if(fsyst2==0){ cout<<"ERROR !! The syst2 file is not present. Please run the code after making the syst2 files ! Exiting now ..."<<endl; return; } TH1F* hsyst2 = (TH1F*) fsyst2->Get("unfolding/nch_data_corrected"); if(hsyst2==0){ cout<<"ERROR !! The syst2 plot is void. Exiting now ..."<<endl; return; } TH1F* factor = new TH1F("factor","factor",hbase->GetNbinsX(),hbase->GetXaxis()->GetXbins()->GetArray()); if(E==0.9){ for(int i=1;i<=hbase->GetNbinsX();++i){ if(hsyst1->GetBinContent(i)!=0) factor->SetBinContent(i,hsyst2->GetBinContent(i) / hsyst1->GetBinContent(i)); else factor->SetBinContent(i,1.); } } else if(E==2.36){ double start = -0.5; double ratio = 1; if((getEdgeLastFilledBin(hsyst1) - start)!=0) ratio = (getEdgeLastFilledBin(hbase) - start) / (getEdgeLastFilledBin(hsyst1) - start); //part with no stretching for( int i = 1 ; i < hbase->GetXaxis()->FindFixBin(start) ; ++i ){ if(hsyst1->GetBinContent(i)!=0) factor->SetBinContent(i,hsyst2->GetBinContent(i) / hsyst1->GetBinContent(i)); else factor->SetBinContent(i,1.); } //part with stretching for( int i = hbase->GetXaxis()->FindFixBin(start) ; i <= hbase->GetNbinsX() ; ++i ){ int bin = hsyst1->GetXaxis()->FindFixBin( (hbase->GetBinCenter(i)-start) / ratio + start); if(hsyst1->GetBinContent(bin)!=0) factor->SetBinContent(i,hsyst2->GetBinContent(bin) / hsyst1->GetBinContent(bin)); else factor->SetBinContent(i,1.); } } TH1F* hsyst = (TH1F*) hbase->Clone("eta_syst"); hsyst->Multiply(factor); TMoments* msyst = new TMoments(hsyst); msyst->ComputeMoments(); msyst->print(); //Making output file outstr.str(""); outstr << "hyp" << 1 << "_niter" << 0 << "_cut" << cut << "_DataType" << 0; TString toutput = fileManager(3,typeMC,E,1,500,-1,outstr.str()); TFile* foutput = TFile::Open(toutput,"RECREATE"); cout<<"Output file : " << toutput << endl; //Making kno plot double knomean = hsyst->GetMean(); TString tkno = toutput; tkno.ReplaceAll("plots/","plots/current_b1_2/"); cout<<"Opening for kno mean the file : "<<tkno<<endl; TFile* fkno = TFile::Open(tkno,"READ"); if(fkno!=0){ TMoments* mom_kno = (TMoments*) fkno->Get("unfolding/moments/moments"); knomean = mom_kno->mean->GetMean(); } else{ cout<<"WARNING !! The file does not exist, taking the mean of the hist instead"<<endl; } TH1F* kno = new TH1F("kno_corrected","kno_corrected;z = n_{ch} / < n_{ch} >;#psi(z)",hsyst->GetNbinsX(),Divide(hsyst->GetXaxis()->GetXbins(),knomean)); kno->Sumw2(); /*for( int k = 60 ; k <= nch_corrected->GetNbinsX() ; ++k) nch_corrected->SetBinContent(k,0);*/ for( int k = 1 ; k <= hsyst->GetNbinsX() ; ++k){ kno->SetBinContent(k , knomean * hsyst->GetBinContent(k) / hsyst->Integral()); kno->SetBinError(k , knomean * hsyst->GetBinError(k) / hsyst->Integral()); } foutput->cd(); foutput->mkdir("unfolding"); foutput->cd("unfolding"); factor->Write(); hsyst->Write("nch_data_corrected"); kno->Write(); gDirectory->mkdir("moments"); gDirectory->cd("moments"); msyst->Write("moments"); foutput->Close(); }
void MakePi0Analysis(){ gStyle->SetPadLeftMargin(0.15); gStyle->SetPadRightMargin(0.01); gStyle->SetPadTopMargin(0.09); gStyle->SetPadBottomMargin(0.11); //gStyle->SetOptStat(0); //gStyle->SetOptTitle(1); //gStyle->SetPadTickX(1); //gStyle->SetPadTickY(1); TGaxis::SetMaxDigits(3); Double_t bins[] = {1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8,3.0, 3.2, 3.4, 3.6,3.8,4.0,4.5, 5.0, 5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,10.0,11,12}; //Nicolas LHC12d PHI const Int_t binnum = sizeof(bins)/sizeof(Double_t) - 1; TString cwd = gSystem->WorkingDirectory(); TH1F* fHistPeakMean = new TH1F("fHistPeakMean","",binnum,bins); TH1F* fHistPeakWidth = new TH1F("fHistPeakWidth","",binnum,bins); TH1F* fHistRawYield = new TH1F("fHistRawYield","",binnum,bins); TH1F* fHistRawYieldPerEvent = new TH1F("fHistRawYieldPerEvent","",binnum,bins); TCanvas *c1[binnum]; TCanvas *c2[binnum]; TCanvas *c3; TFile* ef = TFile::Open("../AnalysisResults.root"); TList* list = (TList*)ef->Get("list_kINT7_Pi0"); TList *listEv = (TList*)ef->Get("list_kINT7_Event"); TH1F* fHistEvents = (TH1F*)listEv->FindObject("fHistAnalyzedEvents"); Double_t nEvt = fHistEvents->GetEntries(); TString tofName[] = {"","_TOFcut1","_TOFcut2"}; TString fitName[] = {"CrystalBall","AsymmGauss"}; TString modName[] = {"","_M1","_M3"}; Int_t ntof = 3; Double_t signal_range_min=0.11; Double_t signal_range_max=0.15; Double_t bg_range_min=0.050; Double_t bg_range_max=0.250; for(Int_t itof=0; itof<ntof; ++itof){ for(Int_t iMod=0; iMod<1; iMod++){ for(Int_t iFit=0; iFit<2; iFit++){ for(Int_t iPol=0; iPol<3; iPol++){ Int_t pol = iPol; TString fNameSame = "fHistMassTwoGammas"+tofName[itof]+modName[iMod]; TString fNameMix = "fHistMixMassTwoGammas"+tofName[itof]+modName[iMod]; THnSparse *fTHnSparseRecPi0; THnSparse *fTHnSparseRecMixPi0; THnSparse *fTHnSparseGeneratePi0; TH2* hPi0A08 = 0x0; TH2* hMixPi0A08 = 0x0; hPi0A08 = (TH2*)list->FindObject(fNameSame)->Clone(); hMixPi0A08 = (TH2*)list->FindObject(fNameMix)->Clone(); Int_t sbin = 0; Int_t lbin = 0; TH1F* fHistFinalRatio[binnum]; TH1F* fHistFinalSame[binnum]; TH1F* fHistFinalBG[binnum]; TH1F* fHistFinalSignal[binnum]; TH1F* fHistOnlyFitSignal[binnum]; TF1* fFitFinalRatio[binnum]; TF1* fFitFinalSignal[binnum]; TF1* fFitOnlyFitSignal[binnum]; for(Int_t i=0; i<binnum; i++){ Double_t bin_width = (bins[i+1]-bins[i]); Double_t bin_mean = (bins[i+1]+bins[i])/2; Int_t rebin = 1; if(bin_mean>5.0){ rebin=10; } else{ rebin=5; } Int_t sproj_bin = hPi0A08->GetYaxis()->FindBin(bins[i]); Int_t lproj_bin = hPi0A08->GetYaxis()->FindBin(bins[i+1])-1; TH1* fHistBasicSame = (TH1*)hPi0A08 ->ProjectionX(Form("fHistBasicSame_No%d",i+1),sproj_bin,lproj_bin,""); TH1* fHistBasicMix = (TH1*)hMixPi0A08->ProjectionX(Form("fHistBasicMix_No%d",i+1),sproj_bin,lproj_bin,""); fHistBasicSame->Rebin(rebin); fHistBasicMix->Rebin(rebin); fHistBasicSame->Sumw2(); fHistBasicMix->Sumw2(); fHistBasicSame->GetYaxis()->SetTitle(Form("dN/dM per %.0f MeV/c^{2}",fHistBasicSame->GetBinWidth(1)*1000)); fHistBasicMix->GetYaxis()->SetTitle(Form("dN/dM per %.0f MeV/c^{2}",fHistBasicSame->GetBinWidth(1)*1000)); fHistBasicSame->GetXaxis()->SetRange(fHistBasicSame->GetXaxis()->FindBin(0.),fHistBasicSame->GetXaxis()->FindBin(0.3)-1); fHistBasicMix->GetXaxis()->SetRange(fHistBasicSame->GetXaxis()->FindBin(0.),fHistBasicSame->GetXaxis()->FindBin(0.3)-1); fHistBasicSame->SetMarkerStyle(20); fHistBasicMix->SetMarkerStyle(24); fHistBasicSame->SetMarkerColor(kBlack); fHistBasicMix->SetMarkerColor(kBlue); fHistBasicSame->SetLineColor(kBlack); fHistBasicMix->SetLineColor(kBlue); fHistFinalSame[i] = (TH1F*)fHistBasicSame->Clone(); fHistOnlyFitSignal[i] = (TH1F*)fHistBasicSame->Clone(); fHistOnlyFitSignal[i]->SetName(Form("fHistOnlyFitSignal_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); TH1F* fHistOnlyFit_Signal = (TH1F*)fHistOnlyFitSignal[i]->Clone(); TH1F* fHistOnlyFit_BG = (TH1F*)fHistOnlyFitSignal[i]->Clone(); TH1F* fHistRatio = (TH1F*)fHistBasicSame->Clone(); fHistRatio->Divide(fHistBasicMix); fHistRatio->SetName(Form("cRatioSameBG_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); TH1F* fHistRatio_Signal = (TH1F*)fHistRatio->Clone(); TH1F* fHistRatio_BG = (TH1F*)fHistRatio->Clone(); Int_t ssignal_bin = fHistRatio_Signal->GetXaxis()->FindBin(signal_range_min); Int_t lsignal_bin = fHistRatio_Signal->GetXaxis()->FindBin(signal_range_max); Int_t sbg_bin = fHistRatio_BG->GetXaxis()->FindBin(bg_range_min); Int_t lbg_bin = fHistRatio_BG->GetXaxis()->FindBin(bg_range_max); for(Int_t j=ssignal_bin; j<lsignal_bin; ++j){ fHistRatio_BG->SetBinContent(j,0); fHistRatio_BG->SetBinError(j,0); fHistOnlyFit_BG->SetBinContent(j,0); fHistOnlyFit_BG->SetBinError(j,0); } for(Int_t j=sbg_bin; j<ssignal_bin; ++j){ fHistRatio_Signal->SetBinContent(j,0); fHistRatio_Signal->SetBinError(j,0); fHistOnlyFit_Signal->SetBinContent(j,0); fHistOnlyFit_Signal->SetBinError(j,0); } for(Int_t j=lsignal_bin; j<lbg_bin; ++j){ fHistRatio_Signal->SetBinContent(j,0); fHistRatio_Signal->SetBinError(j,0); fHistOnlyFit_Signal->SetBinContent(j,0); fHistOnlyFit_Signal->SetBinError(j,0); } /////////////////////////////////////////////////////////////////////////////////////////////////// // Combinatrial background analysis /////////////////////////////////////////////////////////////////////////////////////////////////// TF1 *fFitRatio_Signal = NULL; if(iFit==0){ fFitRatio_Signal = new TF1("fFitRatio_Signal", "[4]*((x-[2])/[3] > -[0] ? 1.0:0.0 )*exp(-pow(x-[2],2)/(2*pow([3],2))) + ((x-[2])/[3] <= -[0] ? 1.0:0.0 )*[4]*pow([1]/[0],[1])*exp(-[0]*[0]/2) * pow([1]/[0]-[0]-(x-[2])/[3],-[1])+[5]", signal_range_min,signal_range_max); fFitRatio_Signal->SetParameters(1.,6.,0.135,0.005,0.01); fFitRatio_Signal->FixParameter(0,1.16053); fFitRatio_Signal->FixParameter(1,6.); fFitRatio_Signal->SetParLimits(2,0.130,0.140); fFitRatio_Signal->SetParLimits(3,0.005,0.03); } else if(iFit==1){//[0]=A, [1]=M_pi0, [2]=sigma, [3]=lamda fFitRatio_Signal = new TF1("fFitRatio_Signal", "[0] *( ([1]>x ? 1.0:0.0 ) * (1 - exp(-0.5*pow((x-[1])/[2],2))) * exp((x-[1])/[3]) + exp(-0.5*pow((x-[1])/[2],2)) )", signal_range_min,signal_range_max); fFitRatio_Signal->SetParameters(1,0.135,6.46624e-03,7.47626e-03); fFitRatio_Signal->SetParLimits(1,0.130,0.140); fFitRatio_Signal->SetParLimits(2,0.001,0.03); fFitRatio_Signal->SetParLimits(3,0.001,0.03); } fHistRatio_Signal->Fit(fFitRatio_Signal,"RNQ"); fHistRatio_Signal->Fit(fFitRatio_Signal,"RNQ"); fHistRatio_Signal->Fit(fFitRatio_Signal,"RNQ"); TF1 *fFitRatio_BG = 0x0; if(pol==0){ fFitRatio_BG = new TF1("fFitRatio_BG","[0]",0,1); } else if(pol==1){ fFitRatio_BG = new TF1("fFitRatio_BG","[0]+[1]*x",0,1); } else if(pol==2){ fFitRatio_BG = new TF1("fFitRatio_BG","[0]+[1]*x+[2]*x*x",0,1); } fHistRatio_BG->Fit(fFitRatio_BG,"RNQ","",bg_range_min,bg_range_max); fHistRatio_BG->Fit(fFitRatio_BG,"RNQ","",bg_range_min,bg_range_max); fHistRatio_BG->Fit(fFitRatio_BG,"RNQ","",bg_range_min,bg_range_max); TF1 *fFitRatio_SignalBG = 0x0; TF1 *fFitScale = 0x0; if(iFit==0){ if(pol==0){ fFitRatio_SignalBG= new TF1("fFitRatio_SignalBG", "[4]*((x-[2])/[3] > -[0] ? 1.0:0.0 )*exp(-pow(x-[2],2)/(2*pow([3],2))) + ((x-[2])/[3] <= -[0] ? 1.0:0.0 )*[4]*pow([1]/[0],[1])*exp(-[0]*[0]/2) * pow([1]/[0]-[0]-(x-[2])/[3],-[1])+[5]",0,1); fFitRatio_SignalBG->SetParameter(0,fFitRatio_Signal->GetParameter(0)); fFitRatio_SignalBG->SetParameter(1,fFitRatio_Signal->GetParameter(1)); fFitRatio_SignalBG->SetParameter(2,fFitRatio_Signal->GetParameter(2)); fFitRatio_SignalBG->SetParameter(3,fFitRatio_Signal->GetParameter(3)); fFitRatio_SignalBG->SetParameter(4,fFitRatio_Signal->GetParameter(4)); fFitRatio_SignalBG->SetParameter(5,fFitRatio_BG->GetParameter(0)); fFitScale = new TF1("fFitScale","pol0",0.,1); } else if(pol==1){ fFitRatio_SignalBG = new TF1("fFitRatio_SignalBG", "[4]*((x-[2])/[3] > -[0] ? 1.0:0.0 )*exp(-pow(x-[2],2)/(2*pow([3],2))) + ((x-[2])/[3] <= -[0] ? 1.0:0.0 )*[4]*pow([1]/[0],[1])*exp(-[0]*[0]/2) * pow([1]/[0]-[0]-(x-[2])/[3],-[1])+[5]+[6]*x", 0,1); fFitRatio_SignalBG->SetParameter(0,fFitRatio_Signal->GetParameter(0)); fFitRatio_SignalBG->SetParameter(1,fFitRatio_Signal->GetParameter(1)); fFitRatio_SignalBG->SetParameter(2,fFitRatio_Signal->GetParameter(2)); fFitRatio_SignalBG->SetParameter(3,fFitRatio_Signal->GetParameter(3)); fFitRatio_SignalBG->SetParameter(4,fFitRatio_Signal->GetParameter(4)); fFitRatio_SignalBG->SetParameter(5,fFitRatio_BG->GetParameter(0)); fFitScale = new TF1("fFitScale","pol1",0,1); } else if(pol==2){ fFitRatio_SignalBG = new TF1("fFitRatio_SignalBG", "[4]*((x-[2])/[3] > -[0] ? 1.0:0.0 )*exp(-pow(x-[2],2)/(2*pow([3],2))) + ((x-[2])/[3] <= -[0] ? 1.0:0.0 )*[4]*pow([1]/[0],[1])*exp(-[0]*[0]/2) * pow([1]/[0]-[0]-(x-[2])/[3],-[1])+[5]+[6]*x+[7]*x*x",0,1); fFitRatio_SignalBG->SetParameter(0,fFitRatio_Signal->GetParameter(0)); fFitRatio_SignalBG->SetParameter(1,fFitRatio_Signal->GetParameter(1)); fFitRatio_SignalBG->SetParameter(2,fFitRatio_Signal->GetParameter(2)); fFitRatio_SignalBG->SetParameter(3,fFitRatio_Signal->GetParameter(3)); fFitRatio_SignalBG->SetParameter(4,fFitRatio_Signal->GetParameter(4)); fFitRatio_SignalBG->SetParameter(5,fFitRatio_BG->GetParameter(0)); fFitRatio_SignalBG->SetParameter(6,fFitRatio_BG->GetParameter(1)); fFitRatio_SignalBG->SetParameter(7,fFitRatio_BG->GetParameter(2)); fFitScale = new TF1("fFitScale","pol2",0,1); } fFitRatio_SignalBG->FixParameter(0,1.16053); fFitRatio_SignalBG->FixParameter(1,6.); fFitRatio_SignalBG->SetParLimits(2,0.130,0.140); fFitRatio_SignalBG->SetParLimits(3,0.005,0.03); } if(iFit==1){ if(pol==0){ fFitRatio_SignalBG= new TF1("fFitRatio_SignalBG", "[0] *( ([1]>x ? 1.0:0.0 ) * (1 - exp(-0.5*pow((x-[1])/[2],2))) * exp((x-[1])/[3]) + exp(-0.5*pow((x-[1])/[2],2)) ) + [4]", 0,1); fFitRatio_SignalBG->SetParameter(0,fFitRatio_Signal->GetParameter(0)); fFitRatio_SignalBG->SetParameter(1,fFitRatio_Signal->GetParameter(1)); fFitRatio_SignalBG->SetParameter(2,fFitRatio_Signal->GetParameter(2)); fFitRatio_SignalBG->SetParameter(3,fFitRatio_Signal->GetParameter(3)); fFitRatio_SignalBG->SetParameter(4,fFitRatio_BG->GetParameter(0)); fFitScale = new TF1("fFitScale","pol0",0,1); } else if(pol==1){ fFitRatio_SignalBG = new TF1("fFitRatio_SignalBG", "[0] *( ([1]>x ? 1.0:0.0 ) * (1 - exp(-0.5*pow((x-[1])/[2],2))) * exp((x-[1])/[3]) + exp(-0.5*pow((x-[1])/[2],2)) ) + [4]+[5]*x", 0,1); fFitRatio_SignalBG->SetParameter(0,fFitRatio_Signal->GetParameter(0)); fFitRatio_SignalBG->SetParameter(1,fFitRatio_Signal->GetParameter(1)); fFitRatio_SignalBG->SetParameter(2,fFitRatio_Signal->GetParameter(2)); fFitRatio_SignalBG->SetParameter(3,fFitRatio_Signal->GetParameter(3)); fFitRatio_SignalBG->SetParameter(4,fFitRatio_BG->GetParameter(0)); fFitRatio_SignalBG->SetParameter(5,fFitRatio_BG->GetParameter(1)); fFitScale = new TF1("fFitScale","pol1",0,1); } else if(pol==2){ fFitRatio_SignalBG = new TF1("fFitRatio_SignalBG", "[0] *( ([1]>x ? 1.0:0.0 ) * (1 - exp(-0.5*pow((x-[1])/[2],2))) * exp((x-[1])/[3]) + exp(-0.5*pow((x-[1])/[2],2)) ) + [4]+[5]*x+[6]*x*x", 0,1); fFitRatio_SignalBG->SetParameter(0,fFitRatio_Signal->GetParameter(0)); fFitRatio_SignalBG->SetParameter(1,fFitRatio_Signal->GetParameter(1)); fFitRatio_SignalBG->SetParameter(2,fFitRatio_Signal->GetParameter(2)); fFitRatio_SignalBG->SetParameter(3,fFitRatio_Signal->GetParameter(3)); fFitRatio_SignalBG->SetParameter(4,fFitRatio_BG->GetParameter(0)); fFitRatio_SignalBG->SetParameter(5,fFitRatio_BG->GetParameter(1)); fFitRatio_SignalBG->SetParameter(6,fFitRatio_BG->GetParameter(2)); fFitScale = new TF1("fFitScale","pol2",0,1); } fFitRatio_SignalBG->SetParLimits(1,0.130,0.140); fFitRatio_SignalBG->SetParLimits(2,0.005,0.03); fFitRatio_SignalBG->SetParLimits(3,0.005,0.03); } fHistRatio->Fit(fFitRatio_SignalBG,"NRQ","",bg_range_min,bg_range_max); fHistRatio->Fit(fFitRatio_SignalBG,"NRQ","",bg_range_min,bg_range_max); fHistRatio->Fit(fFitRatio_SignalBG,"NRQ","",bg_range_min,bg_range_max); fHistFinalRatio[i] = (TH1F*)fHistRatio->Clone();; fFitFinalRatio[i] = (TF1*)fFitRatio_SignalBG->Clone(); if(iFit==0){ if(pol==0){ fFitScale->SetParameter(0,fFitRatio_SignalBG->GetParameter(5)); } else if(pol==1){ fFitScale->SetParameters(fFitRatio_SignalBG->GetParameter(5),fFitRatio_SignalBG->GetParameter(6)); } else if(pol==2){ fFitScale->SetParameters(fFitRatio_SignalBG->GetParameter(5),fFitRatio_SignalBG->GetParameter(6),fFitRatio_SignalBG->GetParameter(7)); } } if(iFit==1){ if(pol==0){ fFitScale->SetParameter(0,fFitRatio_SignalBG->GetParameter(4)); } else if(pol==1){ fFitScale->SetParameters(fFitRatio_SignalBG->GetParameter(4),fFitRatio_SignalBG->GetParameter(5)); } else if(pol==2){ fFitScale->SetParameters(fFitRatio_SignalBG->GetParameter(4),fFitRatio_SignalBG->GetParameter(5),fFitRatio_SignalBG->GetParameter(6)); } } c3 = new TCanvas("c3","c3",600,600); c3->cd(); fHistRatio->Draw(); fFitRatio_SignalBG->Draw("same"); fFitScale->Draw("same"); c3->SetName(Form("cRatioSameBG_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); tfout->WriteTObject(c3); TH1F* fHistScaledMix = (TH1F*)fHistBasicMix->Clone(); fHistScaledMix->Multiply(fFitScale); fHistFinalBG[i] = (TH1F*)fHistScaledMix->Clone();; TH1F* fHistSignal = (TH1F*)fHistBasicSame->Clone(); fHistSignal->SetName(Form("fHistSignal_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); fHistScaledMix->SetName(Form("fHistScaledMix_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); tfout->WriteTObject(fHistSignal); tfout->WriteTObject(fHistScaledMix); for(Int_t j=0; j<fHistBasicSame->GetXaxis()->FindBin(0.3); ++j){ Double_t same = fHistSignal->GetBinContent(j); Double_t e_same = fHistSignal->GetBinError(j); Double_t mix = fHistScaledMix->GetBinContent(j); Double_t e_mix = fHistScaledMix->GetBinError(j); Double_t signal = same - mix; Double_t e_signal = sqrt(pow(e_same,2)+pow(e_mix,2)); if(same>0){ signal = same - mix; e_signal = sqrt(pow(e_same,2)+pow(e_mix,2)); } else{ signal = same; e_signal = e_same; } fHistSignal->SetBinContent(j,signal); fHistSignal->SetBinError(j,e_signal); } fHistFinalSignal[i] = (TH1F*)fHistSignal->Clone(); fHistFinalSignal[i]->SetTitle(Form("%.2f < #it{p}_{T} %.2f (GeV/c)", bins[i], bins[i+1])); TF1 *fFitSignal = NULL; if(iFit==0){ fFitSignal = new TF1("fFitSignal", "[4]*((x-[2])/[3] > -[0] ? 1.0:0.0 )*exp(-pow(x-[2],2)/(2*pow([3],2))) + ((x-[2])/[3] <= -[0] ? 1.0:0.0 )*[4]*pow([1]/[0],[1])*exp(-[0]*[0]/2) * pow([1]/[0]-[0]-(x-[2])/[3],-[1])", 0,0.3); fFitSignal->SetParameters(1.,6.,0.135,0.005,0.01); fFitSignal->FixParameter(0,1.16053); fFitSignal->FixParameter(1,6.); fFitSignal->SetParLimits(2,0.120,0.140); fFitSignal->SetParLimits(3,0.005,0.03); } else if(iFit==1){ fFitSignal = new TF1("fFitSignal", "[0] *( ([1]>x ? 1.0:0.0 ) * (1 - exp(-0.5*pow((x-[1])/[2],2))) * exp((x-[1])/[3]) + exp(-0.5*pow((x-[1])/[2],2)) )", 0,0.3); fFitSignal->SetParameters(1,0.135,6.46624e-03,7.47626e-03); fFitSignal->SetParLimits(1,0.125,0.140); fFitSignal->SetParLimits(2,0.001,0.01); fFitSignal->SetParLimits(3,0.001,0.01); } fHistSignal->Fit(fFitSignal,"RNQ","",signal_range_min,signal_range_max); fHistSignal->Fit(fFitSignal,"RNQ","",0.12,signal_range_max); if(iFit==0){ fHistSignal->Fit(fFitSignal,"RNQ","",0.12,0.150); } else{ fHistSignal->Fit(fFitSignal,"RNQ","",0.12,0.150); } fFitFinalSignal[i] = (TF1*)fFitSignal->Clone(); Double_t mean = 0; Double_t e_mean = 0; Double_t signal_sigma = 0; Double_t e_signal_sigma = 0; Double_t signal_window_min = 0; Double_t signal_window_max = 0; if(iFit==0){ mean = fFitSignal->GetParameter(2); e_mean = fFitSignal->GetParError(2); signal_sigma = fabs(fFitSignal->GetParameter(3)); e_signal_sigma = fabs(fFitSignal->GetParError(3)); signal_window_min = mean - signal_sigma*5; signal_window_max = mean + signal_sigma*3; } else if(iFit==1){ mean = fFitSignal->GetParameter(1); e_mean = fFitSignal->GetParError(1); signal_sigma = fabs(fFitSignal->GetParameter(2)); e_signal_sigma = fabs(fFitSignal->GetParError(2)); signal_window_min = mean - signal_sigma*5; signal_window_max = mean + signal_sigma*3; } fHistPeakMean->SetBinContent(i+1,mean); fHistPeakMean->SetBinError(i+1,e_mean); fHistPeakWidth->SetBinContent(i+1,signal_sigma); fHistPeakWidth->SetBinError(i+1,e_signal_sigma); Int_t signal_window_bin_min = fHistSignal->GetXaxis()->FindBin(signal_window_min); Int_t signal_window_bin_max = fHistSignal->GetXaxis()->FindBin(signal_window_max); Double_t num_pi0 = 0; Double_t e_num_pi0 = 0; for(Int_t j=signal_window_bin_min; j<signal_window_bin_max; ++j){ num_pi0 += fHistSignal->GetBinContent(j); e_num_pi0 += pow(fHistSignal->GetBinError(j),2); } e_num_pi0 = sqrt(e_num_pi0); fHistRawYield->SetBinContent(i+1,num_pi0/bin_width); fHistRawYield->SetBinError(i+1,e_num_pi0/bin_width); } fHistRawYield->SetName(Form("fHistRawYieldPol%d",pol)+fitName[iFit]+tofName[itof]+modName[iMod]); tfout->WriteTObject(fHistRawYield); fHistRawYieldPerEvent = (TH1F*)fHistRawYield->Clone(); fHistRawYieldPerEvent->Scale(1./nEvt); fHistRawYieldPerEvent->SetName(Form("fHistRawYieldPerEventPol%d",pol)+fitName[iFit]+tofName[itof]+modName[iMod]); tfout->WriteTObject(fHistRawYieldPerEvent); fHistPeakMean->SetName(Form("fHistPeakMeanPol%d",pol)+fitName[iFit]+tofName[itof]+modName[iMod]); fHistPeakWidth->SetName(Form("fHistPeakWidthPol%d",pol)+fitName[iFit]+tofName[itof]+modName[iMod]); tfout->WriteTObject(fHistPeakMean); tfout->WriteTObject(fHistPeakWidth); c1[itof] = new TCanvas("c1"+fitName[iFit]+tofName[itof],"",1200,1800); c2[itof] = new TCanvas("c2"+fitName[iFit]+tofName[itof],"",1200,1800); c1[itof]->Divide(4,6); for(Int_t i=0; i<binnum; ++i){ c1[itof]->cd(i+1); fHistFinalSignal[i]->Draw(); fFitFinalSignal[i]->Draw("same"); } c1[itof]->SaveAs(Form("cInvariantMassSpectrumPol%d",pol)+fitName[iFit]+tofName[itof]+modName[iMod]+".eps"); c2[itof]->Divide(4,6); for(Int_t i=0; i<binnum; ++i){ c2[itof]->cd(i+1); fHistFinalSame[i]->Draw(); fHistFinalBG[i]->Draw("same"); } c2[itof]->SaveAs(Form("cSameScaledMixPol%d",pol)+fitName[iFit]+tofName[itof]+modName[iMod]+".eps"); for(Int_t i=0; i<binnum; ++i){ fHistFinalSignal[i]->SetName(Form("fHistFinalSignal_No%d_Pol%d",i+1,iPol)+fitName[iFit]+tofName[itof]+modName[iMod]); fFitFinalSignal[i]->SetName(Form("fFitFinalSignal_No%d_Pol%d",i+1,iPol)+fitName[iFit]+tofName[itof]+modName[iMod]); fHistFinalSame[i]->SetName(Form("fHistFinalSame_No%d_Pol%d",i+1,iPol)+fitName[iFit]+tofName[itof]+modName[iMod]); fHistFinalBG[i]->SetName(Form("fHistFinalBG_No%d_Pol%d",i+1,iPol)+fitName[iFit]+tofName[itof]+modName[iMod]); tfout->WriteTObject(fHistFinalSignal[i]); tfout->WriteTObject(fFitFinalSignal[i]); tfout->WriteTObject(fHistFinalSame[i]); tfout->WriteTObject(fHistFinalBG[i]); c3 = new TCanvas("c3","",600,600); c3->cd(1); fHistFinalSame[i]->Draw(); fHistFinalBG[i]->Draw("same"); c3->SetName(Form("cRawSignalBG_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); //tfout->WriteTObject(c3); } for(Int_t i=0; i<binnum; ++i){ c3 = new TCanvas("c3","",600,600); c3->cd(1); fHistFinalSignal[i]->Draw(""); fFitFinalSignal[i]->Draw("same"); c3->SetName(Form("cRawSignal_Pol%d_No%d",pol,i+1)+fitName[iFit]+tofName[itof]+modName[iMod]); //tfout->WriteTObject(c3); } } } } } }