コード例 #1
0
ファイル: forData.C プロジェクト: yuchanggit/ZpZHllbb_13TeV
void forData(string channel, string catcut, bool removeMinor=true){

  // Suppress all the INFO message

  RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING);

  // Input files and sum all backgrounds

  TChain* treeData  = new TChain("tree");
  TChain* treeZjets = new TChain("tree");

  if( channel == "ele" ){

    treeData->Add(Form("%s/data/SingleElectron-Run2015D-05Oct2015-v1_toyMCnew.root",  channel.data()));
    treeData->Add(Form("%s/data/SingleElectron-Run2015D-PromptReco-V4_toyMCnew.root", channel.data()));

  }

  else if( channel == "mu" ){

    treeData->Add(Form("%s/data/SingleMuon-Run2015D-05Oct2015-v1_toyMCnew.root",  channel.data()));
    treeData->Add(Form("%s/data/SingleMuon-Run2015D-PromptReco-V4_toyMCnew.root", channel.data()));

  }

  else return;

  treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-100to200_13TeV_toyMCnew.root", channel.data()));
  treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-200to400_13TeV_toyMCnew.root", channel.data()));
  treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-400to600_13TeV_toyMCnew.root", channel.data()));
  treeZjets->Add(Form("%s/Zjets/DYJetsToLL_M-50_HT-600toInf_13TeV_toyMCnew.root", channel.data()));

  // To remove minor background contribution in data set (weight is -1)

  if( removeMinor ){

    treeData->Add(Form("%s/VV/WW_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data()));
    treeData->Add(Form("%s/VV/WZ_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data()));
    treeData->Add(Form("%s/VV/ZZ_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data()));
    treeData->Add(Form("%s/TT/TT_TuneCUETP8M1_13TeV_toyMCnew.root", channel.data()));

  }

  // Define all the variables from the trees

  RooRealVar cat ("cat", "", 0, 2);
  RooRealVar mJet("prmass", "M_{jet}",  30.,  300., "GeV");
  RooRealVar mZH ("mllbb",   "M_{ZH}", 900., 3000., "GeV");
  RooRealVar evWeight("evweight", "", -1.e3, 1.e3);

  // Set the range in jet mass

  mJet.setRange("allRange", 30., 300.);
  mJet.setRange("lowSB",    30.,  65.);
  mJet.setRange("highSB",  135., 300.);
  mJet.setRange("signal",  105., 135.);

  RooBinning binsmJet(54, 30, 300);

  RooArgSet variables(cat, mJet, mZH, evWeight);

  TCut catCut = Form("cat==%s", catcut.c_str());
  TCut sbCut  = "prmass>30 && !(prmass>65 && prmass<135) && prmass<300";
  TCut sigCut = "prmass>105 && prmass<135";

  // Create a dataset from a tree -> to process an unbinned likelihood fitting

  RooDataSet dataSetData   ("dataSetData",    "dataSetData",    variables, Cut(catCut),           WeightVar(evWeight), Import(*treeData));
  RooDataSet dataSetDataSB ("dataSetDataSB",  "dataSetDataSB",  variables, Cut(catCut && sbCut),  WeightVar(evWeight), Import(*treeData));
  RooDataSet dataSetZjets  ("dataSetZjets",   "dataSetZjets",   variables, Cut(catCut),           WeightVar(evWeight), Import(*treeZjets));
  RooDataSet dataSetZjetsSB("dataSetZjetsSB", "dataSetZjetsSB", variables, Cut(catCut && sbCut),  WeightVar(evWeight), Import(*treeZjets));  
  RooDataSet dataSetZjetsSG("dataSetZjetsSG", "dataSetZjetsSG", variables, Cut(catCut && sigCut), WeightVar(evWeight), Import(*treeZjets));
  
  // Total events number

  float totalMcEv   = dataSetZjetsSB.sumEntries() + dataSetZjetsSG.sumEntries();
  float totalDataEv = dataSetData.sumEntries();

  RooRealVar nMcEvents("nMcEvents", "nMcEvents", 0., 99999.);
  RooRealVar nDataEvents("nDataEvents", "nDataEvents", 0., 99999.);

  nMcEvents.setVal(totalMcEv);
  nMcEvents.setConstant(true);

  nDataEvents.setVal(totalDataEv);
  nDataEvents.setConstant(true);

  // Signal region jet mass

  RooRealVar constant("constant", "constant", -0.02,  -1.,   0.);
  RooRealVar offset  ("offset",   "offset",     30., -50., 200.);
  RooRealVar width   ("width",    "width",     100.,   0., 200.);

  if( catcut == "1" ) offset.setConstant(true);
  
  RooErfExpPdf model_mJet("model_mJet", "model_mJet", mJet, constant, offset, width);
  RooExtendPdf ext_model_mJet("ext_model_mJet", "ext_model_mJet", model_mJet, nMcEvents);

  RooFitResult* mJet_result = ext_model_mJet.fitTo(dataSetZjets, SumW2Error(true), Extended(true), Range("allRange"), Strategy(2), Minimizer("Minuit2"), Save(1));

  // Side band jet mass

  RooRealVar constantSB("constantSB", "constantSB", constant.getVal(),  -1.,   0.);
  RooRealVar offsetSB  ("offsetSB",   "offsetSB",   offset.getVal(),   -50., 200.);
  RooRealVar widthSB   ("widthSB",    "widthSB",    width.getVal(),      0., 200.);

  offsetSB.setConstant(true);

  RooErfExpPdf model_mJetSB("model_mJetSB", "model_mJetSB", mJet, constantSB, offsetSB, widthSB);
  RooExtendPdf ext_model_mJetSB("ext_model_mJetSB", "ext_model_mJetSB", model_mJetSB, nMcEvents);

  RooFitResult* mJetSB_result = ext_model_mJetSB.fitTo(dataSetZjetsSB, SumW2Error(true), Extended(true), Range("lowSB,highSB"), Strategy(2), Minimizer("Minuit2"), Save(1));

  RooAbsReal* nSIGFit = ext_model_mJetSB.createIntegral(RooArgSet(mJet), NormSet(mJet), Range("signal"));

  float normFactor = nSIGFit->getVal() * totalMcEv;
  
  // Plot the results on a frame

  RooPlot* mJetFrame = mJet.frame();

  dataSetZjetsSB.  plotOn(mJetFrame, Binning(binsmJet));  
  ext_model_mJetSB.plotOn(mJetFrame, Range("allRange"), VisualizeError(*mJetSB_result), FillColor(kYellow));
  dataSetZjetsSB.  plotOn(mJetFrame, Binning(binsmJet));  
  ext_model_mJetSB.plotOn(mJetFrame, Range("allRange"));
  mJetFrame->SetTitle("M_{jet} distribution in Z+jets MC");

  // Alpha ratio part

  mZH.setRange("fullRange", 900., 3000.);

  RooBinning binsmZH(21, 900, 3000);

  RooRealVar a("a", "a",  0., -1.,    1.);
  RooRealVar b("b", "b", 1000,  0., 4000.);
  
  RooGenericPdf model_ZHSB("model_ZHSB", "model_ZHSB", "TMath::Exp(@1*@0+@2/@0)", RooArgSet(mZH,a,b));
  RooGenericPdf model_ZHSG("model_ZHSG", "model_ZHSG", "TMath::Exp(@1*@0+@2/@0)", RooArgSet(mZH,a,b));
  RooGenericPdf model_ZH  ("model_ZH",   "model_ZH",   "TMath::Exp(@1*@0+@2/@0)", RooArgSet(mZH,a,b));

  RooExtendPdf ext_model_ZHSB("ext_model_ZHSB", "ext_model_ZHSB", model_ZHSB, nMcEvents);
  RooExtendPdf ext_model_ZHSG("ext_model_ZHSG", "ext_model_ZHSG", model_ZHSG, nMcEvents);
  RooExtendPdf ext_model_ZH  ("ext_model_ZH",   "ext_model_ZH",   model_ZH,   nDataEvents);

  // Fit ZH mass in side band  

  RooFitResult* mZHSB_result = ext_model_ZHSB.fitTo(dataSetZjetsSB, SumW2Error(true), Extended(true), Range("fullRange"), Strategy(2), Minimizer("Minuit2"), Save(1));

  float p0 = a.getVal();
  float p1 = b.getVal();

  // Fit ZH mass in signal region

  RooFitResult* mZHSG_result = ext_model_ZHSG.fitTo(dataSetZjetsSG, SumW2Error(true), Extended(true), Range("fullRange"), Strategy(2), Minimizer("Minuit2"), Save(1));

  float p2 = a.getVal();
  float p3 = b.getVal();

  // Fit ZH mass in side band region (data)

  RooFitResult* mZH_result = ext_model_ZH.fitTo(dataSetDataSB, SumW2Error(true), Extended(true), Range("fullRange"), Strategy(2), Minimizer("Minuit2"), Save(1));

  // Draw the model of alpha ratio
  // Multiply the model of background in data side band with the model of alpha ratio to the a model of background in data signal region

  RooGenericPdf model_alpha("model_alpha", "model_alpha", Form("TMath::Exp(%f*@0+%f/@0)/TMath::Exp(%f*@0+%f/@0)", p2,p3,p0,p1), RooArgSet(mZH));
  RooProdPdf    model_sigData("model_sigData", "ext_model_ZH*model_alpha", RooArgList(ext_model_ZH,model_alpha));

  // Plot the results to a frame 

  RooPlot* mZHFrameMC = mZH.frame();

  dataSetZjetsSB.plotOn(mZHFrameMC, Binning(binsmZH));
  ext_model_ZHSB.plotOn(mZHFrameMC, VisualizeError(*mZHSB_result), FillColor(kYellow));
  dataSetZjetsSB.plotOn(mZHFrameMC, Binning(binsmZH));
  ext_model_ZHSB.plotOn(mZHFrameMC, LineStyle(7), LineColor(kBlue));

  dataSetZjetsSG.plotOn(mZHFrameMC, Binning(binsmZH));
  ext_model_ZHSG.plotOn(mZHFrameMC, VisualizeError(*mZHSG_result), FillColor(kYellow));
  dataSetZjetsSG.plotOn(mZHFrameMC, Binning(binsmZH));
  ext_model_ZHSG.plotOn(mZHFrameMC, LineStyle(7), LineColor(kRed));

  TLegend* leg = new TLegend(0.65,0.77,0.85,0.85);

  leg->AddEntry(mZHFrameMC->findObject(mZHFrameMC->nameOf(3)), "side band",     "l");
  leg->AddEntry(mZHFrameMC->findObject(mZHFrameMC->nameOf(7)), "signal region", "l");
  leg->Draw();

  mZHFrameMC->addObject(leg);
  mZHFrameMC->SetTitle("M_{ZH} distribution in MC");

  RooPlot* mZHFrame = mZH.frame();

  dataSetDataSB.plotOn(mZHFrame, Binning(binsmZH));
  ext_model_ZH .plotOn(mZHFrame, VisualizeError(*mZH_result), FillColor(kYellow));
  dataSetDataSB.plotOn(mZHFrame, Binning(binsmZH));
  ext_model_ZH .plotOn(mZHFrame, LineStyle(7), LineColor(kBlue));
  model_sigData.plotOn(mZHFrame, Normalization(normFactor, RooAbsReal::NumEvent), LineStyle(7), LineColor(kRed));

  TLegend* leg1 = new TLegend(0.65,0.77,0.85,0.85);

  leg1->AddEntry(mZHFrame->findObject(mZHFrame->nameOf(3)), "side band",     "l");
  leg1->AddEntry(mZHFrame->findObject(mZHFrame->nameOf(4)), "signal region", "l");
  leg1->Draw();
  
  mZHFrame->addObject(leg1);
  mZHFrame->SetTitle("M_{ZH} distribution in Data");

  TCanvas* c = new TCanvas("c","",0,0,1000,800);

  c->cd();
  mZHFrameMC->Draw();
  c->Print(Form("rooFit_forData_%s_cat%s.pdf(", channel.data(), catcut.data()));

  c->cd();
  mZHFrame->Draw();
  c->Print(Form("rooFit_forData_%s_cat%s.pdf", channel.data(), catcut.data()));

  c->cd();
  mJetFrame->Draw();
  c->Print(Form("rooFit_forData_%s_cat%s.pdf)", channel.data(), catcut.data()));

}
コード例 #2
0
void test(int numbersigmas = 0, Bool_t debugtest = true)
{

    using namespace RooFit;
    using namespace std;

    TCanvas *canvas = new TCanvas("canvas","canvas",900,100,500,500);

    gSystem->Load("libRooFit");
    gSystem->AddIncludePath("-I$ROOFITSYS/include");


    float ptbinsarray[] = {20.,40.,60.,80.,100.,120.,200.,600.};

    std::vector<float> ptbins(ptbinsarray,ptbinsarray+sizeof(ptbinsarray)/sizeof(ptbinsarray[0]));

    std::vector<std::vector<float> > allbins;
    allbins.push_back(ptbins);

    std::vector<TString> VarString;
    VarString.push_back("VsPt");

    std::vector<TString> HistoNameString;
    HistoNameString.push_back("ptbin");

    std::vector<TString> GraphXTitleString;
    GraphXTitleString.push_back("p_{t} (GeV)");

    std::vector<TString> SideBandDefinitions;
    SideBandDefinitions.push_back("SideBand5_10");



    //   ------------FOR TESTING----------------
    unsigned int sidebandloopmax = 1;//5_10, 5_20, ...
    unsigned int templatevarsloopmax = 1;//sinin with conv safe veto, sinin, ch isol
    unsigned int binsloopmax = 1;//pt, eta, phi, pu

    //----------Open .root Templates

    //All the Jet Templates
    TFile *histojetfile = TFile::Open("/afs/cern.ch/user/c/ciperez/CMSSW_7_4_5/src/TemplateHistosJetCheckBinsEndcapsLoose.root");
    //TFile *histojetdenfile = TFile::Open("/afs/cern.ch/user/c/ciperez/CMSSW_7_4_5/src/Denominator_FREndCaps.root");
// TFile *histojetdatafile = TFile::Open("/afs/cern.ch/user/c/ciperez/CMSSW_7_4_5/src/Num_Templates.root");

    //Real Photon Templates
    TFile *historealmcfile = TFile::Open("/afs/cern.ch/user/c/ciperez/CMSSW_7_4_5/src/RealPhotonTemplatesEndCaps.root");

    //--- Write NEW .root Historams for Fake Rate
    TFile *FRhistosfile = new TFile("FakeRatePlotsCheckBins.root","recreate");

    //loop on error systematics

    for(unsigned int m = 0; m<templatevarsloopmax; m++) {
        for(unsigned int l = 0; l<binsloopmax; l++) {


            TMultiGraph *mg = new TMultiGraph();
            TLegend *legendAllGraphs = new TLegend(0.37,0.59,0.57,0.79);
            legendAllGraphs->SetTextSize(0.02);
            legendAllGraphs->SetFillColor(kWhite);
            legendAllGraphs->SetLineColor(kWhite);


            std::vector<float> fakeratevalues;
            std::vector<float> fakerateptvalues;
            std::vector<float> fakerateerrorvalues;

            for(unsigned int k = 0; k<allbins[0].size()-1; k++) {
// for(unsigned int k = 0;k<1;k++){
                float binlow = allbins[0][k];
                float binmax = allbins[0][k+1];

                TString binstring = TString::Format("%4.2f_%4.2f",binlow,binmax);
                binstring.ReplaceAll(".00","");
                binstring.ReplaceAll("-","m");
                binstring.ReplaceAll(".","p");
                binstring.ReplaceAll("10000","Inf");
                cout<<binstring.Data()<<endl;

                //Histograms for templates
                //Get histograms from each of the histojetfiles declared earlier

                //Numerator Fakes - FakePhotonNumEndCaps.root - FakePhoton_num2040...
                TH1F *h1 = (TH1F*)histojetfile->Get(("histoSininWithPixelSeedFakeJetptbin"+binstring).Data());// .Data() changes to char*
                h1->Print();

                //Numerator Real Photons - RealPhotonTemplatesEndCaps.root - EndCapsMCReal_20_40
                TH1F *h2 = (TH1F*)historealmcfile->Get(("EndCapsMCReal_"+binstring).Data());
                h2->Print();

                //Numerator Templates - Num_Templates.root - num2040...
                TH1F *hData = (TH1F*)histojetfile->Get(("histoSininWithPixelSeedDataJetptbin"+binstring).Data());
                hData->Print();

                //Denominator Templates - Denominator_FREndCaps.root -FakePhoton_den2040...
                TH1F *hnum = (TH1F*)histojetfile->Get(("histoSininWithPixelSeedTightAndFakeJetptbin"+binstring).Data());
                hnum->Print();

                //avoiding 0 entries in the histograms
                //fake and real mc histos are the most critical
                for(int bincount = 1; bincount <= h1->GetNbinsX(); bincount++) {
                    if(h1->GetBinContent(bincount) == 0.) h1->SetBinContent(bincount,1.e-6);
                }
                for(int bincount = 1; bincount <= h2->GetNbinsX(); bincount++) {
                    if(h2->GetBinContent(bincount) == 0.) h2->SetBinContent(bincount,1.e-6);
                }

                int ndataentries = hData->GetEntries();

                float sininmin = 0.; //? sigmaIetaIeta
                float sininmax = 0.1; //? sigmaIetaIeta

                // ----------------- Probability Density Function

                TString roofitvartitle = "#sigma_{i #eta i #eta}";

                RooRealVar sinin("sinin",roofitvartitle.Data(),sininmin,sininmax);
                sinin.setRange("sigrange",0.018,0.06); //? this is the range because? Need to recall.
                //sinin.setRange("sigrange",0.005, 0.011);

                //Fake Template pdf
                RooDataHist faketemplate("faketemplate","fake template",sinin,h1);
                RooHistPdf fakepdf("fakepdf","test hist fake pdf",sinin,faketemplate);

                //Real Template pdf
                RooDataHist realtemplate("realtemplate","real template",sinin,h2);
                RooHistPdf realpdf("realpdf","test hist real pdf",sinin,realtemplate);

                //Data to be fitted to
                RooDataHist data("data","data to be fitted to",sinin,hData);


                //Declaration of Variables for Fake Rate
                RooRealVar fsig("fsig","signal fraction",0.1,0,1);//

                RooRealVar signum("signum","signum",0,ndataentries);// #of real contamination
                RooRealVar fakenum("fakenum","fakenum",0,ndataentries); //# of fake

                //Extend
                RooExtendPdf extpdfsig("Signal","extpdfsig",realpdf,signum,"sigrange");
                RooExtendPdf extpdffake("Background","extpdffake",fakepdf,fakenum,"sigrange");

                RooAddPdf model("model","sig + background",RooArgList(extpdfsig,extpdffake));


                //----------- FITTING TO DATA -------------------
                model.fitTo(data,RooFit::Minos());

                //Define Plot Frame
                RooPlot *xframe = sinin.frame();
                xframe->SetTitle("");

                data.plotOn(xframe);
                model.plotOn(xframe);
                model.plotOn(xframe,Components(extpdfsig),LineColor(2),LineStyle(2));
                model.plotOn(xframe,Components(extpdffake),LineColor(8),LineStyle(2));

                canvas->cd();
                canvas->SetGridx(true);
                canvas->SetGridy(true);

                xframe->GetXaxis()->SetRangeUser(0.,0.1);
                float xframemax = xframe->GetMaximum();
                xframe->GetYaxis()->SetRangeUser(1.e-1,1.1*xframemax);

                xframe->Draw();

                // ----- DEFINE LEGENDS and their position
                TLegend *legend = new TLegend(0.62,0.65,0.82,0.85); //Why these values?
                legend->SetTextSize(0.02);
                legend->SetFillColor(kWhite);
                legend->SetLineColor(kWhite);

                //Legend Header which tells the bin
                TString legendheader = "Pt (GeV):["+ binstring;

                legendheader.ReplaceAll("_",",");
                legendheader.ReplaceAll("m","-");
                legendheader.ReplaceAll("p",".");
                legendheader.Append("]");

                cout<<"legend "<<legendheader.Data()<<endl;
                legend->SetHeader(legendheader.Data());

                TObject *objdata;  //What is TObect?
                TObject *objmodel;
                TObject *objsignal;
                TObject *objfake;

                for(int i=0; i<xframe->numItems(); i++) {
                    cout<<xframe->nameOf(i)<<endl;
                    TString objname = xframe->nameOf(i);
                    if(objname.Contains("data")) objdata = (TObject*)xframe->findObject(objname.Data());
                    if(objname.Contains("model") && !objname.Contains("Comp")) objmodel = (TObject*)xframe->findObject(objname.Data());
                    if(objname.Contains("model") && objname.Contains("Signal")) objsignal = (TObject*)xframe->findObject(objname.Data());
                    if(objname.Contains("model") && objname.Contains("Background")) objfake = (TObject*)xframe->findObject(objname.Data());
                }

                //------ LEGEND --------
                legend->AddEntry(objdata,"Data","lp");
                legend->AddEntry(objsignal,"Signal","l");
                legend->AddEntry(objfake,"Background","l");
                legend->AddEntry(objmodel,"Signal + Background","l");
                legend->Draw("same");//make them overlap for comparison

                canvas->Print(("Endcapfits"+binstring+".png").Data());
                canvas->Print(("TemplateFitResultEndcap"+binstring+".C").Data());

                float fakevalue = fakenum.getValV();
                float fakeerrorhi = fakenum.getErrorHi();
                float fakeerrorlo = fakenum.getErrorLo();
                float fakeerrormax = max(fabs(fakeerrorhi),fabs(fakeerrorlo));
                TString fakeresults = TString::Format("Fake results %f +%f %f",fakevalue,fakeerrorhi,fakeerrorlo);

                canvas->SetLogy(0);

                float sigvalue = signum.getValV();
                float sigerrorhi = signum.getErrorHi();
                float sigerrorlo = signum.getErrorLo();
                float sigerrormax = max(fabs(sigerrorhi),fabs(sigerrorlo));
                TString sigresults = TString::Format("Signal results %f +%f %f",sigvalue,sigerrorhi,sigerrorlo);

                cout<<"sigvalue "<<sigvalue<<" sigerrormax "<<sigerrormax<<" sigerrormax/sigvalue "<<sigerrormax/sigvalue<<endl;
                cout<<"fakevalue "<<fakevalue<<" fakeerrormax "<<fakeerrormax<<" fakeerrormax/fakevalue "<<fakeerrormax/fakevalue<<endl;

                cout<<fakeresults.Data()<<endl;
                cout<<sigresults.Data()<<endl;

                float Ratio = (fakevalue/(fakevalue+sigvalue));
                float RatioError = Ratio*sqrt( ((fakeerrormax/fakevalue)*(fakeerrormax/fakevalue) + (sigerrormax/sigvalue)*(sigerrormax/sigvalue)) );
                cout<<"Ratio "<<Ratio<<" +- "<<RatioError<<endl;

                //---------------------- FAKE RATE CALCULATOR -------------------------
                //find the bin corresponding to 0.011
                //int binnr = 22;
                int binnr = 34;


                //compute the integral of tight and fake in that range
                float numerator = hData->Integral(0,binnr); //Is the Integral function part of RooFit?
                float denominator = hnum->Integral();


                float contamination = sigvalue;
                cout<<numerator<<" "<<denominator<<" "<<contamination<<endl;

                float fakerate = (numerator-contamination)/denominator;
                float fakerateerror = fakerate * sqrt( (1./numerator) + (1./denominator) + ((sigerrormax/sigvalue)*(sigerrormax/sigvalue)) );

                cout<<"Here: "<<fakerate<<" "<<fakerateerror<<endl;

                //fakerateptvalues.push_back(hnumvspt->GetMean());
                fakeratevalues.push_back(fakerate);
                fakerateerrorvalues.push_back(fakerateerror);

                cout<<""<<endl;
                cout<<"***********************************************************"<<endl;
                cout<<"So in sigmaietaieta < 0.011 there are "<<contamination<<" to subtract from "<<numerator<<endl;
                cout<<"and thus there are "<<(numerator-contamination)<<" total tight entries "<<endl;
                cout<<"and there are "<<denominator<<" entries in the tight and fake sample "<<endl;
                cout<<"and so the fake rate for the pt range "<<binlow<<"-"<<binmax<<" is "<<fakerate<<"+-"<<fakerateerror<<endl;
                cout<<"***********************************************************"<<endl;
                cout<<""<<endl;

            }//loop on all bins


            /*
            	  cout<<fakeratevalues.size()<<endl;
            	  for(int k=0;k<fakeratevalues.size();k++){
            	    cout<<"Range: ["<<allbins[l][k]<<"-"<<allbins[l][k+1]<<"] --> fake rate: ("<<fakeratevalues[k]*100<<" +- "<<fakerateerrorvalues[k]*100<<")%"<<endl;
            	  }//end of loop over all fake rate values


                // *************************************************************-//

                //
            	  TGraphErrors *FRgraph = new TGraphErrors(fakeratevalues.size());
            	  for(int k=0;k<fakeratevalues.size();k++){
            	    cout<<(allbins[l][k+1]+allbins[l][k])/2.<<endl;
            	    FRgraph->SetPoint(k,(allbins[l][k+1]+allbins[l][k])/2.,fakeratevalues[k]);
            	    FRgraph->SetPointError(k,(allbins[l][k+1]-allbins[l][k])/2.,fakerateerrorvalues[k]);
            	  }//end of filling TGraph

               //// FRGraph->SetName(FakeRate.Data());
            	  FRgraph->SetTitle("");

            	  canvas->cd();
                canvas->SetLogy(0);
            	  FRgraph->Draw("a*");


                // **********************************************************-//



                 //  *****************************************

            	  //float maxFRvalue = max_element(fakeratevalues.begin(),fakeratevalues.end());
            	  FRgraph->GetYaxis()->SetRangeUser(0.,0.2);
            	  FRgraph->GetYaxis()->SetTitle("#epsilon_{FR}");
            	  FRgraph->GetXaxis()->SetTitle((GraphXTitleString[l]).Data());

                TString FakeRateFunctionName = "
                TF1 *FRfunc = new TF1(FakeRateFunctionName.Data(),"[0]+[1]/pow(x,[2])", allbins[l][0],allbins[l][fakeratevalues.size()]);
                FRfunc->SetParameters(1.,1.,1.);
                if(l==0){
            	    FRgraph->Fit(FakeRateFunctionName.Data(),"R");
            	    FRgraph->Fit(FakeRateFunctionName.Data());
            	    FRfunc->Draw("same");
            	  }


                // ********************************************
            	  cout<<"***** Fit function parameters *****"<<endl;
            	  cout<<FRfunc->GetParameter(0)<<" "
            	      <<FRfunc->GetParameter(1)<<" "
            	      <<FRfunc->GetParameter(2)<<" "
            	      <<endl;

            	  cout<<"***** Fit function errors *****"<<endl;
            	  cout<<FRfunc->GetParError(0)<<" "
            	      <<FRfunc->GetParError(1)<<" "
            	      <<FRfunc->GetParError(2)<<" "
            	      <<endl;

            	  if(!debugtest){
            	    canvas->Print(("FakeRateJetRun2012ABCD13JulLoose.png").Data(),"png");
            	    canvas->Print(("FakeRateJetRun2012ABCD13JulLoose.gif").Data(),"gif");
            	    canvas->Print(("FakeRateJetRun2012ABCD13JulLoose.eps").Data(),"eps");
            	    canvas->Print(("FakeRateJetRun2012ABCD13JulLoos.pdf").Data(),"pdf");
            	    canvas->Print(("FakeRateJetRun2012ABCD13JulLoose.C").Data(),"cxx");
            	  }

                canvas->Print(("FakeRateEndCaps.png").Data(),"png");
                canvas->Print(("FakeRateEndCaps.C").Data(),"cxx");
                // ************************************************

            	  if(!debugtest){
            	    if(count == 0){
            	      FRhistosfile->cd();
            	      FRgraph->Write();
            	      FRfunc->Write();
            	    }
            	  }
            	  if(numbersigmas != 0){
            	    FRgraph->SetLineColor(count+numbersigmas+1);
            	    FRgraph->SetMarkerColor(count+numbersigmas+1);
            	    TString numsigmastring = TString::Format("%d #sigma",count);
            	    legendAllGraphs->AddEntry(FRgraph,numsigmastring.Data(),"lep");
            	  }

            	  mg->Add(FRgraph);*/
//	}//end of loop over systematic errors


            if(numbersigmas != 0) {
                mg->Draw();
                legendAllGraphs->Draw("same");
            }

        }//end of loop over all variables (pt, eta, phi, pu)

    }//end of loop over template variables

    histojetfile->cd();
    histojetfile->Close();

    historealmcfile->cd();
    historealmcfile->Close();

    FRhistosfile->cd();
    FRhistosfile->Close();

// }//end of loop over sideband definitions

}//end of method
コード例 #3
0
void checkFitCBBW(float mass,float width,string channel, string modelName,double Ymax,bool testGeneratedKinematics=0,bool testKinematicsWithoutSelection =0)
{
  
   
  float gamma = width*mass;
  
  std::ostringstream s;
  s<< mass;
  std::string Mass(s.str());
  std::ostringstream ss; int temp_width = width*10;
  ss<<temp_width;
  std::string swidth(ss.str());
  
  
  string sMCname = "MC sample, m_{VV}="+Mass+", width=0."+swidth;
  string suffix ="#"+channel;
  if(channel.find("mu")==string::npos)
  {
    suffix = "e";
  }
  string name= modelName+" #rightarrow "+suffix+", m_{WW} = "+Mass;
  string soutput_pdf_name = "/usr/users/dschaefer/root/results/testFit/M"+Mass+"/"+modelName+"_M"+Mass+"_"+"width0p"+swidth+"_"+channel+"_matchedJet.pdf";
  if(testGeneratedKinematics)
  {
    soutput_pdf_name = "/usr/users/dschaefer/root/results/testFit/M"+Mass+"/"+modelName+"_M"+Mass+"_"+"width0p"+swidth+"_"+channel+"_matchedJet_gen.pdf";
  }
  if(testKinematicsWithoutSelection)
  {
    soutput_pdf_name = "/usr/users/dschaefer/root/results/testFit/M"+Mass+"/"+modelName+"_M"+Mass+"_"+"width0p"+swidth+"_"+channel+"_withoutSelections.pdf";
  }
  string sfile_narrow;
  if(mass == 800 or mass ==1600)
  {
    sfile_narrow ="/usr/users/dschaefer/root/results/BulkGrav/BulkGrav_M"+Mass+"_width0p0_mWW_"+channel+".root";
    if(testKinematicsWithoutSelection)
    {
       sfile_narrow ="/usr/users/dschaefer/root/results/BulkGrav/BulkGrav_M"+Mass+"_width0p0_mWW_"+channel+"_withoutSelection.root";
    }
  }
  else
  {
  sfile_narrow ="/usr/users/dschaefer/root/results/Wprime/Wprime_M"+Mass+"_width0p0_mWW_"+channel+".root";

  }
  string sfile_width ="/usr/users/dschaefer/root/results/"+modelName+"/"+modelName+"_M"+Mass+"_width0p"+swidth+"_mWW_"+channel+".root";
  if(testGeneratedKinematics)
  {
    sfile_width ="/usr/users/dschaefer/root/results/"+modelName+"/"+modelName+"_M"+Mass+"_width0p"+swidth+"_mWW_"+channel+"_gen.root";
  }
  if(testKinematicsWithoutSelection)
  {
    sfile_width ="/usr/users/dschaefer/root/results/"+modelName+"/"+modelName+"_M"+Mass+"_width0p"+swidth+"_mWW_"+channel+"_withoutSelection.root";
  }
  const char* file_width = sfile_width.c_str();
  const char* file_narrow = sfile_narrow.c_str();
  const char* MCname= sMCname.c_str();
  const char* title = name.c_str();
  const char* output_pdf_name = soutput_pdf_name.c_str();
  
  TFile *f = new TFile(file_width,"READ");
  TFile *f_narrow = new TFile(file_narrow,"READ");
  TH1F* h = (TH1F*) f->Get("hmWW");
  TH1F* h_narrow = (TH1F*) f_narrow->Get("hmWW");
  int tmp = h_narrow->GetSize()-2;
  double massMax_narrow = h_narrow->GetBinLowEdge(h_narrow->GetBin(tmp));
  double massMin_narrow = h_narrow->GetBinLowEdge(0);
  tmp = h->GetSize()-2;
  double massMax_width = h->GetBinLowEdge(h->GetBin(tmp));
  double massMin_width = h->GetBinLowEdge(0);
  RooRealVar m_narrow("m","m",massMin_narrow, massMax_narrow);
  RooRealVar m_width("m_w","m_w",massMin_width,massMax_width);
  
  float mCBMin;
  float mCBMax;
  float sCB;
  float sCBMin;
  float sCBMax;
  float n1;
  float n1Max;
  float n1Min;
  float n2Max;
  float n2Min;
  float n2;
  float alpha1;
  float alpha11Min;
  float alpha1Max;
  float alpha1Min;
  float alpha2Max;
  float alpha2Min;
  float alpha2;
  
 
  
  if(mass == 800)
  {
    
   sCB =50; sCBMin =40; sCBMax=70;
   n1 = 15.; n1Min=5.;n1Max =25.;
   n2 = 15.; n2Min=5.;n2Max =25.;
   alpha1 =1.5;alpha1Min=1.;alpha1Max=1.9;
   alpha2 =1.64;alpha2Min=1.;alpha2Max=1.9;
  }
  if(mass == 1200)
  {
    
   sCB =50; sCBMin =40; sCBMax=70;
   n1 = 15.; n1Min=5.;n1Max =25.;
   n2 = 15.; n2Min=5.;n2Max =25.;
   alpha1 =1.5;alpha1Min=1.;alpha1Max=1.9;
   alpha2 =1.64;alpha2Min=1.;alpha2Max=1.9;
  }
  if(mass == 2000)
  {
    sCB =150; sCBMin =110; sCBMax=175;
   n1 = 10.; n1Min=0.01;n1Max =35.;
   n2 = 20; n2Min=0.01;n2Max =35.;
   alpha1 =1.5;alpha1Min=0.5;alpha1Max=3.;
   alpha2 =1.5;alpha2Min=0.5;alpha2Max=3.0;
    
  }
  if(mass == 3000)
  {
   sCB =150; sCBMin =110; sCBMax=175;
   n1 = 10.; n1Min=0.01;n1Max =35.;
   n2 = 20; n2Min=0.01;n2Max =35.;
   alpha1 =1.5;alpha1Min=0.5;alpha1Max=3.;
   alpha2 =1.5;alpha2Min=0.5;alpha2Max=3.0;
  }
  if(mass==4000)
  {
  sCB =200; sCBMin =140; sCBMax=230;
   n1 = 10.; n1Min=0.01;n1Max =35.;
   n2 = 20; n2Min=0.01;n2Max =35.;
   alpha1 =1.5;alpha1Min=0.5;alpha1Max=3.;
   alpha2 =1.5;alpha2Min=0.5;alpha2Max=3.0;
  }
  
 
  
  
  
  
  RooRealVar m_new = m_width;
  m_new.setBins(1000,"cache");
  RooRealVar mean_CB("mean_CB","mean_CB",mass+90,mass-20,mass+100);
  RooRealVar sigma_CB("sigma_CB","sigma_CB",sCB,sCBMin,sCBMax);
  RooRealVar n1_CB("n1_CB","n1_CB",n1,n1Min,n1Max);
  RooRealVar alpha2_CB("alpha2_CB","alpha2_CB",alpha2,alpha2Min,alpha2Max);
  RooRealVar n2_CB("n2_CB","n2_CB",n2,n2Min,n2Max);
  RooRealVar alpha1_CB("alpha1_CB","alpha1_CB",alpha1,alpha1Min,alpha1Max); 
  
  RooRealVar mean_conv("mean_conv","mean_conv",0);
  RooRealVar width_BW("width_BW","width_BW",gamma);
 
  
  RooDoubleCrystalBall CB("CB","CB",m_narrow,mean_CB,sigma_CB,alpha1_CB,n1_CB,alpha2_CB,n2_CB);
  
  RooDataHist dh_narrow("dh_narrow","dh_narrow",m_narrow,Import(*h_narrow));
  CB.fitTo(dh_narrow);
  mean_CB.getVal();
  sigma_CB.getVal();
  n1_CB.getVal();
  n2_CB.getVal();
  alpha1_CB.getVal();
  alpha2_CB.getVal();
  RooBWRunPdf BW("BW","BW",m_new,mean_CB,width_BW);
  RooDoubleCrystalBall CB_fitted("CB_fitted","CB_fitted",m_new,mean_conv,sigma_CB,alpha1_CB,n1_CB,alpha2_CB,n2_CB);
  
  RooDataHist dh("dh","dh",m_width,Import(*h));
  
  RooPlot* frame = m_width.frame();
  frame->GetXaxis()->SetTitle("m_{VV} [GeV]");
  frame->SetTitle(title);
  frame->GetYaxis()->SetTitleOffset(1.4);
  frame->setPadFactor(1);
  dh.plotOn(frame,"name_dh");
  
  if(testKinematicsWithoutSelection)
  {
    RooBWRunPdf BW_withoutSelection("BW_wS","BW_wS",m_width,mean_CB,width_BW);
    BW_withoutSelection.plotOn(frame,"name_model_pdf");
   
  }
  else
  {
  RooFFTConvPdf model_pdf("conv","conv",m_new,BW,CB_fitted); 
  model_pdf.setBufferFraction(5.0);
  model_pdf.plotOn(frame,"name_model_pdf");
  }

  
 
  
  //BW.plotOn(frame,MarkerColor(kRed),LineColor(kRed));
  //CB.plotOn(frame,MarkerColor(kGreen),LineColor(kGreen));
  
  
  //model_pdf.fitTo(dh);
  
  RooPlot* frame_narrow_fit = m_narrow.frame();
  frame_narrow_fit->GetXaxis()->SetTitle("m_{VV} [GeV]");
  frame_narrow_fit->SetTitle("Double Crystall Ball");
  dh_narrow.plotOn(frame_narrow_fit);
  CB.plotOn(frame_narrow_fit);
  
  
  
  TCanvas* canvas1 = new TCanvas("canvas1","canvas1",400,600);
  gPad->SetLeftMargin(0.15);
  TPad* pad1 = new TPad("pad1","pad1",0.,0.2,1.,1.0);
  TPad* pad2 = new TPad("pad2","pad2",0.,0.,1.0,0.2);
  pad1->SetLeftMargin(0.15);
  pad2->SetLeftMargin(0.15);
  pad1->Draw();
  pad2->Draw();
  pad1->cd();
  frame->GetYaxis()->SetTitleOffset(2.0);
  //double Ymax = 400;
  frame->SetMaximum(Ymax);
  frame->Draw();
  TString dh_name = frame->nameOf(0);
  TString model_pdf_name = frame->nameOf(1);
  TLegend* leg = new TLegend(0.48,0.89,0.89,0.8);//0.48,0.89,0.9,0.8)
  leg->SetBorderSize(0);
  leg->SetFillColor(0);
  leg->AddEntry(frame->findObject(dh_name),MCname,"lep");
  if(testKinematicsWithoutSelection)
  {
  leg->AddEntry(frame->findObject(model_pdf_name),"Breit-Wigner ","L");
  }
  else
  {
    leg->AddEntry(frame->findObject(model_pdf_name),"(CB*BW)(m) ","L");
  }
  leg->Draw();
  double chi2 = frame->chiSquare();
  string schi2 = "X^{2} ="+std::to_string(chi2); 
  const char* textChi2 = schi2.c_str();
  TLatex text;
  text.SetTextFont(43);
  text.SetTextSize(16);
  text.DrawLatex(massMin_width+(massMax_width-massMin_width)/10.,Ymax-Ymax/10.,textChi2);
  
  RooPlot* frame2 = m_width.frame();
  frame2->addObject(frame->pullHist());
  frame2->SetMinimum(-25);
  frame2->SetMaximum(15);
  frame2->SetTitle("pulls");
  pad2->cd();
  frame2->Draw();
  canvas1->SaveAs(output_pdf_name);
  
  TCanvas* canvas2 = new TCanvas("canvas2","canvas2",400,400);
  canvas2->cd();
  frame_narrow_fit->Draw();
 
   
}