///output operator ostream& StatSample::print_tex (ostream& os, const string title) const { bool weightMode = _weight->nevents() > 0 ? true : false ; os << "" << endl; os << "% Efficiency table %" << endl; os << "" << endl; os << "\\begin{table}[p]" << endl; os << "\\begin{center}" << endl; os << "\\begin{tabular}{lrrr" ; if (weightMode) os << "r" ; os << "}" << endl; os << " \\hline \\hline" << endl; os << " Selection & Events & Relative & Total " ; if (weightMode) os << "& Total Corrected by Event Weights " ; os << "\\\\ \\hline" << endl; os << tex(eventSelection(0)->name()) << " & " ; os << nevents(0) << " & & " ; if (weightMode) os << " & " ; os << "\\\\ " << endl ; for (unsigned int n = 1; n < size() ; n++) { os << tex(eventSelection(n)->name()) << " & " ; os << nevents(n) << " & "; if (eventSelection(n)->isWeight()) { os << " $\\mathit{ " << eff(n) << " \\pm " << effErr(n) << " }$ & & " ; if (weightMode) os << " & " ; } else { os << " $ " << 100.0*eff(n) << " \\pm " << 100.0*effErr(n) << " ~\\% $ & " ; os << " $ " << 100.0*effGlob(n) << " \\pm " << 100.0*effErrGlob(n) << "~\\% $ " ; if (weightMode) os << " $ " << 100.0*correctedEfficiency(n) << " \\pm " << 100.0*correctedEffErr(n) << "~\\% $ " ; } os << " \\\\ " << endl ; } os << " \\hline " << endl; os << " \\hline" << endl; os << " \\end{tabular}" << endl; os << " \\caption{" << title << " Sample " << name() << " }" << endl; os << " \\label{Table:" << title.c_str() << ":" << name() << "}" << endl; os << "\\end{center}" << endl; os << "\\end{table}" << endl; os << endl; return os ; }
// Method by name TH1F* eff(const char* name1, const char* name2, const char* name="eff"){ // Get a list of object and their iterator TList* list = gDirectory->GetList() ; TIterator* iter = list->MakeIterator(); // Loop over objects, set the pointers TObject* obj; TH1F* h1=0; TH1F* h2=0; TString str1 = Form("%s",name1); TString str2 = Form("%s",name2); while(obj=iter->Next()) { TString objName = obj->GetName(); if (objName == str1) h1 = (TH1F*) obj; if (objName == str2) h2 = (TH1F*) obj; } // quit if not found if (h1 == 0) { cout << "Histogram " << name1 << " not found" << endl; return 0; } if (h2 == 0) { cout << "Histogram " << name2 << " not found" << endl; return 0; } // Call the method by pointer TH1F* temp = eff(h1, h2, name); return temp; }
/* INGETCURVE - find constants a, b, and c, such that the curve * z = cosh(a*(x-c))/a + b * passes through (x0, z0) and (x1, z1) and has arclength delta_s * Appropriate first guesses for a, b, and c should be given. */ HIDDEN int ingetcurve(fastf_t *pa, fastf_t *pb, fastf_t *pc, fastf_t delta_s, fastf_t *p_zero, fastf_t *p_one) { int status, i, j, k; fastf_t adjust; status = MAX_REACHED; i=0; while (i++<MAX_OUT_ITS) { for (j=0;j<MAX_ITS;j++) { adjust = eff(*pa, *pc, p_zero[X], p_one[X], delta_s); if ((*pa-adjust)<=0.0) { *pa *= 0.5; } else { *pa -= adjust; } if (adjust<F_TOL) { break; } } for (k=0;k<MAX_ITS;k++) { adjust = gee(*pa, *pc, p_zero[X], p_one[X], (p_one[Z]-p_zero[Z])); *pc -= adjust; if (adjust<G_TOL) { break; } } if ((j==0)&&(k==0)) { status = SOLVED; break; } } *pb = p_zero[Z] - cosh((*pa)*(p_zero[X]-(*pc)))/(*pa); return status; }
void gatherAEff(const char *inpFile=NULL) { std::string line; std::vector<std::string> lines; if (!inpFile) { std::cout << "\ninpFile=NULL\n"; std::cout << "Creating sample input file\n"; const char *sampleFName="aeff_sample.inp"; std::ofstream fout(sampleFName); fout << "../root_files/constants/DY_j22_19789pb/acceptance_constants1D.root\n"; fout << "../root_files/constants/DY_j22_19789pb/event_efficiency_constants1D.root\n"; fout << "../root_files/constants/DY_j22_19789pb/scale_factors_1D_Full2012_hltEffOld_PU.root\n"; fout.close(); std::cout << "check the file <" << sampleFName << ">\n"; std::cout << "1D/2D in the name does not matter\n"; return; } else { // load input std::ifstream finput(inpFile); if (!finput) { std::cout << "failed to open file <" << inpFile << ">\n"; return; } getline(finput,line); lines.push_back(line); std::cout << "line1=<" << line << ">\n"; getline(finput,line); lines.push_back(line); std::cout << "line2=<" << line << ">\n"; getline(finput,line); lines.push_back(line); std::cout << "line3=<" << line << ">\n"; finput.close(); } std::cout << dashline; std::string fnameAcc,fnameEff,fnameRho; int count=0; for (unsigned int i=0; i<lines.size(); ++i) { line=lines[i]; AdjustDim(line); if (PosOk(line,"acceptance")) { fnameAcc=line; count++; } else if (PosOk(line,"efficiency")) { fnameEff=line; count++; } else if (PosOk(line,"scale_factors")) { fnameRho=line; count++; } else { std::cout << "could not identify the file <" << line << ">\n"; return; } } if (count!=3) { std::cout << "not all files were identified\n"; return; } std::cout << "files were identified ok\n"; std::cout << dashline; TMatrixD effM(DYTools::nMassBins,DYTools::nYBinsMax); TMatrixD effErrM(effM); TMatrixD accM(effM), accErrM(effM); TMatrixD rhoM(effM), rhoErrM(effM); if (!LoadMatrix(fnameAcc,accM,accErrM,"acceptanceMatrix","acceptanceErrMatrix") || !LoadMatrix(fnameEff,effM,effErrM,"efficiencyArray","efficiencyErrArray") || !LoadMatrix(fnameRho,rhoM,rhoErrM,"scaleFactor","scaleFactorErr") ) { std::cout << "failed to load field\n"; return; } TString outFName; if (DYTools::study2D) { outFName="dyee_aeff_2D.root"; TFile fout(outFName,"recreate"); accM.Write("acceptance"); accErrM.Write("acceptanceErr"); effM.Write("efficiency"); effErrM.Write("efficiencyErr"); rhoM.Write("scaleFactor"); rhoErrM.Write("scaleFactorErr"); unfolding::writeBinningArrays(fout); for (int i=0; i<DYTools::nMassBins; ++i) { TString massRange=Form("_%1.0lf_%2.0lf",DYTools::massBinLimits[i],DYTools::massBinLimits[i+1]); TString hAccName=TString("hAcc") + massRange; Histo_t *hAcc=extractRapidityDependence(hAccName,"",accM,accErrM,i,0); TString hEffName=TString("hEff") + massRange; Histo_t *hEff=extractRapidityDependence(hEffName,"",effM,effErrM,i,0); TString hRhoName=TString("hRho") + massRange; Histo_t *hRho=extractRapidityDependence(hRhoName,"",rhoM,rhoErrM,i,0); if (!hAcc || !hEff || !hRho) { std::cout << "got unexpected null histo\n"; break; } hAcc->Write(); hEff->Write(); hRho->Write(); } fout.Close(); } else { // 1D case outFName="dyee_aeff_1D.root"; std::cout << "accM: rows " << accM.GetNrows() << ", cols " << accM.GetNcols() << "\n"; TVectorD eff(DYTools::nMassBins), effErr(eff); TVectorD acc(eff), accErr(eff); TVectorD rho(eff), rhoErr(eff); GetMassProfile1D(accM,accErrM, acc,accErr); GetMassProfile1D(effM,effErrM, eff,effErr); GetMassProfile1D(rhoM,rhoErrM, rho,rhoErr); Histo_t *hAcc=extractMassDependence("hAcc","",accM,accErrM,0,0,0); Histo_t *hEff=extractMassDependence("hEff","",effM,effErrM,0,0,0); Histo_t *hRho=extractMassDependence("hRho","",rhoM,rhoErrM,0,0,0); if (!hAcc || !hEff || !hRho) { std::cout << "got unexpected null histo\n"; } else { TFile fout(outFName,"recreate"); acc.Write("acceptance"); accErr.Write("acceptanceErr"); eff.Write("efficiency"); effErr.Write("efficiencyErr"); rho.Write("scaleFactor"); rhoErr.Write("scaleFactorErr"); unfolding::writeBinningArrays(fout); hAcc->Write(); hEff->Write(); hRho->Write(); fout.Close(); } } std::cout << "file <" << outFName << "> created\n"; return; }
void PrintSystematics(const std::string& filename, const unsigned int sr_num, const float scale_den = 1.0) { const std::string sr = GetSRLabel(static_cast<ss::SignalRegion::value_type>(sr_num)); // acceptance and systematic plots rt::TH1Container hc(filename); const float den = rt::Integral(hc[sr+"nGenerated"])*(scale_den); value_t num = IntegralAndError(hc[sr+"nPassing"]); value_t eff(num.value/den, num.value/den * (rt::Integral(hc[sr+"effErrStat"])/num.value)); /* eff.error = eff.value * (rt::Integral(hc[sr+"effErrStat"])/num.value); */ /* eff.error = sqrt(eff.value*(1.0 - eff.value)/den); */ value_t eff_per = eff; eff_per.value *= 100; eff_per.error *= 100; // systematics (percentage) const float jer = GetSyst(rt::Integral(hc[sr+"nJER" ]), num.value); const float jes = GetSyst(rt::Integral(hc[sr+"nJESUP" ]), rt::Integral(hc[sr+"nJESDN" ]), num.value); const float jes_up = GetSyst(rt::Integral(hc[sr+"nJESUP" ]), num.value); const float jes_dn = GetSyst(rt::Integral(hc[sr+"nJESDN" ]), num.value); const float beff = GetSyst(rt::Integral(hc[sr+"nBTAUP" ]), rt::Integral(hc[sr+"nBTADN" ]), num.value); const float beff_up = GetSyst(rt::Integral(hc[sr+"nBTAUP" ]), num.value); const float beff_dn = GetSyst(rt::Integral(hc[sr+"nBTADN" ]), num.value); const float met = GetSyst(rt::Integral(hc[sr+"nMETUP" ]), rt::Integral(hc[sr+"nMETDN" ]), num.value); const float met_up = GetSyst(rt::Integral(hc[sr+"nMETUP" ]), num.value); const float met_dn = GetSyst(rt::Integral(hc[sr+"nMETDN" ]), num.value); const float lep = GetSyst(rt::Integral(hc[sr+"nLepEffUP" ]), rt::Integral(hc[sr+"nLepEffDN" ]), num.value); const float trig = GetSyst(rt::Integral(hc[sr+"nTrigEffUP"]), rt::Integral(hc[sr+"nTrigEffDN"]), num.value); const float lumi = 4.4; const float pdf = 2.0; const float stat = eff.error; const float total = sqrt(pow(jes,2) + pow(jer,2) + pow(beff,2) + pow(met,2) + pow(lep,2) + pow(trig,2) + pow(lumi,2) + pow(pdf,2) + pow(stat,2)); CTable t; t.useTitle(); t.setTitle(Form("TTBar Acceptance SR %d", sr_num)); t.setTable() ( "value" , "rel unc (1 + dx)" ) ("# generated" , int(den) , "NA" ) ("# passing" , pm(num, "1.0f") , "NA" ) ("acceptance" , pm(eff, "1.5f") , "NA" ) ("acceptance" , pm(eff , "1.2e"), "NA" ) ("acceptance (%)" , pm(eff_per, "1.5f"), "NA" ) ("JES (%)" , jes , 1.0 + 0.01*jes ) ("JES+ (%)" , jes_up , 1.0 + 0.01*jes_up ) ("JES- (%)" , jes_dn , 1.0 + 0.01*jes_dn ) ("JER (%)" , jer , 1.0 + 0.01*jer ) ("Btag (%)" , beff , 1.0 + 0.01*beff ) ("Btag+ (%)" , beff_up , 1.0 + 0.01*beff_up ) ("Btag- (%)" , beff_dn , 1.0 + 0.01*beff_dn ) ("MET (%)" , met , 1.0 + 0.01*met ) ("MET+ (%)" , met_up , 1.0 + 0.01*met_up ) ("MET- (%)" , met_dn , 1.0 + 0.01*met_dn ) ("Trig (%)" , trig , 1.0 + 0.01*trig ) ("Lep (%)" , lep , 1.0 + 0.01*lep ) ("Lumi (%)" , lumi , 1.0 + 0.01*lumi ) ("Pdf (%)" , pdf , 1.0 + 0.01*pdf ) ("Stat (%)" , Form("%1.2e", stat), Form("%1.2e", stat)) ("Total (%)" , total , 1.0 + 0.01*total ) ; t.print(); cout << endl; }
ostream& StatSample::HtmlTable(ostream& os) const { bool weightMode = _weight->nevents() > 0 ? true : false ; os << "<TABLE BORDERCOLORDARK=\"996633\" BORDERCOLOR=\"CC9966\" BORDERCOLORLIGHT=\"FFCC99\" border=3 cellPadding=5 width=\"99%\">" << endl ; os << "<TBODY align=right>" << endl ; os << "<TR>" << endl ; os << "<TH align=left>" << endl ; os << "SELECTION" ; os << " </TH>" << endl ; if (weightMode) os << "<TH align=center colspan=4>" << endl ; else os << "<TH align=center colspan=3>" << endl ; os << name() << endl ; os << "</TH>" << endl ; os << "</TR>" << endl ; bool color = false ; for (unsigned int n = 0; n < size() ; n++) { if (color) { os << "<TR BGCOLOR=#bfefff>" << endl ; color = !color ; } else { os << "<TR>" << endl ; color = !color ; } os << "<TD align=left>" << endl ; os << eventSelection(n)->name() << endl ; os << "</TD>" << endl ; os << "<TD TITLE=\"Number of events\">" << endl ; os << nevents(n) << endl ; if (n==0) { os << "<TD> </TD> <TD> </TD>" ; if (weightMode) os << "<TD> </TD> " ; os << endl ; continue ; } if (eventSelection(n)->isWeight()) { if (eventSelection(n)->name() == eventWeight()->name()) os << "</TD> <TD TITLE=\"Global event weight\">" << endl ; else os << "</TD> <TD TITLE=\"Average weight\">" << endl ; os << eff(n) << "±" << effErr(n)<< endl ; os << "</TD> <TD>  </TD>"; if (weightMode) os << "<TD>  </TD>"; os << endl ; continue ; } os << "</TD><TD TITLE=\"Selection efficiency\">"<< endl ; os << 100.0*eff(n) << "±" << 100.0*effErr(n) << "%" << endl ; os << "</TD><TD TITLE=\"Global efficiency\">"<< endl ; os << 100.0*effGlob(n) << "±" << 100.0*effErrGlob(n) << "%" << endl ; os << "</TD>" << endl ; if (weightMode) { os << "</TD><TD TITLE=\"Global efficiency corrected by the event weight\">"<< endl ; os << 100.0*correctedEfficiency(n) << "±" << 100.0*correctedEffErr(n) << "%" << endl ; os << "</TD>" << endl ; } os << "</TR>" << endl ; } os << "</TBODY></TABLE>" << endl ; return os ; }
void doPseudoFits(const TString infilename, // input file const TString binname, // name const TString binfile, // file with bin info const Int_t sigModPass, // signal extraction method for PASS sample const Int_t bkgModPass, // background model for PASS sample const Int_t sigModFail, // signal extraction method for FAIL sample const Int_t bkgModFail, // background model for FAIL sample const TString outputDir, // output directory const Int_t charge, // 0 (no charge requirement), -1, +1 const TString mcfilename="") // ROOT file containing MC events to generate templates from { gBenchmark->Start("plotEff"); //-------------------------------------------------------------------------------------------------------------- // Settings //============================================================================================================== // signal extraction mass region const Double_t massLo = 60; const Double_t massHi = 120; // fit mass region const Double_t fitMassLo = massLo; const Double_t fitMassHi = massHi; gSystem->mkdir(outputDir,kTRUE); // // parse pseudodata file // TH1D* histPass = new TH1D("histPass","",Int_t(fitMassHi-fitMassLo)/BIN_SIZE_PASS,fitMassLo,fitMassHi); TH1D* histFail = new TH1D("histFail","",Int_t(fitMassHi-fitMassLo)/BIN_SIZE_FAIL,fitMassLo,fitMassHi); TString readInFile = infilename+"/"+binname; cout << readInFile << endl; ifstream ifs; ifs.open(readInFile.Data()); string line; while(getline(ifs,line)) { if(line[0]=='#') continue; if(line[0]=='%') continue; Double_t mass; Int_t state; stringstream ss(line); ss >> mass >> state; if (state == 1) histPass->Fill(mass); else if (state == 2) histFail->Fill(mass); } ifs.close(); cout << "histPass has " << histPass->GetEntries() << endl; cout << "histFail has " << histFail->GetEntries() << endl; cout << "total we have " << histPass->GetEntries()+histFail->GetEntries() << endl; // // get binning info // TFile *f = new TFile(binfile); TTree *intree = (TTree*)f->Get("Bin"); BinInfo bin; intree->SetBranchAddress("Bin",&bin); intree->GetEntry(0); cout << "we should have " << bin.nEvents << endl; cout << bin.ptLo << " " << bin.ptHi << " " << bin.etaLo << " " << bin.etaHi << " " << bin.phiLo << " " << bin.phiHi << " " << bin.npvLo << " " << bin.npvHi << " " << bin.absEta << endl; // // Generate histogram templates from MC if necessary // if(sigModPass==2 || sigModFail==2) { generateHistTemplates(mcfilename, bin.ptLo, bin.ptHi, bin.etaLo, bin.etaHi, bin.phiLo, bin.phiHi, bin.npvLo, bin.npvHi, bin.absEta, 0, bin.iBin); } RooRealVar m("m","mass",fitMassLo,fitMassHi); m.setBins(10000); Int_t nflpass=0, nflfail=0; TFile *histfile = 0; if(sigModPass==2 || sigModFail==2) { histfile = new TFile("histTemplates.root"); assert(histfile); } RooCategory sample("sample",""); sample.defineType("Pass",1); sample.defineType("Fail",2); RooAbsData *dataPass=0; RooAbsData *dataFail=0; RooAbsData *dataCombined=0; dataPass = new RooDataHist("dataPass","dataPass",RooArgSet(m),histPass); dataFail = new RooDataHist("dataFail","dataFail",RooArgSet(m),histFail); dataCombined = new RooDataHist("dataCombined","dataCombined",RooArgList(m), RooFit::Index(sample), RooFit::Import("Pass",*((RooDataHist*)dataPass)), RooFit::Import("Fail",*((RooDataHist*)dataFail))); // Define signal and background models CSignalModel *sigPass = 0; CBackgroundModel *bkgPass = 0; CSignalModel *sigFail = 0; CBackgroundModel *bkgFail = 0; char hname[50]; sprintf(hname,"pass_%i",bin.iBin); TH1D *h = (TH1D*)histfile->Get(hname); assert(h); sigPass = new CMCTemplateConvGaussian(m,h,kTRUE); //((CMCTemplateConvGaussian*)sigPass)->mean->setVal(-0.1); //((CMCTemplateConvGaussian*)sigPass)->sigma->setVal(0.015); //((CMCTemplateConvGaussian*)sigPass)->sigma->setMax(0.2); nflpass += 2; if (bkgModPass == 1) { bkgPass = new CExponential(m,kTRUE); nflpass += 1; } else if (bkgModPass == 2) { bkgPass = new CErfExpo(m,kTRUE); nflfail += 3; //((CErfExpo*)bkgPass)->alfa->setVal(64.); //((CErfExpo*)bkgPass)->alfa->setMax(80.); //((CErfExpo*)bkgPass)->beta->setVal(1.0); //((CErfExpo*)bkgPass)->beta->setMax(3.0); //((CErfExpo*)bkgPass)->gamma->setVal(1.0); //((CErfExpo*)bkgPass)->gamma->setMax(3.0); } else { cout << "trying to use bkg model that's not implemented!!" << endl; } char hname2[50]; sprintf(hname2,"fail_%i",bin.iBin); TH1D *h2 = (TH1D*)histfile->Get(hname2); assert(h2); sigFail = new CMCTemplateConvGaussian(m,h2,kFALSE); //((CMCTemplateConvGaussian*)sigFail)->mean->setVal(-0.28); //((CMCTemplateConvGaussian*)sigFail)->sigma->setVal(0.2); //((CMCTemplateConvGaussian*)sigFail)->sigma->setMax(2.0); nflfail += 2; if (bkgModFail == 1) { bkgFail = new CExponential(m,kFALSE); nflfail += 1; } else if (bkgModFail == 2) { bkgFail = new CErfExpo(m,kFALSE); nflfail += 3; //((CErfExpo*)bkgFail)->alfa->setVal(60.); //((CErfExpo*)bkgFail)->alfa->setMax(80.); //((CErfExpo*)bkgFail)->beta->setVal(0.07); //((CErfExpo*)bkgFail)->beta->setMax(0.5); //((CErfExpo*)bkgFail)->gamma->setVal(0.02); //((CErfExpo*)bkgFail)->gamma->setMax(1.0); } else { cout << "trying to use bkg model that's not implemented!!" << endl; } // Define free parameters Double_t NsigMax = histPass->Integral()+histFail->Integral(); cout << "NsigMax " << NsigMax << endl; Double_t NbkgFailMax = histFail->Integral(); cout << "NbkgFailMax " << NbkgFailMax << endl; Double_t NbkgPassMax = histPass->Integral(); RooRealVar Nsig("Nsig","Signal Yield",0.80*NsigMax,0,NsigMax); RooRealVar eff("eff","Efficiency",0.9,0,1.0); //cout << "got here" << endl; RooRealVar NbkgPass("NbkgPass","Background count in PASS sample",10,0,NbkgPassMax); //cout << "chicken" << endl; RooRealVar NbkgFail("NbkgFail","Background count in FAIL sample",10,0.01,NbkgFailMax); //cout << "frog" << endl; RooFormulaVar NsigPass("NsigPass","eff*Nsig",RooArgList(eff,Nsig)); RooFormulaVar NsigFail("NsigFail","(1.0-eff)*Nsig",RooArgList(eff,Nsig)); RooAddPdf *modelPass=0, *modelFail=0; RooExtendPdf *esignalPass=0, *ebackgroundPass=0, *esignalFail=0, *ebackgroundFail=0; if(massLo!=fitMassLo || massHi!=fitMassHi) { m.setRange("signalRange",massLo,massHi); esignalPass = new RooExtendPdf("esignalPass","esignalPass",*(sigPass->model),NsigPass,"signalRange"); ebackgroundPass = new RooExtendPdf("ebackgroundPass","ebackgroundPass",(bkgModPass>0) ? *(bkgPass->model) : *(sigPass->model),NbkgPass,"signalRange"); modelPass = new RooAddPdf("modelPass","Model for PASS sample",(bkgModPass>0) ? RooArgList(*esignalPass,*ebackgroundPass) : RooArgList(*esignalPass)); esignalFail = new RooExtendPdf("esignalFail","esignalFail",*(sigFail->model),NsigFail,"signalRange"); ebackgroundFail = new RooExtendPdf("ebackgroundFail","ebackgroundFail",*(bkgFail->model),NbkgFail,"signalRange"); modelFail = new RooAddPdf("modelFail","Model for FAIL sample", (bkgModFail>0) ? RooArgList(*esignalFail,*ebackgroundFail) : RooArgList(*esignalFail)); } else { modelPass = new RooAddPdf("modelPass","Model for PASS sample", RooArgList(*(sigPass->model),*(bkgPass->model)), RooArgList(NsigPass,NbkgPass)); modelFail = new RooAddPdf("modelFail","Model for FAIL sample", RooArgList(*(sigFail->model),*(bkgFail->model)), RooArgList(NsigFail,NbkgFail)); } cout << "whale?" << endl; RooSimultaneous totalPdf("totalPdf","totalPdf",sample); totalPdf.addPdf(*modelPass,"Pass"); totalPdf.addPdf(*modelFail,"Fail"); RooFitResult *fitResult=0; fitResult = totalPdf.fitTo(*dataCombined, RooFit::Extended(), RooFit::Strategy(1), //RooFit::Minos(RooArgSet(eff)), RooFit::Save()); // Refit w/o MINOS if MINOS errors are strange... if((fabs(eff.getErrorLo())<5e-5) || (eff.getErrorHi()<5e-5)) fitResult = totalPdf.fitTo(*dataCombined, RooFit::Extended(), RooFit::Strategy(1), RooFit::Save()); cout << eff.getVal() << " " << fabs(eff.getErrorLo()) << " " << eff.getErrorHi() << endl; /* RooPlot *mframePass = m.frame(Bins(Int_t(fitMassHi-fitMassLo)/BIN_SIZE_PASS)); dataPass->plotOn(mframePass,MarkerStyle(kFullCircle),MarkerSize(0.8),DrawOption("ZP")); modelPass->plotOn(mframePass); modelPass->plotOn(mframePass,Components("backgroundPass"),LineStyle(kDashed),LineColor(kRed)); RooPlot *mframeFail = m.frame(Bins(Int_t(fitMassHi-fitMassLo)/BIN_SIZE_FAIL)); dataFail->plotOn(mframeFail,MarkerStyle(kFullCircle),MarkerSize(0.8),DrawOption("ZP")); modelFail->plotOn(mframeFail); modelFail->plotOn(mframeFail,Components("backgroundFail"),LineStyle(kDashed),LineColor(kRed)); TCanvas *cpass = MakeCanvas("cpass","cpass",720,540); cpass->SetWindowPosition(cpass->GetWindowTopX()+cpass->GetBorderSize()+800,0); TCanvas *cfail = MakeCanvas("cfail","cfail",720,540); cfail->SetWindowPosition(cfail->GetWindowTopX()+cfail->GetBorderSize()+800,cpass->GetWindowTopX()+cfail->GetBorderSize()+540); char ylabel[50]; // // Plot passing probes // sprintf(ylabel,"Events / %.1f GeV/c^{2}",(Double_t)BIN_SIZE_PASS); CPlot plotPass("pass",mframePass,"Passing probes","tag-probe mass [GeV/c^{2}]",ylabel); plotPass.Draw(cpass,kTRUE,"png"); // // Plot failing probes // sprintf(ylabel,"Events / %.1f GeV/c^{2}",(Double_t)BIN_SIZE_FAIL); CPlot plotFail("fail",mframeFail,"Failing probes","tag-probe mass [GeV/c^{2}]",ylabel); plotFail.Draw(cfail,kTRUE,"png"); */ // // Write fit results // TObjString* temp=(TObjString*)readInFile.Tokenize("/.")->At(4); ofstream txtfile; char txtfname[100]; sprintf(txtfname,"%s/%s.output",outputDir.Data(),temp->GetString().Data()); txtfile.open(txtfname); assert(txtfile.is_open()); fitResult->printStream(txtfile,RooPrintable::kValue,RooPrintable::kVerbose); txtfile.close(); }
//using namespace std; void btagefficiency(int ii, int jj) { gROOT->ProcessLine(".L tdrstyle.C"); defaultStyle(); TFile* f1 = new TFile("/afs/cern.ch/work/y/youngjo/public/For8Tev/v20130208_V00-00-06/vallot_TTbarFullLepMGDecays.root"); TTree* treeMuMu = (TTree*)f1->Get("MuMu/tree"); TTree* treeElEl = (TTree*)f1->Get("ElEl/tree"); TTree* treeMuEl = (TTree*)f1->Get("MuEl/tree"); float binspt[] = {20,30,40,50,60,70,80,100,120,160,210,260,320,400,450}; int nBinpt = sizeof(binspt)/sizeof(float) - 1; float binseta[] = {0.,0.4,0.8,1.2,1.6,2.0,2.4}; int nBineta = sizeof(binseta)/sizeof(float) - 1; TCut precut_em = "ZMass > 12 && lep1_relIso03 < 0.15 && lep2_relIso03 < 0.15 && PairSign < 0 && nJet30 >= 4"; TCut precut = precut_em + "abs(ZMass - 91.2) > 15 && MET > 30"; TCut bcut = "abs(jets_flavor) == 5"; TCut ccut = "abs(jets_flavor) == 4"; TCut lcut = "abs(jets_flavor) < 4"; TCut etacut1 = "abs(jets_eta) <= 0.8"; TCut etacut2 = "abs(jets_eta) > 0.8 && abs(jets_eta) <=1.6"; TCut etacut3 = "abs(jets_eta) > 1.6"; TCut etacutl1 = "abs(jets_eta) <= 0.5"; TCut etacutl2 = "abs(jets_eta) > 0.5 && abs(jets_eta) <=1.0"; TCut etacutl3 = "abs(jets_eta) > 1.0 && abs(jets_eta) <=1.5"; TCut etacutl4 = "abs(jets_eta) > 1.5"; TCut csvl = "jets_bDiscriminatorCSV > 0.244"; TCut csvm = "jets_bDiscriminatorCSV > 0.679"; TCut csvt = "jets_bDiscriminatorCSV > 0.898"; float binsDR[] = {0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3.0,3.2,3.5,4}; int nBinDR = sizeof(binsDR)/sizeof(float) - 1; TString DR_ = "TMath::Sqrt( abs(jets_eta[csvd_jetid[2]]-jets_eta[csvd_jetid[3]])*abs(jets_eta[csvd_jetid[2]]-jets_eta[csvd_jetid[3]])+abs(TVector2::Phi_mpi_pi(jets_phi[csvd_jetid[2]]-jets_phi[csvd_jetid[3]]))*abs(TVector2::Phi_mpi_pi(jets_phi[csvd_jetid[2]]-jets_phi[csvd_jetid[3]])) )"; float binsCSV[] = {0.0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0}; int nBinCSV = sizeof(binsCSV)/sizeof(float) - 1; if(ii ==4) { TH1F* dist_b_csvd = dist(treeElEl, treeMuMu, treeMuEl, "jets_bDiscriminatorCSV", nBinCSV, binsCSV, precut, precut_em, bcut, "B flavor","b_csvd",2,"discriminator (CSV)"); TH1F* dist_c_csvd = dist(treeElEl, treeMuMu, treeMuEl, "jets_bDiscriminatorCSV", nBinCSV, binsCSV, precut, precut_em, ccut, "C flavor","c_csvd",4,"discriminator (CSV)"); TH1F* dist_l_csvd = dist(treeElEl, treeMuMu, treeMuEl, "jets_bDiscriminatorCSV", nBinCSV, binsCSV, precut, precut_em, lcut, "LF flavor","l_csvd",3,"discriminator (CSV)"); TCanvas * c_b_csvd = new TCanvas("c_b_csvd","c_b_csvd",500,500); double ymax = dist_l_csvd->GetMaximum(); if(ymax< dist_c_csvd->GetMaximum()) ymax=dist_c_csvd->GetMaximum(); if(ymax< dist_b_csvd->GetMaximum()) ymax=dist_b_csvd->GetMaximum(); ymax=ymax*1.5; dist_l_csvd->SetMaximum(ymax); dist_l_csvd->Draw(""); dist_c_csvd->Draw("same"); dist_b_csvd->Draw("same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(dist_b_csvd,"b-flavor","L"); l->AddEntry(dist_c_csvd,"c-flavor","L"); l->AddEntry(dist_l_csvd,"l-flavor","L"); SetLegend(l); c_b_csvd->Print("compare_b_csvd.png"); c_b_csvd->Print("compare_b_csvd.eps"); } else if(ii ==3) { TH1F* eff_b_dr_CSVL = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, bcut, csvl, "b_dr_CSVL","CSVL",2,"#Delta R"); TH1F* eff_c_dr_CSVL = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, ccut, csvl, "c_dr_CSVL","CSVL",4,"#Delta R"); TH1F* eff_l_dr_CSVL = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, lcut, csvl, "l_dr_CSVL","CSVL",5,"#Delta R"); TH1F* eff_b_dr_CSVM = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, bcut, csvm, "b_dr_CSVM","CSVM",2,"#Delta R"); TH1F* eff_b_dr_CSVT = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, bcut, csvt, "b_dr_CSVT","CSVT",2,"#Delta R"); TH1F* eff_c_dr_CSVM = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, ccut, csvm, "c_dr_CSVM","CSVM",4,"#Delta R"); TH1F* eff_c_dr_CSVT = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, ccut, csvt, "c_dr_CSVT","CSVT",4,"#Delta R"); TH1F* eff_l_dr_CSVM = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, lcut, csvm, "l_dr_CSVM","CSVM",5,"#Delta R"); TH1F* eff_l_dr_CSVT = eff(treeElEl, treeMuMu, treeMuEl, DR_.Data(), nBinDR, binsDR, precut, precut_em, lcut, csvt, "l_dr_CSVT","CSVT",5,"#Delta R"); TCanvas * c_b_dr_CSVL = new TCanvas("c_b_dr_CSVL","c_b_dr_CSVL",500,500); eff_b_dr_CSVL->Draw("e3"); eff_c_dr_CSVL->Draw("e3 same"); eff_l_dr_CSVL->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_dr_CSVL,"b-flavor","F"); l->AddEntry(eff_c_dr_CSVL,"c-flavor","F"); l->AddEntry(eff_l_dr_CSVL,"l-flavor","F"); SetLegend(l); c_b_dr_CSVL->Print("compare_b_dr_CSVL.png"); c_b_dr_CSVL->Print("compare_b_dr_CSVL.eps"); TCanvas * c_b_dr_CSVM = new TCanvas("c_b_dr_CSVM","c_b_dr_CSVM",500,500); eff_b_dr_CSVM->Draw("e3"); eff_c_dr_CSVM->Draw("e3 same"); eff_l_dr_CSVM->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_dr_CSVM,"b-flavor","F"); l->AddEntry(eff_c_dr_CSVM,"c-flavor","F"); l->AddEntry(eff_l_dr_CSVM,"l-flavor","F"); SetLegend(l); c_b_dr_CSVM->Print("compare_b_dr_CSVM.png"); c_b_dr_CSVM->Print("compare_b_dr_CSVM.eps"); TCanvas * c_b_dr_CSVT = new TCanvas("c_b_dr_CSVT","c_b_dr_CSVT",500,500); eff_b_dr_CSVT->Draw("e3"); eff_c_dr_CSVT->Draw("e3 same"); eff_l_dr_CSVT->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_dr_CSVT,"b-flavor","F"); l->AddEntry(eff_c_dr_CSVT,"c-flavor","F"); l->AddEntry(eff_l_dr_CSVT,"l-flavor","F"); SetLegend(l); c_b_dr_CSVT->Print("compare_b_dr_CSVT.png"); c_b_dr_CSVT->Print("compare_b_dr_CSVT.eps"); } else if(ii ==0) { TH1F* eff_b_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, bcut, csvl, "b_pt_CSVL","CSVL",2,"p_{T}(GeV/c)"); TH1F* eff_c_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, ccut, csvl, "c_pt_CSVL","CSVL",4,"p_{T}(GeV/c)"); TH1F* eff_l_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut, csvl, "l_pt_CSVL","CSVL",5,"p_{T}(GeV/c)"); TH1F* eff_b_pt_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, bcut, csvm, "b_pt_CSVM","CSVM",2,"p_{T}(GeV/c)"); TH1F* eff_b_pt_CSVT = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, bcut, csvt, "b_pt_CSVT","CSVT",2,"p_{T}(GeV/c)"); TH1F* eff_c_pt_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, ccut, csvm, "c_pt_CSVM","CSVM",4,"p_{T}(GeV/c)"); TH1F* eff_c_pt_CSVT = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, ccut, csvt, "c_pt_CSVT","CSVT",4,"p_{T}(GeV/c)"); TH1F* eff_l_pt_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut, csvm, "l_pt_CSVM","CSVM",5,"p_{T}(GeV/c)"); TH1F* eff_l_pt_CSVT = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut, csvt, "l_pt_CSVT","CSVT",5,"p_{T}(GeV/c)"); TCanvas * c_b_pt_CSVL = new TCanvas("c_b_pt_CSVL","c_b_pt_CSVL",500,500); eff_b_pt_CSVL->Draw("e3"); eff_c_pt_CSVL->Draw("e3 same"); eff_l_pt_CSVL->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_pt_CSVL,"b-flavor","F"); l->AddEntry(eff_c_pt_CSVL,"c-flavor","F"); l->AddEntry(eff_l_pt_CSVL,"l-flavor","F"); SetLegend(l); c_b_pt_CSVL->Print("compare_b_pt_CSVL.png"); c_b_pt_CSVL->Print("compare_b_pt_CSVL.eps"); TCanvas * c_b_pt_CSVM = new TCanvas("c_b_pt_CSVM","c_b_pt_CSVM",500,500); eff_b_pt_CSVM->Draw("e3"); eff_c_pt_CSVM->Draw("e3 same"); eff_l_pt_CSVM->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_pt_CSVM,"b-flavor","F"); l->AddEntry(eff_c_pt_CSVM,"c-flavor","F"); l->AddEntry(eff_l_pt_CSVM,"l-flavor","F"); SetLegend(l); c_b_pt_CSVM->Print("compare_b_pt_CSVM.png"); c_b_pt_CSVM->Print("compare_b_pt_CSVM.eps"); TCanvas * c_b_pt_CSVT = new TCanvas("c_b_pt_CSVT","c_b_pt_CSVT",500,500); eff_b_pt_CSVT->Draw("e3"); eff_c_pt_CSVT->Draw("e3 same"); eff_l_pt_CSVT->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_pt_CSVT,"b-flavor","F"); l->AddEntry(eff_c_pt_CSVT,"c-flavor","F"); l->AddEntry(eff_l_pt_CSVT,"l-flavor","F"); SetLegend(l); c_b_pt_CSVT->Print("compare_b_pt_CSVT.png"); c_b_pt_CSVT->Print("compare_b_pt_CSVT.eps"); } else if(ii==2) { if(jj==0) { TH1F* eff_l1_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacutl1, csvl, "l1_pt_CSVL","CSVL",2,"p_{T}(GeV/c)"); TH1F* eff_l2_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacutl2, csvl, "l2_pt_CSVL","CSVL",3,"p_{T}(GeV/c)"); TH1F* eff_l3_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacutl3, csvl, "l3_pt_CSVL","CSVL",4,"p_{T}(GeV/c)"); TH1F* eff_l4_pt_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacutl4, csvl, "l4_pt_CSVL","CSVL",5,"p_{T}(GeV/c)"); TCanvas * c_l3_pt_CSVL = new TCanvas("c_b_pt_CSVL","c_b_pt_CSVL",500,500); eff_l1_pt_CSVL->SetMaximum(0.4); eff_l1_pt_CSVL->Draw("e3"); eff_l2_pt_CSVL->Draw("e3 same"); eff_l3_pt_CSVL->Draw("e3 same"); eff_l4_pt_CSVL->Draw("e3 same"); TLegend *l = new TLegend(0.42,0.76,0.89,0.87); l->AddEntry(eff_l1_pt_CSVL,"l-flavor #eta #leq 0.5","F"); l->AddEntry(eff_l2_pt_CSVL,"l-flavor 0.5 < #eta #leq 1.0","F"); l->AddEntry(eff_l3_pt_CSVL,"l-flavor 1.0 < #eta #leq 1.5","F"); l->AddEntry(eff_l4_pt_CSVL,"l-flavor 1.5 < #eta","F"); SetLegend(l); c_l3_pt_CSVL->Print("compare_l4_pt_CSVL.png"); c_l3_pt_CSVL->Print("compare_l4_pt_CSVL.eps"); } else if(jj==1) { TH1F* eff_l1_pt_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacut1, csvm, "l1_pt_CSVM","CSVM",2,"p_{T}(GeV/c)"); TH1F* eff_l2_pt_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacut2, csvm, "l2_pt_CSVM","CSVM",4,"p_{T}(GeV/c)"); TH1F* eff_l3_pt_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_pt", nBinpt, binspt, precut, precut_em, lcut+etacut3, csvm, "l3_pt_CSVM","CSVM",5,"p_{T}(GeV/c)"); TCanvas * c_l3_pt_CSVM = new TCanvas("c_b_pt_CSVM","c_b_pt_CSVM",500,500); eff_l1_pt_CSVM->SetMaximum(0.1); eff_l1_pt_CSVM->Draw("e3"); eff_l2_pt_CSVM->Draw("e3 same"); eff_l3_pt_CSVM->Draw("e3 same"); TLegend *l = new TLegend(0.42,0.76,0.89,0.87); l->AddEntry(eff_l1_pt_CSVM,"l-flavor #eta #leq 0.8","F"); l->AddEntry(eff_l2_pt_CSVM,"l-flavor 0.8 < #eta #leq 1.6","F"); l->AddEntry(eff_l3_pt_CSVM,"l-flavor 1.6 < #eta","F"); SetLegend(l); c_l3_pt_CSVM->Print("compare_l3_pt_CSVM.png"); c_l3_pt_CSVM->Print("compare_l3_pt_CSVM.eps"); } } else if(ii==1) { TH1F* eff_b_eta_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, bcut, csvl, "b_eta_CSVL","CSVL",2, "#eta"); TH1F* eff_c_eta_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, ccut, csvl, "c_eta_CSVL","CSVL",4, "#eta"); TH1F* eff_l_eta_CSVL = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, lcut, csvl, "l_eta_CSVL","CSVL",5, "#eta"); TH1F* eff_b_eta_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, bcut, csvm, "b_eta_CSVM","CSVM",2, "#eta"); TH1F* eff_b_eta_CSVT = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, bcut, csvt, "b_eta_CSVT","CSVT",2, "#eta"); TH1F* eff_c_eta_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, ccut, csvm, "c_eta_CSVM","CSVM",4, "#eta"); TH1F* eff_c_eta_CSVT = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, ccut, csvt, "c_eta_CSVT","CSVT",4, "#eta"); TH1F* eff_l_eta_CSVM = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, lcut, csvm, "l_eta_CSVM","CSVM",5, "#eta"); TH1F* eff_l_eta_CSVT = eff(treeElEl, treeMuMu, treeMuEl, "jets_eta", nBineta, binseta, precut, precut_em, lcut, csvt, "l_eta_CSVT","CSVT",5, "#eta"); TCanvas * c_b_eta_CSVL = new TCanvas("c_b_eta_CSVL","c_b_eta_CSVL",500,500); eff_b_eta_CSVL->Draw("e3"); eff_c_eta_CSVL->Draw("e3 same"); eff_l_eta_CSVL->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_eta_CSVL,"b-flavor","F"); l->AddEntry(eff_c_eta_CSVL,"c-flavor","F"); l->AddEntry(eff_l_eta_CSVL,"l-flavor","F"); SetLegend(l); c_b_eta_CSVL->Print("compare_b_eta_CSVL.png"); c_b_eta_CSVL->Print("compare_b_eta_CSVL.eps"); TCanvas * c_b_eta_CSVM = new TCanvas("c_b_eta_CSVM","c_b_eta_CSVM",500,500); eff_b_eta_CSVM->Draw("e3"); eff_c_eta_CSVM->Draw("e3 same"); eff_l_eta_CSVM->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_eta_CSVM,"b-flavor","F"); l->AddEntry(eff_c_eta_CSVM,"c-flavor","F"); l->AddEntry(eff_l_eta_CSVM,"l-flavor","F"); SetLegend(l); c_b_eta_CSVM->Print("compare_b_eta_CSVM.png"); c_b_eta_CSVM->Print("compare_b_eta_CSVM.eps"); TCanvas * c_b_eta_CSVT = new TCanvas("c_b_eta_CSVT","c_b_eta_CSVT",500,500); eff_b_eta_CSVT->Draw("e3"); eff_c_eta_CSVT->Draw("e3 same"); eff_l_eta_CSVT->Draw("e3 same"); TLegend *l = new TLegend(0.68,0.76,0.89,0.87); l->AddEntry(eff_b_eta_CSVT,"b-flavor","F"); l->AddEntry(eff_c_eta_CSVT,"c-flavor","F"); l->AddEntry(eff_l_eta_CSVT,"l-flavor","F"); SetLegend(l); c_b_eta_CSVT->Print("compare_b_eta_CSVT.png"); c_b_eta_CSVT->Print("compare_b_eta_CSVT.eps"); } }
Asset* RenderTechnique::onLoad( AssetManager* manager, XeCore::XeString& name, Params& params, bool keepAlways ) { RenderTechnique* t = xnew RenderTechnique(); for( ParamsElm p = params.FirstPointer(); !p.IsEmpty(); p.Next() ) { if( p().Value.getType() == ParamData::tParams && p().Value.getGroupType() == "pass" ) { Params& pass = p().Value.getParams(); unsigned int tc( 0 ); Effect* eff( 0 ); int w( 0 ), h( 0 ); bool fh( false ), fv( false ), rtc( true ), dome( false ); if( pass.Exists( "textures" ) ) pass[ "textures" ].getValue().Convert( &tc, 'd' ); if( pass.Exists( "effectAsset" ) ) eff = manager->get< Effect >( pass[ "effectAsset" ].getValue(), keepAlways ); if( pass.Exists( "width" ) ) pass[ "width" ].getValue().Convert( &w, 'i' ); if( pass.Exists( "height" ) ) pass[ "height" ].getValue().Convert( &h, 'i' ); if( pass.Exists( "flipVertical" ) ) fv = pass[ "flipVertical" ].getValue() == "true"; if( pass.Exists( "flipHorizontal" ) ) fh = pass[ "flipHorizontal" ].getValue() == "true"; if( pass.Exists( "renderToCanvas" ) ) rtc = pass[ "renderToCanvas" ].getValue() == "true"; if( pass.Exists( "isDome" ) ) dome = pass[ "isDome" ].getValue() == "true"; RenderTechnique::PassElm elm = dome ? t->addPassDome( p().Key, tc, eff, w, h, rtc ) : t->addPass( p().Key, tc, eff, w, h, fh, fv, rtc ); if( t->getPassCanvas( elm ) ) { if( pass.Exists( "canvasColorFilteringLevel" ) ) { int flevel( 0 ); pass[ "canvasColorFilteringLevel" ].getValue().Convert( &flevel, 'i' ); t->getPassCanvas( elm )->filtering( flevel ); } if( pass.Exists( "canvasColorRepeating" ) ) t->getPassCanvas( elm )->repeating( pass[ "canvasColorRepeating" ].getValue() == "true" ); if( pass.Exists( "canvasDepthFilteringLevel" ) ) { int flevel( 0 ); pass[ "canvasDepthFilteringLevel" ].getValue().Convert( &flevel, 'i' ); t->getPassCanvas( elm )->filteringDepth( flevel ); } if( pass.Exists( "canvasDepthRepeating" ) ) t->getPassCanvas( elm )->repeatingDepth( pass[ "canvasDepthRepeating" ].getValue() == "true" ); } if( !elm.IsEmpty() && pass.Exists( "textureBinds" ) && pass[ "textureBinds" ].getType() == ParamData::tParams ) { Params& tb = pass[ "textureBinds" ].getParams(); for( ParamsElm _p = tb.FirstPointer(); !_p.IsEmpty(); _p.Next() ) { if( _p().Value.getType() == ParamData::tValue ) { unsigned int sc( 0 ); XeCore::XeString* sv = _p().Key.Explode( " ", sc ); if( sv && sc ) { if( sc == 4 && sv[ 0 ] == "unit" && sv[ 2 ] == "from" ) { int unit( 0 ); sv[ 1 ].Convert( &unit, 'i' ); if( sv[ 3 ] == "canvasAssetColorTexture" ) t->bindPassInputTexture( elm, manager->get< Canvas >( _p().Value.getValue(), keepAlways )->getTexture(), unit ); else if( sv[ 3 ] == "canvasAssetDepthTexture" ) t->bindPassInputTexture( elm, manager->get< Canvas >( _p().Value.getValue(), keepAlways )->getTextureDepth(), unit ); else if( sv[ 3 ] == "passCanvasColorTexture" ) t->bindPassInputTexture( elm, t->getPassCanvas( t->getPass( NameID( _p().Value.getValue() ) ) )->getTexture(), unit ); else if( sv[ 3 ] == "passCanvasDepthTexture" ) t->bindPassInputTexture( elm, t->getPassCanvas( t->getPass( NameID( _p().Value.getValue() ) ) )->getTextureDepth(), unit ); else if( sv[ 3 ] == "textureAsset" ) t->bindPassInputTexture( elm, manager->get< Texture >( _p().Value.getValue(), keepAlways ), unit ); } delete[] sv; } } } } if( pass.Exists( "properties" ) && pass[ "properties" ].getType() == ParamData::tParams ) { Material* m = t->getPassMaterial( elm ); for( ParamsElm _p = pass[ "properties" ].getParams().FirstPointer(); !_p.IsEmpty(); _p.Next() ) { if( _p().Value.getType() != ParamData::tParams ) continue; if( _p().Value.getGroupType() == "float" ) { XeCore::XeHalfVector v; _p().Value.getParams()[ "x" ].getValue().Convert( &v.X, 'h' ); m->getProperties()->setPropertyVec( _p().Key, v, 1 ); } else if( _p().Value.getGroupType() == "vec2" ) { XeCore::XeHalfVector v; _p().Value.getParams()[ "x" ].getValue().Convert( &v.X, 'h' ); _p().Value.getParams()[ "y" ].getValue().Convert( &v.Y, 'h' ); m->getProperties()->setPropertyVec( _p().Key, v, 2 ); } else if( _p().Value.getGroupType() == "vec3" ) { XeCore::XeHalfVector v; _p().Value.getParams()[ "x" ].getValue().Convert( &v.X, 'h' ); _p().Value.getParams()[ "y" ].getValue().Convert( &v.Y, 'h' ); _p().Value.getParams()[ "z" ].getValue().Convert( &v.Z, 'h' ); m->getProperties()->setPropertyVec( _p().Key, v, 3 ); } else if( _p().Value.getGroupType() == "vec4" ) { XeCore::XeHalfVector v; _p().Value.getParams()[ "x" ].getValue().Convert( &v.X, 'h' ); _p().Value.getParams()[ "y" ].getValue().Convert( &v.Y, 'h' ); _p().Value.getParams()[ "z" ].getValue().Convert( &v.Z, 'h' ); _p().Value.getParams()[ "w" ].getValue().Convert( &v.W, 'h' ); m->getProperties()->setPropertyVec( _p().Key, v, 4 ); } else if( _p().Value.getGroupType() == "int" ) { XeCore::XeInteger v[ 4 ]; _p().Value.getParams()[ "x" ].getValue().Convert( &v[ 0 ], 'i' ); m->getProperties()->setPropertyInt( _p().Key, v, 1 ); } else if( _p().Value.getGroupType() == "int2" ) { XeCore::XeInteger v[ 4 ]; _p().Value.getParams()[ "x" ].getValue().Convert( &v[ 0 ], 'i' ); _p().Value.getParams()[ "y" ].getValue().Convert( &v[ 1 ], 'i' ); m->getProperties()->setPropertyInt( _p().Key, v, 2 ); } else if( _p().Value.getGroupType() == "int3" ) { XeCore::XeInteger v[ 4 ]; _p().Value.getParams()[ "x" ].getValue().Convert( &v[ 0 ], 'i' ); _p().Value.getParams()[ "y" ].getValue().Convert( &v[ 1 ], 'i' ); _p().Value.getParams()[ "z" ].getValue().Convert( &v[ 2 ], 'i' ); m->getProperties()->setPropertyInt( _p().Key, v, 3 ); } else if( _p().Value.getGroupType() == "int4" ) { XeCore::XeInteger v[ 4 ]; _p().Value.getParams()[ "x" ].getValue().Convert( &v[ 0 ], 'i' ); _p().Value.getParams()[ "y" ].getValue().Convert( &v[ 1 ], 'i' ); _p().Value.getParams()[ "z" ].getValue().Convert( &v[ 2 ], 'i' ); _p().Value.getParams()[ "w" ].getValue().Convert( &v[ 3 ], 'i' ); m->getProperties()->setPropertyInt( _p().Key, v, 4 ); } else if( _p().Value.getGroupType() == "sampler2D" ) { XeCore::XeInteger v; _p().Value.getParams()[ "unit" ].getValue().Convert( &v, 'i' ); m->getProperties()->setPropertySampler( _p().Key, v ); } else if( _p().Value.getGroupType() == "sampler3D" ) { XeCore::XeInteger v; _p().Value.getParams()[ "unit" ].getValue().Convert( &v, 'i' ); m->getProperties()->setPropertySampler( _p().Key, v ); } else if( _p().Value.getGroupType() == "mat4" ) { XeCore::XeHalfMatrix v; _p().Value.getParams()[ "0" ].getValue().Convert( &v.Cell[ 0 ], 'h' ); _p().Value.getParams()[ "1" ].getValue().Convert( &v.Cell[ 1 ], 'h' ); _p().Value.getParams()[ "2" ].getValue().Convert( &v.Cell[ 2 ], 'h' ); _p().Value.getParams()[ "3" ].getValue().Convert( &v.Cell[ 3 ], 'h' ); _p().Value.getParams()[ "4" ].getValue().Convert( &v.Cell[ 4 ], 'h' ); _p().Value.getParams()[ "5" ].getValue().Convert( &v.Cell[ 5 ], 'h' ); _p().Value.getParams()[ "6" ].getValue().Convert( &v.Cell[ 6 ], 'h' ); _p().Value.getParams()[ "7" ].getValue().Convert( &v.Cell[ 7 ], 'h' ); _p().Value.getParams()[ "8" ].getValue().Convert( &v.Cell[ 8 ], 'h' ); _p().Value.getParams()[ "9" ].getValue().Convert( &v.Cell[ 9 ], 'h' ); _p().Value.getParams()[ "10" ].getValue().Convert( &v.Cell[ 10 ], 'h' ); _p().Value.getParams()[ "11" ].getValue().Convert( &v.Cell[ 11 ], 'h' ); _p().Value.getParams()[ "12" ].getValue().Convert( &v.Cell[ 12 ], 'h' ); _p().Value.getParams()[ "13" ].getValue().Convert( &v.Cell[ 13 ], 'h' ); _p().Value.getParams()[ "14" ].getValue().Convert( &v.Cell[ 14 ], 'h' ); _p().Value.getParams()[ "15" ].getValue().Convert( &v.Cell[ 15 ], 'h' ); m->getProperties()->setPropertyMat( _p().Key, v, _p().Value.getParams()[ "transpose" ].getValue() == "true" ? true : false ); } else if( _p().Value.getGroupType() == "float[]" ) { if( _p().Value.getParams().Size() ) { unsigned int i = 0; XeCore::XeArray< XeCore::XeHalf > temp( _p().Value.getParams().Size() ); for( ParamsElm a = _p().Value.getParams().FirstPointer(); !a.IsEmpty(); a.Next(), i++ ) a().Value.getValue().Convert( &temp[ i ], 'h' ); m->getProperties()->setPropertyArrayHalf( _p().Key, temp.Get(), temp.Size(), 1 ); } } else if( _p().Value.getGroupType() == "int[]" ) { if( _p().Value.getParams().Size() ) { unsigned int i = 0; XeCore::XeArray< XeCore::XeInteger > temp( _p().Value.getParams().Size() ); for( ParamsElm a = _p().Value.getParams().FirstPointer(); !a.IsEmpty(); a.Next(), i++ ) a().Value.getValue().Convert( &temp[ i ], 'i' ); m->getProperties()->setPropertyArrayInt( _p().Key, temp.Get(), temp.Size(), 1 ); } } } } } } if( Global::use().scenes->attach( NameID( name ), t ) ) { ASSET_SET_PURE_POINTER( t ); return( t ); } else { DELETE_OBJECT( t ); return( 0 ); } }