Ejemplo n.º 1
0
void chi2(int xmin = 0, int xmax = 200, TString filename="../DsubMC/met2j0bIso2ewkScale_0_200.root", int nparam = 2){
RooAbsData::ErrorType errorType = RooAbsData::SumW2;

file = new TFile(filename);
RooRealVar* h = new RooRealVar("h","h",xmin,xmax); 

//Get Data
TH1D* hData = file->Get("dataih");
hData->SetName("hData");
//hData->Draw();
RooDataHist* data = new RooDataHist("data","data",*h,hData);

//Get Summed MC
TH1D* hMC = file->Get("hh");
hMC->SetName("hMC");
hMC->Draw();
RooDataHist rdhMC("MC","MC",*h,hMC);
RooHistPdf pdfMC("MCpdf","MCpdf",*h,rdhMC);

//make (plot) the curves
RooPlot* hFrame = h->frame(Name("hFrame"));
data->plotOn(hFrame,RooFit::DataError(errorType));
pdfMC.plotOn(hFrame,ProjWData(*data),Components(pdfMC),Name("h_total"));

//Determine Chi^2
double chi2fit = hFrame->chiSquare("h_total", "h_data", nparam);
cout<<"Chi 2 / dof: "<<chi2fit<<endl;

//Determine K-S
double ks = hMC->KolmogorovTest(hData);
cout<<"Kolmogorov-Smirnov: "<<ks<<endl;
}
Ejemplo n.º 2
0
void MCStudy()
{
    
    string fileName = "h4l_Template_2012_lowmass_unconstrained_new_v00.root";
    
    const char * wsName      = "combined";    //"w";
    const char * modelSBName = "ModelConfig"; //"modelConfig";
    const char * dataName    = dataname.c_str();
    
    TFile* file = TFile::Open(fileName);

    // get the workspace out of file
    RooWorkspace* w = (RooWorkspace*) file->Get(wsName);
    if (!wsName) {
        cout << "workspace not found" << endl;
        return -1.0;
    }
    
    // get the modelConfig out of the file
    ModelConfig* sbModel = (ModelConfig*) w->obj(modelSBName);
    
    // get the data out of file
    //RooAbsData* data = w->data(dataName);
    
    // get toy MC data
    TFile *fhist = new TFile("../ToyMC/toyMC_ggF125.root");
    TH1F *hsum = (TH1F*) fhist->Get("sumtoy1");
    
    RooRealVar m4l("m4l","m4l",120,130);
    RooDataHist* data = new RooDataHist("data","data",x,hsum);
    
    // get pdf
    RooAbsPdf* model = sbModel->GetPdf();
    
    RooPlot* xframe = m4l.frame();
    data->plotOn(xframe);
    model->fitTo(*data);
    model->plotOn(xframe,LineColor(kRed));
    
    TCanvas *c = new TCanvas("c","c");
    xframe->Draw();
    
}
Ejemplo n.º 3
0
void simul(){

	TFile* in = new TFile( "../bin/Kdata.root", "READ" );

	TH1D* h = in->Get("tof_8");

	RooRealVar * x = new RooRealVar( "x", "x", -10, 10 );

	RooDataHist * rdh = new RooDataHist( "data", "data", RooArgSet( *x ), h);

	RooRealVar m( "mean", "mean", 0, -1, 1 );
	RooRealVar s( "sigma", "sigma", .5, 0, 1 );
	RooGaussian g( "gauss", "gauss", )

	RooPlot * frame = x->frame();
	rdh->plotOn( frame );
	frame->Draw();
	

}
Ejemplo n.º 4
0
void MakeSpinPlots::DrawSpinSubTotBackground(TString mcName,bool signal){
  bool drawSM = (smName!="" && smName!=mcName);

  TCanvas cv;
  double thisN  = ws->data(mcName+"_Combined")->sumEntries();
  float norm = thisN;


  if(signal) norm = ws->var(Form("Data_%s_FULLFIT_Nsig",mcName.Data()))->getVal();
  RooPlot *frame = ws->var("cosT")->frame(0,1,10);

  RooDataSet* tmp = (RooDataSet*)ws->data(Form("Data_Combined"))->reduce("(mass>115 && mass<120) || (mass>130 && mass<135)");
  tmp->plotOn(frame,RooFit::Rescale(norm/tmp->sumEntries()));

  ws->pdf(Form("%s_FIT_cosTpdf",mcName.Data()))->plotOn(frame,RooFit::LineColor(kGreen),RooFit::Normalization(norm/tmp->sumEntries()));
  if(drawSM)  ws->pdf(Form("%s_FIT_cosTpdf",smName.Data()))->plotOn(frame,RooFit::LineColor(kRed),RooFit::Normalization(norm/tmp->sumEntries()));
  if(signal){
    RooDataHist *h = (RooDataHist*)ws->data( Form("Data_%s_Combined_bkgSub_cosT",mcName.Data()) );
    h->plotOn(frame,RooFit::MarkerStyle(4));
    std::cout << "Nsig: " << h->sumEntries() << std::endl;
  }

  
  frame->SetMaximum(frame->GetMaximum()*(signal?2.:1.2)*norm/tmp->sumEntries());
  frame->SetMinimum(-1*frame->GetMaximum());
  TLegend l(0.6,0.2,0.95,0.45);
  l.SetFillColor(0);
  l.SetBorderSize(0);
  l.SetHeader("Combined");
  l.AddEntry(frame->getObject(0),"Data m#in [115,120]#cup[130,135]","p");
  l.AddEntry(frame->getObject(1),mcName,"l");
  if(drawSM) l.AddEntry(frame->getObject(2),"SM Higgs","l");
  if(signal) l.AddEntry(frame->getObject(2+drawSM),"bkg-subtracted Data","p");
  
  frame->Draw();
  l.Draw("SAME");
  cv.SaveAs( basePath+Form("/cosThetaPlots/CosThetaDist_SimpleSub_%s%s_%s.png",outputTag.Data(),(signal ? "":"_BLIND"),mcName.Data()) );
  cv.SaveAs( basePath+Form("/cosThetaPlots/C/CosThetaDist_SimpleSub_%s%s_%s.C",outputTag.Data(),(signal ? "":"_BLIND"),mcName.Data()) );
  cv.SaveAs( basePath+Form("/cosThetaPlots/CosThetaDist_SimpleSub_%s%s_%s.pdf",outputTag.Data(),(signal ? "":"_BLIND"),mcName.Data()) );
}
Ejemplo n.º 5
0
RooFitResult* fitter_Zee(TH1D *hist){

  RooRealVar  Zmassvar("Zmassvar","Zmassvar", 82, 100);
  RooDataHist *datahist = new RooDataHist("data","Z Mass",Zmassvar,hist);
  RooPlot *Zmassvarframe = Zmassvar.frame(Name("Zmassvarframe"),Title(hist->GetTitle())) ;
  datahist->plotOn(Zmassvarframe);
  
  RooRealVar alpha  ("alpha"  ,        "alpha" , 0.005,0.001,0.1); 
  RooRealVar n      ("n"      ,            "n" , 1,0.001,10); 
  RooRealVar cbmean ("cbmean" ,       "cbmean" , 1, 0.8, 1.2);
  RooRealVar cbsigma("cbsigma",      "cbsigma" , 0.01, 0.001, 0.2);

  RooRealVar bwmean("bwmean","bwmean",91,85,95);
  RooRealVar bwsigma("bwsigma","bwsigma",3,2,4);
  RooRealVar expoconst("expoconst","expoconst",-0.1,-0.5,0);

  RooCBShape cball  ("cball"  , "crystal ball" , Zmassvar, cbmean, cbsigma, alpha, n);
  RooBreitWigner bw("bw","breit wigner",Zmassvar,bwmean,bwsigma);

  RooFFTConvPdf cballXbw("cballXbw","cball (X) bw",Zmassvar,bw,cball);
  RooExponential expo("expo", "exponential", Zmassvar, expoconst);

  RooRealVar frac("frac","frac",0.1,0.001,0.2);

  RooAddPdf Zshapemodel("Zshapemodel","expo + cball (X) bw",RooArgList(expo,cballXbw),frac);


  RooFitResult *fitres =Zshapemodel.fitTo(*datahist,Range(82,100),Save());   
  Zshapemodel.plotOn(Zmassvarframe,LineColor(kBlue));

  Zmassvarframe->Draw();

  fitres->Print();

  return fitres;

};
Ejemplo n.º 6
0
void DrawMass(int iSEL)
{
  gROOT->ForceStyle();
  TString SET[2] = {"A","B"};
  RooMsgService::instance().setSilentMode(kTRUE);
  for(int i=0;i<2;i++) {
    RooMsgService::instance().setStreamStatus(i,kFALSE);
  }
  TString SELECTION[2] = {"NOM","VBF"};
  TString MASS_RAW[2]  = {"mbb[1]","mbb[2]"};
  TString MASS_REG[2]  = {"mbbReg[1]","mbbReg[2]"};

 // TFile *inf = TFile::Open("Fit_VBFPowheg125_sel"+SELECTION[iSEL]+".root");
  TFile *inf = TFile::Open("/usb/data2/UAData/2015/flatTree_VBFPowheg125.root");
  TTree *tr  = (TTree*)inf->Get("Hbb/events");

  TH1F *hRaw = new TH1F("hRawMass","hRawMass",150,0,300);
  TH1F *hReg = new TH1F("hRegMass","hRegMass",150,0,300);

  RooRealVar x("mbb","mbb",60,170);

  TCanvas *can = new TCanvas("Mbb_sel"+SELECTION[iSEL],"Mbb_sel"+SELECTION[iSEL],900,750);
  
  TCut ct1 = TCut("triggerResult[0]==1||triggerResult[1]==1");
  TCut cs1 = TCut("jetBtag[b1[1]]>0.244 && jetBtag[b2[1]]>0.244 && jetPt[3]>40. && jetPt[2]>50. && jetPt[1]>70. && jetPt[0]>80. && dEtaqq[1]>2.5 && mqq[1]>250 && dPhibb[1]<2.0 && nLeptons==0");
  tr->Draw(MASS_RAW[iSEL]+">>hRawMass",ct1&&cs1);
  tr->Draw(MASS_REG[iSEL]+">>hRegMass",ct1&&cs1);

  hRaw->Sumw2();
  hReg->Sumw2();
  hRaw->Scale(1./(hRaw->Integral()*hRaw->GetBinWidth(1)));
  hReg->Scale(1./(hReg->Integral()*hReg->GetBinWidth(1)));

  RooDataHist *rRaw = new RooDataHist("rRaw","rRaw",x,hRaw);
  RooDataHist *rReg = new RooDataHist("rReg","rReg",x,hReg);

  RooRealVar m1("m1","m1",125,110,140); 
  RooRealVar m2("m2","m2",125,110,140);
  RooRealVar sL1("sL1","sL1",12,3,30); 
  RooRealVar sL2("sL2","sL2",12,3,30);
  RooRealVar sR1("sR1","sR1",12,3,30); 
  RooRealVar sR2("sR2","sR2",12,3,30);
  RooRealVar a1("a1","a1",1,-10,10); 
  RooRealVar a2("a2","a2",1,-10,10); 
  RooRealVar n1("n1","n1",1,0,100); 
  RooRealVar n2("n2","n2",1,0,100);        
  RooRealVar b10("b10","b10",0.5,0.,1.);
  RooRealVar b11("b11","b11",0.5,0.,1.);
  RooRealVar b12("b12","b12",0.5,0.,1.);
  RooRealVar b13("b13","b13",0.5,0.,1.);
  RooRealVar b20("b20","b20",0.5,0.,1.);
  RooRealVar b21("b21","b21",0.5,0.,1.);
  RooRealVar b22("b22","b22",0.5,0.,1.); 
  RooRealVar b23("b23","b23",0.5,0.,1.);     
        
  RooBernstein bkg1("bkg1","bkg1",x,RooArgSet(b10,b11,b12,b13));
  RooBernstein bkg2("bkg2","bkg2",x,RooArgSet(b20,b21,b22,b23));
  RooRealVar fsig1("fsig1","fsig1",0.7,0.,1.); 
  RooRealVar fsig2("fsig2","fsig2",0.7,0.,1.);     
  RooBifurGauss sig1("sig1","sig1",x,m1,sL1,sR1);
  RooBifurGauss sig2("sig2","sig2",x,m2,sL2,sR2);
  //RooCBShape sig1("sig1","sig1",x,m1,s1,a1,n1);
  //RooCBShape sig2("sig2","sig2",x,m2,s2,a2,n2);
        
  RooAddPdf *model1 = new RooAddPdf("model1","model1",RooArgList(sig1,bkg1),fsig1);
  RooAddPdf *model2 = new RooAddPdf("model2","model2",RooArgList(sig2,bkg2),fsig2);

  model1->fitTo(*rRaw,SumW2Error(kFALSE),"q");
  model2->fitTo(*rReg,SumW2Error(kFALSE),"q");

  hRaw->SetLineWidth(2);
  hReg->SetLineWidth(2);
  hRaw->SetLineColor(kBlack);
  hReg->SetLineColor(kRed+1); 
  hReg->SetFillColor(kRed-10);
  hRaw->SetMarkerStyle(21);
  hReg->SetMarkerStyle(20);
  hRaw->SetMarkerSize(1.5);
  hReg->SetMarkerSize(1.5);
  hRaw->SetMarkerColor(kBlack);
  hReg->SetMarkerColor(kRed+1);
  
  RooPlot* frame = x.frame();
  rRaw->plotOn(frame,LineColor(kBlack),LineWidth(1),MarkerColor(kBlack),MarkerStyle(21));
  model1->plotOn(frame,LineColor(kBlack),LineWidth(2));
  rReg->plotOn(frame,LineColor(kRed+1),LineWidth(1),MarkerColor(kRed+1),MarkerStyle(20));
  model2->plotOn(frame,LineColor(kRed+1),LineWidth(2));

  
  TF1 *tmp_func1 = model1->asTF(x,fsig1,x);
  TF1 *tmp_func2 = model2->asTF(x,fsig2,x);
  double y01 = tmp_func1->GetMaximum();
  double x01 = tmp_func1->GetMaximumX();
  double x11 = tmp_func1->GetX(y01/2,60,x01);
  double x21 = tmp_func1->GetX(y01/2,x01,200);
  double FWHM1 = x21-x11;
  
  double y02 = tmp_func2->GetMaximum();
  double x02 = tmp_func2->GetMaximumX();
  double x12 = tmp_func2->GetX(y02/2,60,x02);
  double x22 = tmp_func2->GetX(y02/2,x02,200);
  double FWHM2 = x22-x12;
  
  hReg->GetXaxis()->SetRangeUser(60,170);
  hReg->GetXaxis()->SetTitle("m_{bb} (GeV)");
  hReg->GetYaxis()->SetTitle("1/N #times dN/dm_{bb} (GeV^{-1})");
  hReg->GetYaxis()->SetNdivisions(505);
  hReg->SetMaximum(0.035);
  hReg->Draw("HIST");
  hRaw->Draw("HIST SAME");
  frame->Draw("same");

  TLegend *leg = new TLegend(0.18,0.7,0.43,0.91);
  leg->SetTextFont(42);
  leg->SetTextSize(0.05);
  leg->SetBorderSize(0);
  leg->SetFillColor(0);
  leg->SetHeader("m_{H} = 125 GeV (set "+SET[iSEL]+")");
  leg->AddEntry(hReg,"Regressed","LP");
  leg->AddEntry(hRaw,"Raw","LP");
  leg->Draw();

  TPaveText *pave1 = new TPaveText(0.18,0.56,0.43,0.7,"NDC");
  pave1->AddText(TString::Format("PEAK = %1.1f GeV",x02));
  pave1->AddText(TString::Format("FWHM = %1.1f GeV",FWHM2));
  pave1->SetTextFont(42);
  pave1->SetTextSize(0.04);
  pave1->SetTextColor(kRed+1);
  pave1->SetBorderSize(0);
  pave1->SetFillColor(0);
  pave1->Draw();

  TPaveText *pave2 = new TPaveText(0.18,0.42,0.43,0.56,"NDC");
  pave2->AddText(TString::Format("PEAK = %1.1f GeV",x01));
  pave2->AddText(TString::Format("FWHM = %1.1f GeV",FWHM1));
  pave2->SetTextFont(42);
  pave2->SetTextSize(0.04);
  pave2->SetTextColor(kBlack);
  pave2->SetBorderSize(0);
  pave2->SetFillColor(0);
  pave2->Draw();


  can->SaveAs("regressionKost.pdf");
//  CMS_lumi(can,0,0); 
}
Ejemplo n.º 7
0
int scaleSmearFit(TString RDFile, TString MCFile, char BaseName[30])
{
  cout<<"Processing "<<BaseName<<endl;
  gStyle->SetPalette(1);
  //Data and histograms
  TFile *f_RD = new TFile(RDFile);
  TFile *f_MC = new TFile(MCFile);
  TH1D *h1_ZmassDaughEtaRD = (TH1D*)f_RD->Get("h1_ZmassDaughEtaRD")->Clone();
  TH1D *h1_ZmassDaughEtaMC[ScaleBins][ScaleBins];
  //Variables
  char histName[30];
  RooRealVar zMass("zMass","zMass",60,120);
  RooRealVar *nMC;
  RooRealVar nBRD("nBRD","nBRD",5,2000);
  RooRealVar nSRD("nSRD","nSRD",1000,0,20000);
  RooRealVar nBMC("nBMC","nBMC",5,2000);
  RooRealVar nSMC("nSMC","nSMC",1000,0,20000);
  RooPlot *zmassframe;
  RooPlot *zmassframeMC;
  CPlot *plotFit;
  CPlot *plotFitMC;
  //zMass.setBins(50);
  RooFitResult* fitRes;
  RooFitResult* fitResMC;
  TCanvas *myCan = MakeCanvas("myCan","myCan",800,600);
  RooDataHist *ZmassMC;
  //RooHistPdf *pdfMC;
  RooAddPdf *pdfMC;
  RooAddPdf* pdfRD;
  //RD fitting
  RooDataHist *ZmassRD =
    new RooDataHist("ZmassRD","ZmassRD", RooArgSet(zMass),h1_ZmassDaughEtaRD);
  //CBreitWignerConvCrystalBall ZsignalPdf("ZsigPdf",zMass);
  //pdfRD=new RooAddPdf("pdfRD","pdfRD",RooArgList(*(ZsignalPdf.model)),RooArgList(nRD));
  CVoigtian     ZsigRD("ZsigRD",zMass);
  CErfExpo ZbgRD("ZbgRD",zMass);
  //CQuadraticExp ZbgRD("ZbgRD",zMass);
  pdfRD=new RooAddPdf("pdfRD","pdfRD",RooArgList(*(ZsigRD.model),*(ZbgRD.model)),RooArgList(nSRD,nBRD));
  pdfRD=new RooAddPdf("pdfRD","pdfRD",RooArgList(*(ZsigRD.model),*(ZbgRD.model)),RooArgList(nSRD,nBRD));
  fitRes=pdfRD->fitTo(*ZmassRD,Extended(),Minos(kTRUE),Save(kTRUE));
  //fitRes=ZsignalPdf.model->fitTo(*ZmassRD,Minos(kTRUE),Save(kTRUE));
  zmassframe=zMass.frame(Bins(60));
  ZmassRD->plotOn(zmassframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("zp"));
  //ZsignalPdf.model->plotOn(zmassframe,LineColor(kBlue),DrawOption("l"));
  pdfRD->plotOn(zmassframe,LineColor(kBlack),DrawOption("l"));
  pdfRD->plotOn(zmassframe,Components(RooArgSet(*(ZsigRD.model))),LineColor(kBlue),DrawOption("l"));
  pdfRD->plotOn(zmassframe,Components(RooArgSet(*(ZbgRD.model))),LineColor(kRed),DrawOption("l"));
  sprintf(histName,"ZmassRD_%s",BaseName);
  plotFit = new CPlot(histName,zmassframe,"","","Z mass");
  plotFit->setOutDir("Plot");
  plotFit->Draw(myCan,kTRUE,"png");

  //CErfExpo *pdfZbg;
  //double nLL[41][41];

  //                                 90 0.004
  double ScaleWidth = (ScaleH-ScaleL)/(ScaleBins-1);
  double SmearWidth = (SmearH-SmearL)/(ScaleBins-1);
  sprintf(histName,"h2_NLL_%s",BaseName);
  TH2D *h2_NLL = new TH2D(histName,histName,
      ScaleBins,ScaleL-ScaleWidth/2,ScaleH+ScaleWidth/2,
      ScaleBins,SmearL-SmearWidth/2,SmearH+SmearWidth/2);
  //TH2D *h2_NLL = new TH2D("h2_NLL","NLL",41,0.97,1.05,41,0.5,1.5);
  double x,prob;
  //RooAbsReal *nll;
  double nll;
  double binContent;
  //***
  CVoigtian ZsigMC("ZsigMC",zMass);
  RooArgSet allArgset(zMass);
  RooArgSet anaVar;
  //for(int i(0);i<=0;i++)for(int j(0);j<=0;j++)
  for(int i(0);i<=ScaleBins-1;i++)for(int j(0);j<=ScaleBins-1;j++)
  {
    sprintf(histName,"h1_ZmassDaughEta_%d_%d",i,j);
    h1_ZmassDaughEtaMC[i][j] = (TH1D*)f_MC->Get(histName)->Clone(histName);
    ZmassMC =
      new RooDataHist("ZmassMC","ZmassMC",RooArgSet(zMass),h1_ZmassDaughEtaMC[i][j]);
    //                                               interpolation order
    //pdfMC =new RooHistPdf ("pdfMC", "pdfMC", zMass,*ZmassMC, 1);
    //Using fitting MC
    nSMC.setVal(285);
    ZsigMC.mass->setVal(91.37);
    ZsigMC.sigma->setVal(0.42);
    ZsigMC.width->setVal(4.4);
    pdfMC = new RooAddPdf("pdfMC","pdfMC",RooArgList(*(ZsigMC.model)),RooArgList(nSMC));
    fitResMC = pdfMC->fitTo(*ZmassMC,Extended(),Minos(kTRUE),Save(kTRUE),SumW2Error(kTRUE));//SumW2Error(kTRUE) default

    nll=0;
    //nll= h1_ZmassDaughEtaMC[i][j]->Chi2Test(h1_ZmassDaughEtaRD,"CHI2/NDF");
    // code 1000 dataHist sum
    int intCode = pdfMC->getAnalyticalIntegral(allArgset,anaVar);
    double norm = pdfMC->analyticalIntegral(intCode);
    cout<<"norm: code "<<norm<<" : "<<intCode<<"======================"<<endl;
    //double totalProb(0);
    //****
    for(int k(1);k<=60;k++)
    {
      x=h1_ZmassDaughEtaMC[i][j]->GetBinCenter(k);
    //  binContent = h1_ZmassDaughEtaRD->GetBinContent(k);
      //binContent = h1_ZmassDaughEtaMC[i][j]->GetBinContent(k);
      zMass=x;
      //prob = ZsignalPdf.model->evaluate();
      binContent = ZsigRD.model->evaluate()*(120-60)/60.*nSRD.getVal();
      prob = pdfMC->evaluate()*(120-60)/60.;
      //cout<<"binCont, prob "<<binContent<<" "<<prob<<endl;
      //totalProb +=prob;
      nll+=-binContent*log(prob);
      //cout<<" x: prob "<<x<<"  "<<prob<<endl;
    }
    h2_NLL->SetBinContent(i+1,j+1,nll);
    /***/
    //
    //
    if( j==0 || j==int(ScaleBins/2)|| j==(ScaleBins-1) )
    {
      //RD MCpdf RDpdf Plot
      zmassframe =zMass.frame(Bins(60));
      ZmassRD->plotOn(zmassframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("zp"));
      pdfRD->plotOn(zmassframe,LineColor(kBlack));
      pdfMC->plotOn(zmassframe,LineColor(kBlue));
      //pdfRD->plotOn(zmassframe,Components(RooArgSet(*(pdfZbg->model))),LineColor(kRed));
      sprintf(histName,"Zmass_%s_%d_%d",BaseName,i,j);
      plotFit = new CPlot(histName,zmassframe,"","","Z mass");
      plotFit->SetLegend(0.68,0.57,0.93,0.8);
      plotFit->GetLegend()->AddEntry(pdfRD,"RD","f");
      plotFit->GetLegend()->AddEntry(pdfMC,"MC","f");
      plotFit->setOutDir("Plot");
      plotFit->Draw(myCan,kTRUE,"png");
      //MC MCPdf Plot
      zmassframeMC = zMass.frame(Bins(60));
      ZmassMC->plotOn(zmassframeMC,LineColor(kBlue),DrawOption("p"));
      pdfMC->plotOn(zmassframeMC,LineColor(kBlue),DrawOption("l"));
      sprintf(histName,"ZmassMC_%s_%d_%d",BaseName,i,j);
      plotFitMC = new CPlot(histName,zmassframeMC,"","","Z mass MC");
      plotFitMC->setOutDir("Plot");
      plotFitMC->Draw(myCan,kTRUE,"png");
    }
  }
  //====
  //Plot
  //====
  //Zmass----------
  //CPlot *plotZmassRD=new CPlot("plotZmassRD","","zMass","Event");
  //plotZmassRD->setOutDir("Plot");
  //plotZmassRD->AddHist1D(h1_ZmassDaughEtaRD,"",kBlack);
  //plotZmassRD->SetLegend(0.68,0.57,0.93,0.8);
  //plotZmassRD->GetLegend()->AddEntry(h1_ZmassDaughEtaRD,"RD Ele","l");
  //plotZmassRD->AddTextBox("both lepton at the |Eta|<0.4",0.65,0.80,0.99,0.86,0);
  //plotZmassRD->Draw(myCan,kTRUE,"png");
  //NLL------------
  sprintf(histName,"plotNLL_%s",BaseName);
  CPlot *plotNll=new CPlot(histName,"","Scale","Smear");
  plotNll->setOutDir("Plot");
  //plotNll->AddHist2D(h2_NLL,"COLZ",kWhite,kBlack);
  plotNll->AddHist2D(h2_NLL,"SURF3",kWhite,kBlack);
  plotNll->Draw(myCan,kTRUE,"png");
  //****/
  return 0;
}
Ejemplo n.º 8
0
void fitTopMass(const char * inFileName)
{

  gROOT->SetBatch(true);
  gSystem->Load("libRooFit");
  TFile* inFile = TFile::Open(inFileName);

  RooRealVar x("mass","M_{top}",100,200);
  using namespace std;
  vector<TH1F*> hists;
  vector<int> nTotal;
  std::vector<std::pair<float, float> >  range;

  const char* types[] = { "top1","top2","top"};
  for( auto type : types ) {
    hists.push_back (  (TH1F*)inFile->Get(TString::Format("%s_mass_GenJet",type)) ) ;
    hists.push_back (  (TH1F*)inFile->Get(TString::Format("%s_mass_Jet",type)) ) ;
    hists.push_back (  (TH1F*)inFile->Get(TString::Format("%s_mass_btagged_Jet",type)) ) ;
    hists.push_back (  (TH1F*)inFile->Get(TString::Format("%s_mass_charged_Jet",type)) ) ;
    hists.push_back (  (TH1F*)inFile->Get(TString::Format("%s_mass_btagged_charged_Jet",type)) ) ;
  }
  for( int i= 0 ; i<hists.size() ; i++) {
    if ( hists[i] == nullptr) std::cout<<"Error! Hist is nullptr."<<std::endl;
  }


  for( int i = 0 ; i < hists.size() ; i++) {
    nTotal.push_back(hists[i]->Integral());
  } 

  // For top1,
  for(int i= 0 ; i < 5 ; i++) {
    range.push_back( make_pair(150,180) ); 
  }
  // For top2,
  for(int i= 0 ; i < 5 ; i++) {
    range.push_back( make_pair(150,180) ); 
  }
  // For all top,
  for(int i= 0 ; i < 5 ; i++) {
    range.push_back( make_pair(150,180) ); 
  }
 
  for( int i= 0 ; i< hists.size() ; i++) {
    std::cout<<"hist["<<i<<"]"<<std::endl;
    RooDataHist* dh = new RooDataHist("dh","data histogram",x,hists[i]);

    auto gaus_mean = RooRealVar("gaus_mean","gaus_mean",172.5, 100,200);
    auto gaus_sigma = RooRealVar("gaus_sigma","gaus_sigma",1, 0,100);
    auto nGaus = RooRealVar("nGaus","nGaus",nTotal[i]*0.2, 0., nTotal[i]);
    auto gaus_pdf = RooGaussian("gaus_pdf","Gaussian p.d.f",x,gaus_mean, gaus_sigma);

    
    auto expo_tau = RooRealVar("exp_const","exp_const",0,-10000,10000);
    auto nExp = RooRealVar("nExp","nExp",1,0,nTotal[i]);
    auto expo_pdf = RooExponential("bkg","bkg p.d.f",x,expo_tau);

    auto CB_mean  = RooRealVar("CB_mean","CB_mean",172.5,100,200);
    auto CB_sigma = RooRealVar("CB_sigma","CB_sigma",5,0,100);
    auto CB_alpha = RooRealVar("CB_alpha","CB_alpha",1,0,100);
    auto CB_n     = RooRealVar("CB_n","CB_n",1,0,100);
    auto nCB = RooRealVar("nCB","nCB",nTotal[i]*0.8,0.,nTotal[i]);
    auto CB_pdf = RooCBShape("sig","signal p.d.f",x,CB_mean, CB_sigma, CB_alpha, CB_n );

    auto BW_mean  = RooRealVar("BW_mean","BW_mean",172.5,100,200);
    auto BW_sigma = RooRealVar("BW_sigma","BW_sigma",10,0,100);
    auto nBW = RooRealVar("nBW","nBW",nTotal[i]*0.7, 0, nTotal[i]);
    auto BW_pdf = RooBreitWigner("sig","signal p.d.f",x,BW_mean, BW_sigma );
  
    RooFormulaVar mirrorX("neg_x","-mass", RooArgSet(x)); 
    //RooRealVar landau_mean("lan_mean","Landau_mean",150.5,100,200);
    RooRealVar landau_mean("lan_mean","Landau_mean",-160,-200,-100);
    RooRealVar landau_sigma("lan_sigma","Landau_sigma",2.5, 0,100);
    RooRealVar nLandau("nLan","nlan",nTotal[i]*0.3, 0, nTotal[i]);
    RooLandau  landau_pdf("lx","lx",mirrorX,landau_mean, landau_sigma);
  
    //TF1* f1 = new TF1("landau","nLan*ROOT::Math::landau_pdf(-x,lan_sigma,-lan_mean)",100,300);
    //RooAbsPdf* invlandau_pdf = RooFit::bindPdf(f1,x,nLandau, landau_mean,landau_sigma);
    //RooGenericPdf invlandau_pdf("invLandau","ROOT::Math::landau_pdf(-x,lan_sigma,-lan_mean)",RooArgSet(x,landau_sigma,landau_mean)); 
 
    //sig_pdf = cb_pdf;
    //bkg_pdf = bw_pdf;
    
    //nsig = nCB;
    //nbkg = nBW;

    //RooFFTConvPdf model("lxg","CB (x) gauss",x,CB_pdf,gaus_pdf);
    //RooFFTConvPdf model("lxg","CB (x) BW",x,CB_pdf,BW_pdf);
    //auto model = RooAddPdf("model","model",RooArgList(landau),RooArgList(nlandau));

    //auto model = RooAddPdf("model","model",RooArgList(sig_pdf,  bkg_pdf),RooArgList(nsig, nbkg));
    //auto model = RooAddPdf("model","model",RooArgList(CB_pdf,  gaus_pdf),RooArgList(nCB, nGaus));
    RooAddPdf* model;
    RooFitResult * fitResult;
    TPaveText* t1 = new TPaveText(0.15,0.5,0.45,0.8,"brNDC");
    //auto model = RooAddPdf("model","model",RooArgList(CB_pdf,  expo_pdf),RooArgList(nCB, nExp));
    //auto model = RooAddPdf("model","model",RooArgList(CB_pdf,  BW_pdf),RooArgList(nCB, nBW));
    //auto model = RooAddPdf("model","model",RooArgList(CB_pdf),RooArgList(nCB));
    //auto model = RooAddPdf("model","model",RooArgList(cb_pdf,  gaus_pdf),RooArgList(nCB, nGaus));
    //auto model = sig_pdf;
    std::cout<<"Hello"<<std::endl;

    if ( i< 5 ) {
      /*
      model = new RooAddPdf("model","model",RooArgList(BW_pdf),RooArgList(nBW));
      fitResult = model->fitTo(*dh, RooFit::Extended(true), RooFit::Save(), RooFit::Range( range[i].first, range[i].second ));
      t1->AddText(TString::Format("Breit-Wigner ) Mean : %3.3f(+-%3.3f)", BW_mean.getVal(), BW_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", BW_sigma.getVal(), BW_sigma.getError()));
      */
      model = new RooAddPdf("model","model",RooArgList(BW_pdf, landau_pdf),RooArgList(nBW, nLandau));
      fitResult = model->fitTo(*dh, RooFit::Extended(true), RooFit::Save(), RooFit::Range( range[i].first, range[i].second ));
      t1->AddText(TString::Format("Breit-Wigner ) Mean : %3.3f(+-%3.3f)", BW_mean.getVal(), BW_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", BW_sigma.getVal(), BW_sigma.getError()));
      t1->AddText(TString::Format("Landau ) Mean : %3.3f(+-%3.3f)", landau_mean.getVal(), landau_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", landau_sigma.getVal(), landau_sigma.getError()));

    }
    if ( i>=5 && i<10 ) {
      model = new RooAddPdf("model","model",RooArgList(BW_pdf, landau_pdf),RooArgList(nBW, nLandau));
      fitResult = model->fitTo(*dh, RooFit::Extended(true), RooFit::Save(), RooFit::Range( range[i].first, range[i].second ));
      t1->AddText(TString::Format("Breit-Wigner ) Mean : %3.3f(+-%3.3f)", BW_mean.getVal(), BW_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", BW_sigma.getVal(), BW_sigma.getError()));
      t1->AddText(TString::Format("Landau ) Mean : %3.3f(+-%3.3f)", landau_mean.getVal(), landau_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", landau_sigma.getVal(), landau_sigma.getError()));

    }
    if ( i>=10 ) {
      model = new RooAddPdf("model","model",RooArgList(BW_pdf, landau_pdf),RooArgList(nBW, nLandau));
      fitResult = model->fitTo(*dh, RooFit::Extended(true), RooFit::Save(), RooFit::Range( range[i].first, range[i].second ));
      t1->AddText(TString::Format("Breit-Wigner ) Mean : %3.3f(+-%3.3f)", BW_mean.getVal(), BW_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", BW_sigma.getVal(), BW_sigma.getError()));
      t1->AddText(TString::Format("Landau ) Mean : %3.3f(+-%3.3f)", landau_mean.getVal(), landau_mean.getError()));
      t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", landau_sigma.getVal(), landau_sigma.getError()));
    }

    //t1->AddText(TString::Format("Breit-Wigner ) Mean : %3.3f(+-%3.3f)", BW_mean.getVal(), BW_mean.getError()));
    //t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)", BW_sigma.getVal(), BW_sigma.getError()));
    //t1->AddText(TString::Format("CrystalBall ) Mean : %3.3f(+-%3.3f)", CB_mean.getVal(), CB_mean.getError()));
    //t1->AddText(TString::Format("#sigma : %0.3f(+-%0.3f)  #alpha : %0.2f ", CB_sigma.getVal(), CB_sigma.getError(), CB_alpha.getVal()));
    t1->Draw();

    RooPlot* top_mass_frame = x.frame();
    dh->plotOn(top_mass_frame);

    model->plotOn(top_mass_frame);
    model->plotOn(top_mass_frame, RooFit::Components(BW_pdf),RooFit::LineStyle(kDashed));
    //model.plotOn(top_mass_frame, RooFit::Components(CB_pdf),RooFit::LineStyle(kDashed));
    //model.plotOn(top_mass_frame, RooFit::Components(gaus_pdf),RooFit::LineColor(kRed), RooFit::LineStyle(kDashed));
    model->plotOn(top_mass_frame, RooFit::Components(landau_pdf),RooFit::LineColor(kRed), RooFit::LineStyle(kDashed));

    TString canvas_name = TString::Format("FitResult_%s",hists[i]->GetName());
    TCanvas* c1 = new TCanvas(canvas_name.Data(),canvas_name.Data(),800,600);
    top_mass_frame->addObject(t1);
    top_mass_frame->Draw();
    top_mass_frame->SetTitle(canvas_name.Data());


    c1->SaveAs( (TString(c1->GetName())+".png").Data());
    c1->SaveAs( (TString("plotCode/")+TString(c1->GetName()).Strip()+".C").Data());
    delete c1;
    delete dh;
  }
}
Ejemplo n.º 9
0
double* fitHist(TCanvas *iC, bool iDoMu,int iPlot, std::string iName,TH1D *iData,TH1D *iW,TH1D *iEWK,TH1D *iAntiData,TH1D *iAntiW,TH1D *iAntiEWK,const Double_t METMAX,const Int_t NBINS,const Double_t lumi,const Int_t Ecm,int iAltQCD) {
    //
    // Declare fit parameters for signal and background yields
    // Note: W signal and EWK+top PDFs are constrained to the ratio described in MC
    //
    RooRealVar nSig(("nSig"+iName).c_str(),("nSig"+iName).c_str(),0.7*(iData->Integral()),0,iData->Integral());
    RooRealVar nQCD(("nQCD"+iName).c_str(),("nQCD"+iName).c_str(),0.3*(iData->Integral()),0,iData->Integral());
    RooRealVar cewk(("cewk"+iName).c_str(),("cewk"+iName).c_str(),0.1,0,5) ;
    cewk.setVal(iEWK->Integral()/iW->Integral());
    cewk.setConstant(kTRUE);
    RooFormulaVar nEWK(("nEWK"+iName).c_str(),("nEWK"+iName).c_str(),("cewk"+iName+"*nSig"+iName).c_str(),RooArgList(nSig,cewk));

    RooRealVar nAntiSig(("nAntiSig"+iName).c_str(),("nAntiSig"+iName).c_str(),0.05*(iAntiData->Integral()),0,iAntiData->Integral());
    RooRealVar nAntiQCD(("nAntiQCD"+iName).c_str(),("nAntiQCD"+iName).c_str(),0.9 *(iAntiData->Integral()),0,iAntiData->Integral());
    RooRealVar dewk    (("dewk"    +iName).c_str(),("dewk"    +iName).c_str(),0.1,0,5) ;
    dewk.setVal(iAntiEWK->Integral()/iAntiW->Integral());
    dewk.setConstant(kTRUE);
    RooFormulaVar nAntiEWK(("nAntiEWK"+iName).c_str(),("nAntiEWK"+iName).c_str(),("dewk"+iName+"*nAntiSig"+iName).c_str(),RooArgList(nAntiSig,dewk));

    //
    // Construct PDFs for fitting
    //
    RooRealVar pfmet(("pfmet"+iName).c_str(),("pfmet"+iName).c_str(),0,METMAX);
    pfmet.setBins(NBINS);

    // Signal PDFs
    RooDataHist wMet  (("wMET" +iName).c_str(), ("wMET" +iName).c_str(),     RooArgSet(pfmet),iW);
    RooHistPdf  pdfW(( "w"+iName).c_str(), ( "w"+iName).c_str(), pfmet, wMet, 1);
    RooDataHist awMet (("awMET"+iName).c_str(), ("awMET"+iName).c_str(),     RooArgSet(pfmet),iAntiW);
    RooHistPdf apdfW(("aw"+iName).c_str(), ("aw"+iName).c_str(), pfmet,awMet, 1);

    // EWK+top PDFs
    RooDataHist ewkMet (("ewkMET" +iName).c_str(),( "ewkMET"+iName).c_str(), RooArgSet(pfmet),iEWK);
    RooHistPdf  pdfEWK (( "ewk"+iName).c_str(),( "ewk"+iName).c_str(), pfmet,ewkMet, 1);
    RooDataHist aewkMet(("aewkMET"+iName).c_str(),("aewkMET"+iName).c_str(), RooArgSet(pfmet),iAntiEWK);
    RooHistPdf apdfEWK (("aewk"+iName).c_str(),("aewk"+iName).c_str(), pfmet,aewkMet, 1);

    // QCD Pdfs
    CPepeModel0 qcd0 (("qcd0" +iName).c_str(),pfmet);
    CPepeModel1 qcd1 (("qcd1" +iName).c_str(),pfmet);
    CPepeModel2 qcd2 (("qcd2" +iName).c_str(),pfmet);
    CPepeModel0 aqcd0(("aqcd0"+iName).c_str(),pfmet);
    CPepeModel1 aqcd1(("aqcd1"+iName).c_str(),pfmet,qcd1.sigma);
    CPepeModel2 aqcd2(("aqcd2"+iName).c_str(),pfmet);
    RooGenericPdf *lQCD  =  qcd0.model;
    RooGenericPdf *lAQCD = aqcd0.model;
    if(iDoMu) lQCD  = qcd1.model;
    if(iDoMu) lAQCD = aqcd1.model;
    if(iAltQCD == 0) lQCD = qcd0.model;
    if(iAltQCD == 1) lQCD = qcd1.model;
    if(iAltQCD == 2) lQCD = qcd2.model;
    if(iAltQCD == 0) lAQCD = aqcd0.model;
    if(iAltQCD == 1) lAQCD = aqcd1.model;
    if(iAltQCD == 2) lAQCD = aqcd2.model;

    // Signal + Background PDFs
    RooAddPdf pdfMet (("pdfMet"+iName).c_str(), ("pdfMet" +iName).c_str(), RooArgList(pdfW ,pdfEWK ,*lQCD), RooArgList(nSig,nEWK,nQCD));
    RooAddPdf apdfMet(("apdfMet"+iName).c_str(),("apdfMet"+iName).c_str(), RooArgList(apdfW,apdfEWK,*lAQCD), RooArgList(nAntiSig,nAntiEWK,nAntiQCD));

    // PDF for simultaneous fit
    RooCategory rooCat("rooCat","rooCat");
    rooCat.defineType("Select");
    rooCat.defineType("Anti");

    RooSimultaneous pdfTotal("pdfTotal","pdfTotal",rooCat);
    pdfTotal.addPdf(pdfMet, "Select");
    if(iDoMu) pdfTotal.addPdf(apdfMet,"Anti");

    // Perform fits
    RooDataHist dataMet  (("dataMet"+iName).c_str(),("dataMet"+iName).c_str(), RooArgSet(pfmet),iData);
    RooDataHist antiMet  (("antiMet"+iName).c_str(),("antiMet"+iName).c_str(), RooArgSet(pfmet),iAntiData);
    RooDataHist dataTotal(("data"   +iName).c_str(),("data"   +iName).c_str(), RooArgList(pfmet), Index(rooCat),
                          Import("Select", dataMet),
                          Import("Anti",   antiMet));

    RooFitResult *fitRes = 0;
    bool runMinos = kTRUE;
    if(iPlot == 0 || iPlot == 3) runMinos = kFALSE; //Remove Minos when running toys (too damn slow)
    if(!iDoMu) fitRes = pdfMet  .fitTo(dataMet  ,Extended(),Minos(runMinos),Save(kTRUE));
    if( iDoMu) fitRes = pdfTotal.fitTo(dataTotal,Extended(),Minos(runMinos),Save(kTRUE));

    double *lResults = new double[16];
    lResults[0]  = nSig.getVal();
    lResults[1]  = nEWK.getVal();
    lResults[2]  = nQCD.getVal();
    lResults[3]  = nAntiSig.getVal();
    lResults[4]  = nAntiEWK.getVal();
    lResults[5]  = nAntiQCD.getVal();
    if(!iDoMu) lResults[6]  = double(qcd0.sigma->getVal());
    if( iDoMu) lResults[6]  = double(qcd1.sigma->getVal());

    lResults[7]  = 0.;
    if(!iDoMu) lResults[7]  = qcd1.a1->getVal();
    lResults[8]   = nSig    .getPropagatedError(*fitRes);
    lResults[9]   = nEWK    .getPropagatedError(*fitRes);
    lResults[10]  = nQCD    .getPropagatedError(*fitRes);
    lResults[11]  = nAntiSig.getPropagatedError(*fitRes);
    lResults[12]  = nAntiEWK.getPropagatedError(*fitRes);
    lResults[13]  = nAntiQCD.getPropagatedError(*fitRes);
    if( iDoMu) lResults[14]  = qcd0.sigma->getError();
    if(!iDoMu) lResults[14]  = qcd1.sigma->getError();
    if( iDoMu) lResults[15]  = 0;
    if(!iDoMu) lResults[15]  = qcd1.a1   ->getError();
    if(iPlot == 0 ) return lResults;
    //
    // Use histogram version of fitted PDFs to make ratio plots
    // (Will also use PDF histograms later for Chi^2 and KS tests)
    //
    TH1D *hPdfMet = (TH1D*)(pdfMet.createHistogram(("hPdfMet"+iName).c_str(), pfmet));
    hPdfMet->Scale((nSig.getVal()+nEWK.getVal()+nQCD.getVal())/hPdfMet->Integral());
    TH1D *hMetDiff = makeDiffHist(iData,hPdfMet,"hMetDiff"+iName);
    hMetDiff->SetMarkerStyle(kFullCircle);
    hMetDiff->SetMarkerSize(0.9);

    TH1D *hPdfAntiMet = (TH1D*)(apdfMet.createHistogram(("hPdfAntiMet"+iName).c_str(), pfmet));
    hPdfAntiMet->Scale((nAntiSig.getVal()+nAntiEWK.getVal()+nAntiQCD.getVal())/hPdfAntiMet->Integral());
    TH1D *hAntiMetDiff = makeDiffHist(iAntiData,hPdfAntiMet,"hAntiMetDiff"+iName);
    hAntiMetDiff->SetMarkerStyle(kFullCircle);
    hAntiMetDiff->SetMarkerSize(0.9);
    if(iPlot == 3 ) {
        //Build best fit QCD with default W and EWK Shap
        TH1D *hPdfMetQCD  = (TH1D*)(lQCD ->createHistogram(("hPdfMetQCD"    +iName).c_str(), pfmet));
        TH1D *hPdfAMetQCD = (TH1D*)(lAQCD->createHistogram(("hPdfAntiMetQCD"+iName).c_str(), pfmet));
        hPdfMetQCD ->Scale(nQCD    .getVal()/hPdfMetQCD ->Integral());
        hPdfAMetQCD->Scale(nAntiQCD.getVal()/hPdfAMetQCD->Integral());

        TH1D *pW    = (TH1D*) iW      ->Clone("WForToys");
        pW   ->Scale(nSig    .getVal()/pW   ->Integral());
        TH1D *pEWK  = (TH1D*) iEWK    ->Clone("EWKForToys");
        pEWK ->Scale(nEWK    .getVal()/pEWK ->Integral());
        TH1D *pAW   = (TH1D*) iAntiW  ->Clone("AWForToys");
        pAW  ->Scale(nAntiSig.getVal()/pAW  ->Integral());
        TH1D *pAEWK = (TH1D*) iAntiEWK->Clone("AEWKForToys");
        pAEWK->Scale(nAntiEWK.getVal()/pAEWK->Integral());
        hPdfMetQCD ->Add(pW);
        hPdfMetQCD ->Add(pEWK);
        hPdfAMetQCD->Add(pAW);
        hPdfAMetQCD->Add(pAEWK);
        fBestFit     = hPdfMetQCD;
        fAntiBestFit = hPdfAMetQCD;
        return lResults;
    }

    //--------------------------------------------------------------------------------------------------------------
    // Make plots
    //==============================================================================================================
    char ylabel[100];  // string buffer for y-axis label

    // file format for output plots
    const TString format("png");

    // label for lumi
    char lumitext[100];
    if(lumi<0.1) sprintf(lumitext,"%.1f pb^{-1}  at  #sqrt{s} = %i TeV",lumi*1000.,Ecm);
    else         sprintf(lumitext,"%.2f fb^{-1}  at  #sqrt{s} = %i TeV",lumi      ,Ecm);

    // plot colors
    Int_t linecolorW   = kOrange-3;
    Int_t fillcolorW   = kOrange-2;
    Int_t linecolorEWK = kOrange+10;
    Int_t fillcolorEWK = kOrange+7;
    Int_t linecolorQCD = kViolet+2;
    Int_t fillcolorQCD = kViolet-5;
    Int_t ratioColor   = kGray+2;

    //
    // Dummy histograms for TLegend
    // (Nobody can figure out how to properly pass RooFit objects...)
    //
    TH1D *hDummyData = new TH1D("hDummyData","",0,0,10);
    hDummyData->SetMarkerStyle(kFullCircle);
    hDummyData->SetMarkerSize(0.9);

    TH1D *hDummyW = new TH1D("hDummyW","",0,0,10);
    hDummyW->SetLineColor(linecolorW);
    hDummyW->SetFillColor(fillcolorW);
    hDummyW->SetFillStyle(1001);

    TH1D *hDummyEWK = new TH1D("hDummyEWK","",0,0,10);
    hDummyEWK->SetLineColor(linecolorEWK);
    hDummyEWK->SetFillColor(fillcolorEWK);
    hDummyEWK->SetFillStyle(1001);

    TH1D *hDummyQCD = new TH1D("hDummyQCD","",0,0,10);
    hDummyQCD->SetLineColor(linecolorQCD);
    hDummyQCD->SetFillColor(fillcolorQCD);
    hDummyQCD->SetFillStyle(1001);

    //
    // W MET plot
    //
    RooPlot *wmframe = pfmet.frame(Bins(NBINS));
    dataMet.plotOn(wmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP"));
    pdfMet.plotOn(wmframe,FillColor(fillcolorW),DrawOption("F"));
    pdfMet.plotOn(wmframe,LineColor(linecolorW));
    pdfMet.plotOn(wmframe,Components(RooArgSet(pdfEWK,*lQCD)),FillColor(fillcolorEWK),DrawOption("F"));
    pdfMet.plotOn(wmframe,Components(RooArgSet(pdfEWK,*lQCD)),LineColor(linecolorEWK));
    pdfMet.plotOn(wmframe,Components(RooArgSet(*lQCD)),FillColor(fillcolorQCD),DrawOption("F"));
    pdfMet.plotOn(wmframe,Components(RooArgSet(*lQCD)),LineColor(linecolorQCD));
    pdfMet.plotOn(wmframe,Components(RooArgSet(pdfW)),LineColor(linecolorW),LineStyle(2));
    dataMet.plotOn(wmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP"));

    sprintf(ylabel,"Events / %.1f GeV",iData->GetBinWidth(1));
    CPlot plotMet(("fitmet"+iName).c_str(),wmframe,"","",ylabel);
    plotMet.SetLegend(0.68,0.57,0.93,0.77);
    plotMet.GetLegend()->AddEntry(hDummyData,"data","PL");
    plotMet.GetLegend()->AddEntry(hDummyW,"W#rightarrow#mu#nu","F");
    plotMet.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F");
    plotMet.GetLegend()->AddEntry(hDummyQCD,"QCD","F");
    plotMet.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0);
    plotMet.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0);
    plotMet.SetYRange(0.1,1.1*(iData->GetMaximum()));
    plotMet.Draw(iC,kFALSE,format,1);

    CPlot plotMetDiff(("fitmet"+iName).c_str(),"","#slash{E}_{T} [GeV]","#chi");
    plotMetDiff.AddHist1D(hMetDiff,"EX0",ratioColor);
    plotMetDiff.SetYRange(-8,8);
    plotMetDiff.AddLine(0, 0,METMAX, 0,kBlack,1);
    plotMetDiff.AddLine(0, 5,METMAX, 5,kBlack,3);
    plotMetDiff.AddLine(0,-5,METMAX,-5,kBlack,3);
    plotMetDiff.Draw(iC,kTRUE,format,2);
    plotMet.Draw(iC,kTRUE,format,1);

    plotMet.SetName(("fitmetlog"+iName).c_str());
    plotMet.SetLogy();
    plotMet.SetYRange(1e-3*(iData->GetMaximum()),10*(iData->GetMaximum()));
    plotMet.Draw(iC,kTRUE,format,1);

    if(iDoMu) {
        RooPlot *awmframe = pfmet.frame(Bins(NBINS));
        antiMet.plotOn(awmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP"));
        apdfMet.plotOn(awmframe,FillColor(fillcolorW),DrawOption("F"));
        apdfMet.plotOn(awmframe,LineColor(linecolorW));
        apdfMet.plotOn(awmframe,Components(RooArgSet(apdfEWK,*lQCD)),FillColor(fillcolorEWK),DrawOption("F"));
        apdfMet.plotOn(awmframe,Components(RooArgSet(apdfEWK,*lQCD)),LineColor(linecolorEWK));
        apdfMet.plotOn(awmframe,Components(RooArgSet(*lQCD)),FillColor(fillcolorQCD),DrawOption("F"));
        apdfMet.plotOn(awmframe,Components(RooArgSet(*lQCD)),LineColor(linecolorQCD));
        apdfMet.plotOn(awmframe,Components(RooArgSet(apdfW)),LineColor(linecolorW),LineStyle(2));
        antiMet.plotOn(awmframe,MarkerStyle(kFullCircle),MarkerSize(0.9),DrawOption("ZP"));

        sprintf(ylabel,"Events / %.1f GeV",iAntiData->GetBinWidth(1));
        CPlot plotAntiMet(("fitantimet"+iName).c_str(),awmframe,"","",ylabel);
        plotAntiMet.SetLegend(0.68,0.57,0.93,0.77);
        plotAntiMet.GetLegend()->AddEntry(hDummyData,"data","PL");
        plotAntiMet.GetLegend()->AddEntry(hDummyW,"W#rightarrow#mu#nu","F");
        plotAntiMet.GetLegend()->AddEntry(hDummyEWK,"EWK+t#bar{t}","F");
        plotAntiMet.GetLegend()->AddEntry(hDummyQCD,"QCD","F");
        plotAntiMet.AddTextBox(lumitext,0.55,0.80,0.90,0.86,0);
        plotAntiMet.AddTextBox("CMS Preliminary",0.63,0.92,0.95,0.99,0);
        plotAntiMet.SetYRange(0.1,1.1*(iAntiData->GetMaximum()));
        plotAntiMet.Draw(iC,kFALSE,format,1);

        CPlot plotAntiMetDiff(("fitantimet"+iName).c_str(),"","#slash{E}_{T} [GeV]","#chi");
        plotAntiMetDiff.AddHist1D(hMetDiff,"EX0",ratioColor);
        plotAntiMetDiff.SetYRange(-8,8);
        plotAntiMetDiff.AddLine(0, 0,METMAX, 0,kBlack,1);
        plotAntiMetDiff.AddLine(0, 5,METMAX, 5,kBlack,3);
        plotAntiMetDiff.AddLine(0,-5,METMAX,-5,kBlack,3);
        plotAntiMetDiff.Draw(iC,kTRUE,format,2);

        plotAntiMet.SetName(("fitantimetlog"+iName).c_str());
        plotAntiMet.SetLogy();
        plotAntiMet.SetYRange(1e-3*(iAntiData->GetMaximum()),10*(iAntiData->GetMaximum()));
        plotAntiMet.Draw(iC,kTRUE,format,1);
    }
    if(iPlot == 1) return lResults;

    ofstream txtfile;
    std::string txtfName = "fitres"+iName;
    if( iDoMu) txtfName + "Mu.txt";
    if(!iDoMu) txtfName + "Mu.txt";
    ios_base::fmtflags flags;
    cout << " --- test " << iData->Integral() << " -- " << hPdfMet->Integral() << endl;
    Double_t chi2prob = iData->Chi2Test(hPdfMet,"PUW");
    Double_t chi2ndf  = iData->Chi2Test(hPdfMet,"CHI2/NDFUW");
    Double_t ksprob   = iData->KolmogorovTest(hPdfMet);
    Double_t ksprobpe = 1;//iData->KolmogorovTest(hPdfMet,"DX");
    txtfile.open(txtfName.c_str());
    assert(txtfile.is_open());

    flags = txtfile.flags();
    txtfile << setprecision(10);
    txtfile << " *** Yields *** " << endl;
    txtfile << "Selected: " << iData->Integral() << endl;
    txtfile << "  Signal: " << nSig.getVal() << " +/- " << nSig.getPropagatedError(*fitRes) << endl;
    txtfile << "     QCD: " << nQCD.getVal() << " +/- " << nQCD.getPropagatedError(*fitRes) << endl;
    txtfile << "   Other: " << nEWK.getVal() << " +/- " << nEWK.getPropagatedError(*fitRes) << endl;
    txtfile << endl;
    txtfile.flags(flags);

    fitRes->printStream(txtfile,RooPrintable::kValue,RooPrintable::kVerbose);
    txtfile << endl;
    printCorrelations(txtfile, fitRes);
    txtfile << endl;
    printChi2AndKSResults(txtfile, chi2prob, chi2ndf, ksprob, ksprobpe);
    txtfile.close();
    return lResults;
}
Ejemplo n.º 10
0
void templatefit1() {
std::vector<string> samples_;
float scales[] = {0.0961,0.0978,1.491,0.0253,0.0224,0.0145,0.0125,0.0160,0.0158,0.0341,0.0341,0.0341,0.020,0.0017,0.0055,0.0032,0.00084,0.02};
samples_.push_back("WPHJET.root");
samples_.push_back("ZJET.root");
samples_.push_back("PHJET200400.root");
//samples_.push_back("WJET.root");
samples_.push_back("T-W-CH.root");
samples_.push_back("TBAR-W-CH.root");
samples_.push_back("T-S-CH.root");
samples_.push_back("TBAR-S-CH.root");
samples_.push_back("T-T-CH.root");
samples_.push_back("TBAR-T-CH.root");
samples_.push_back("TTBAR1.root");
samples_.push_back("TTBAR2.root");
samples_.push_back("TTBAR3.root");
samples_.push_back("TTG.root");
samples_.push_back("WWG.root");
samples_.push_back("WW.root");
samples_.push_back("WZ.root");
samples_.push_back("ZZ.root");
samples_.push_back("ZGAMMA.root");
//samples_.push_back("SIGNAL.root");
//samples_.push_back("REALDATA.root");

std::vector<string> samplesreverse_;
samplesreverse_.push_back("etarev/WPHJET.root");
samplesreverse_.push_back("etarev/ZJET.root");
samplesreverse_.push_back("etarev/PHJET200400.root");
samplesreverse_.push_back("etarev/T-W-CH.root");
samplesreverse_.push_back("etarev/TBAR-W-CH.root");
samplesreverse_.push_back("etarev/T-S-CH.root");
samplesreverse_.push_back("etarev/TBAR-S-CH.root");
samplesreverse_.push_back("etarev/T-T-CH.root");
samplesreverse_.push_back("etarev/TBAR-T-CH.root");
samplesreverse_.push_back("etarev/TTBAR1.root");
samplesreverse_.push_back("etarev/TTBAR2.root");
samplesreverse_.push_back("etarev/TTBAR3.root");
samplesreverse_.push_back("etarev/TTG.root");
samplesreverse_.push_back("etarev/WWG.root");
samplesreverse_.push_back("etarev/WW.root");
samplesreverse_.push_back("etarev/WZ.root");
samplesreverse_.push_back("etarev/ZZ.root");
samplesreverse_.push_back("etarev/ZGAMMA.root");


//open files
std::vector<TFile*> files;
for(unsigned int idx=0; idx<samples_.size(); ++idx){
files.push_back(new TFile(samples_[idx].c_str()));
}


std::vector<TFile*> reversefiles;
for(unsigned int idx=0; idx<samplesreverse_.size(); ++idx){
reversefiles.push_back(new TFile(samplesreverse_[idx].c_str()));
}

TFile* data = new TFile("REALDATA.root");
TFile* datarev=new TFile("etarev/REALDATA.root");
/////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////

std::vector<string> variables2_;

  variables2_.push_back("photon_Pt");
//    variables2_.push_back("photon_Eta");
//    variables2_.push_back("muon_Pt");
//    variables2_.push_back("muon_Eta");
//  variables2_.push_back("Jet_Pt");
//  variables2_.push_back("Jet_Eta");
//  variables2_.push_back("Jet_Multiplicity");
//  variables2_.push_back("topmass");
//  variables2_.push_back("WTmass");
//  variables2_.push_back("Cosmuonjet");
//  variables2_.push_back("Cosmuonphoton");
//  variables2_.push_back("Cosphotonjet");
 // variables2_.push_back("Deltaphiphotonjet");
//  variables2_.push_back("Deltaphiphotonmuon");
//  variables2_.push_back("Deltaphimuonjet");
//  variables2_.push_back("DeltaRphotonmuon");
//  variables2_.push_back("DeltaRphotonjet");
//  variables2_.push_back("DeltaRmuonjet");
//  variables2_.push_back("HT");
//  variables2_.push_back("Photonmuonmass");
//  variables2_.push_back("Costopphoton");
//  variables2_.push_back("sigmaetaetaendcap");
//  variables2_.push_back("sigmaetaetabarrel");


// load histograms
std::vector<TH1F*> BGhists;
for(unsigned int idx=0; idx<files.size(); ++idx){
BGhists.push_back((TH1F*)files[idx]->Get((std::string("analyzestep2/").append(variables2_[0]).c_str())));
}

std::vector<TH1F*> revBGhists;
for(unsigned int idx=0; idx<reversefiles.size(); ++idx){
revBGhists.push_back((TH1F*)reversefiles[idx]->Get((std::string("analyzestep2/").append(variables2_[0]).c_str())));
}

TH1F* DATAhists;
DATAhists = (TH1F*)data->Get((std::string("analyzestep2/").append(variables2_[0]).c_str()));
TH1F* SIGhists;
TH1F* revDATAhists;
revDATAhists = (TH1F*)datarev->Get((std::string("analyzestep2/").append(variables2_[0]).c_str()));

float lumi = 5.319;
for(unsigned int idx=0; idx<samples_.size(); ++idx){
BGhists[idx]->Scale(lumi*scales[idx]);
}

for(unsigned int idx=0; idx<samplesreverse_.size(); ++idx){
revBGhists[idx]->Scale(lumi*scales[idx]);
}

for(unsigned int idx=1; idx<samples_.size(); ++idx){
   BGhists[idx]->Add(BGhists[idx-1]);
 }
for(unsigned int idx=1; idx<samplesreverse_.size(); ++idx){
revBGhists[idx]->Add(revBGhists[idx-1]);
 }
SIGhists=revDATAhists;
SIGhists->Add(revBGhists[samples_.size()-1],-1);

//TCanvas* conv = new TCanvas("BGBG", "BG" , 600, 600);
//conv->cd(0);
//DATAhists->Draw();
//revBGhists[samples_.size()-1]->Draw("same");

//TCanvas* nv = new TCanvas("data", "data" , 600, 600);
//nv->cd(0);
//SIGhists->Draw();


int norm=1;
double scalesig =norm/SIGhists->Integral();
SIGhists->Scale(scalesig);

//double scaledata =norm/DATAhists->Integral();
//DATAhists->Scale(scaledata);

double scalebg =norm/BGhists[samples_.size()-1]->Integral();
BGhists[samples_.size()-1]->Scale(scalebg);

//TCanvas* conv = new TCanvas("signal", "signal" , 600, 600);
//conv->cd(0);
//SIGhists->Draw();

//TCanvas* nv = new TCanvas("data", "data" , 600, 600);
//nv->cd(0);
//DATAhists->Draw();

//TCanvas* con = new TCanvas("BG", "BG" , 600, 600);
//con->cd(0);
//BGhists[samples_.size()-1]->Draw();


//conv->cd(0);
////Ghists->Draw();

    RooRealVar x("x", "x", 50.,500.);
//    RooRealVar x("x", "x", -3,3);
//    RooRealVar x("x", "x", 26.,500.);
//      RooRealVar x("x", "x", 25.,150.);
//      RooRealVar x("x", "x", 0.,400.);

    RooDataHist* template1 = new RooDataHist("template1", "template1", RooArgList(x), SIGhists);
    RooHistPdf modelTemplate1("modelTemplate1", "modelTemplate1", RooArgSet(x), *template1);

    RooDataHist* template2 = new RooDataHist("template2", "template2", RooArgList(x), BGhists[samples_.size()-1]);
    RooHistPdf modelTemplate2("modelTemplate2", "modelTemplate2", RooArgSet(x), *template2);

    RooDataHist* sumData = new RooDataHist("sumData", "sumData", RooArgList(x), DATAhists);

    std::cout << " executing fit..." << std::endl;

    RooRealVar coeffTemplate1("coeffTemplate1", "coeffTemplate1", 0, 2000);
    RooRealVar coeffTemplate2("coeffTemplate2", "coeffTemplate2", 0, 2000);

    RooAddPdf sumTemplate("sumTemplate", "coeff*modelTemplate1 + (1 - coeff)*modelTemplate2",RooArgList(modelTemplate1, modelTemplate2),RooArgList(coeffTemplate1,coeffTemplate2));
    sumTemplate.fitTo(*sumData);

std::cout << "--> coeffTemplate1 = " << coeffTemplate1.getVal() << std::endl;
std::cout << "--> coeffTemplate2 = " << coeffTemplate2.getVal() << std::endl;

RooPlot* frame = x.frame() ;
sumData->plotOn(frame,LineStyle(kDashed)) ;
sumTemplate.plotOn(frame) ;

//modelTemplate2.plotOn(frame) ;

frame->Draw() ;

}
Ejemplo n.º 11
0
void fitWWa_el() {

    TFile* fin     = new TFile("../RunII_WVA_ControlPlots.root");


    TH1D* data_obs = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/data_obs");
    TH1D* th1fkdata = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1FakePhotons");
    TH1D* th1wwa = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1wwa");
    TH1D* th1wza = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1wza");
    TH1D* th1wajets = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1wajets");
    TH1D* th1zajets = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1zajets");
    TH1D* th1Top = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1ttajets");
    TH1D* th1tajets = (TH1D*) fin->Get("Electron/vbf_maxpt_jj_m/th1tajets");

    int NbinsX = data_obs->GetNbinsX();
    double xmin = data_obs->GetXaxis()->GetBinLowEdge(1);
    double xmax = data_obs->GetXaxis()->GetBinLowEdge(NbinsX+1);

    data_obs->GetXaxis()->SetRangeUser(xmin, xmax);
    th1fkdata->GetXaxis()->SetRangeUser(xmin, xmax);
    th1wwa->GetXaxis()->SetRangeUser(xmin, xmax);
    th1wza->GetXaxis()->SetRangeUser(xmin, xmax);
    th1wajets->GetXaxis()->SetRangeUser(xmin, xmax);
    th1zajets->GetXaxis()->SetRangeUser(xmin, xmax);
    th1Top->GetXaxis()->SetRangeUser(xmin, xmax);
    th1tajets->GetXaxis()->SetRangeUser(xmin, xmax);

    th1wwa->Add(th1wza);
    th1Top->Add(th1tajets);

    mjj_ = new RooRealVar( "Mjj", "m_{jj}", xmin, xmax, "GeV");
    RooRealVar Mass = *mjj_;
    RooDataHist* data = new RooDataHist("data","data", *mjj_, data_obs);

    RooHistPdf* pdffk = makePdf(th1fkdata, "pdffk");
    RooHistPdf* pdfwwa = makePdf(th1wwa, "pdfwwa");
    RooHistPdf* pdfwajets = makePdf(th1wajets, "pdfwajets");
    RooHistPdf* pdfzajets = makePdf(th1zajets, "pdfzajets");
    RooHistPdf* pdfTop = makePdf(th1Top, "pdfTop");

    double fkNorm = th1fkdata->Integral();
    double wwaNorm = th1wwa->Integral();
    double wajetsNorm = th1wajets->Integral();
    double zajetsNorm = th1zajets->Integral();
    double TopNorm = th1Top->Integral();


    RooRealVar nfk("nfk","nfk",                 fkNorm,     0.0,   1000.);
    RooRealVar nwwa("nwwa","nwwa",              wwaNorm);
    RooRealVar nwajets("nwajets","nwajets",     400.0,     0.0,   10000.);
    RooRealVar nzajets("nzajets","nzajets",     zajetsNorm);
    RooRealVar nTop("nTop","nTop",              TopNorm);


    RooArgList* components
        = new RooArgList(*pdffk, *pdfwwa, *pdfwajets, *pdfzajets, *pdfTop);
    RooArgList* yields = new RooArgList(nfk, nwwa, nwajets, nzajets, nTop);


    RooAddPdf totalPdf("totalPdf","extended sum pdf", *components, *yields);

    RooGaussian consNfk("consNfk","", nfk, RooConst(fkNorm),RooConst(0.146*fkNorm)) ;
    RooGaussian consNwwa("consNwwa","", nwwa, RooConst(wwaNorm),RooConst(0.28*wwaNorm)) ;
    RooGaussian consNzajets("consNzajets","", nzajets, RooConst(zajetsNorm),RooConst(0.22*zajetsNorm)) ;
    RooGaussian consNTop("consNTop","", nTop, RooConst(TopNorm),RooConst(0.21*TopNorm)) ;


    RooFitResult *fitResult
        = totalPdf.fitTo(*data, Save(true),
                         ExternalConstraints(consNfk),
                         //ExternalConstraints(consNwwa),
                         //ExternalConstraints(consNzajets),
                         //ExternalConstraints(consNTop),
                         RooFit::Extended(true),
                         //RooFit::Minos(true),
                         //RooFit::Hesse(false),
                         //PrintEvalErrors(-1),
                         // RooFit::Range(rangeString),
                         Warnings(false)
                        );

    fitResult->Print("v");


    std::cout << "===================== Wa+jets k-factor = " <<
              nwajets.getVal() / wajetsNorm << "  +- "  << nwajets.getError() / wajetsNorm << std::endl;


    // ********** Make and save Canvas for the plots ********** //
    gROOT->ProcessLine(".L ~kalanand/tdrstyle.C");
    setTDRStyle();
    tdrStyle->SetErrorX(0.5);
    tdrStyle->SetPadLeftMargin(0.19);
    tdrStyle->SetPadRightMargin(0.10);
    tdrStyle->SetPadBottomMargin(0.15);
    tdrStyle->SetLegendBorderSize(0);
    tdrStyle->SetTitleYOffset(1.5);
    RooAbsData::ErrorType errorType = RooAbsData::SumW2;



    TCanvas* c = new TCanvas("fit","",500,500);
    RooPlot* frame1 = Mass.frame();
    data->plotOn(frame1,RooFit::DataError(errorType), Name("h_data"));
    totalPdf.plotOn(frame1,ProjWData(*data), Name("h_total"));
    totalPdf.plotOn(frame1,ProjWData(*data),Components("pdfwajets"),
                    LineColor(kRed), LineStyle(2), Name("h_wajets"));

    totalPdf.plotOn(frame1,ProjWData(*data),Components("pdffk,pdfwwa,pdfzajets,pdfTop"),
                    LineColor(kBlack), LineStyle(2), Name("h_others"));
    totalPdf.plotOn(frame1,ProjWData(*data));

    frame1->SetMinimum(0);
    frame1->SetMaximum(1.35* frame1->GetMaximum());
    frame1->Draw("e0");


    std::cout << "===================== chi2/ dof = " << frame1->chiSquare() << std::endl;

    TPaveText *plotlabel4 = new TPaveText(0.25,0.66,0.5,0.81,"NDC");
    plotlabel4->SetTextColor(kBlack);
    plotlabel4->SetFillColor(kWhite);
    plotlabel4->SetBorderSize(0);
    plotlabel4->SetTextAlign(12);
    plotlabel4->SetTextSize(0.04);
    char temp[50];
    sprintf(temp, "#chi^{2} / dof = %.2f", frame1->chiSquare());
    plotlabel4->AddText(temp);
    plotlabel4->Draw();

    cmsPrelim2();

    TLegend* legend = new TLegend(0.55,0.72,0.88,0.91);
    RooHist* datahist = frame1->getHist("h_data");
    RooCurve* totalhist = frame1->getCurve("h_total");
    RooCurve* wjetshist = frame1->getCurve("h_wajets");
    RooCurve* otherhist = frame1->getCurve("h_others");

    legend->AddEntry( datahist, "Data", "PE");
    legend->AddEntry( totalhist, "Fit", "L");
    legend->AddEntry( wjetshist, "W#gamma+jets", "L");
    legend->AddEntry( otherhist, "Other processes", "L");
    legend->SetFillColor(0);
    legend->Draw();
    c->SaveAs( "el_WVa_WjetsKfactorFit.png");
    c->SaveAs( "el_WVa_WjetsKfactorFit.pdf");

}
Ejemplo n.º 12
0
//---------------------------------------------------------------
double *binnedFit(TString fiName, vector<double> xlim, double mtop, TLatex *channel_tex, TString outdir, double lumi)
//---------------------------------------------------------------
{
  using namespace RooFit;
  // reduce RooFit's verbosity on the INFO level
  RooMsgService::instance().getStream(1).removeTopic(Minimization);
  RooMsgService::instance().getStream(1).removeTopic(Plotting);
  RooMsgService::instance().getStream(1).removeTopic(ObjectHandling);
  RooMsgService::instance().getStream(1).removeTopic(Eval);
  RooMsgService::instance().getStream(1).removeTopic(Fitting);
  RooMsgService::instance().setSilentMode(true);
  RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);

  TFile *res = TFile::Open(fiName);

  RooRealVar mtl("mass", "M_{J/#psi+l}", 0., 250., "GeV");
  //RooRealVar mean("mean", "mass", (xlim[1]+xlim[0])/2., (xlim[1]+3.*xlim[0])/4., (3.*xlim[1]+xlim[0])/4.);
  RooRealVar mean("mean", "mass", 70., 60., 80.);
  RooRealVar width("width", "width", 25., 15., 40.);

  TH1F *histo = (TH1F*)res->Get("MTriLept-allPair");
  h_myStyle(histo,38,38,3002,histo->GetMinimum(),1.2*histo->GetMaximum(),510,510,20,38,1.,0.);
  RooDataHist *datahist = new RooDataHist("datahist", "datahist", RooArgList(mtl), histo, 1.);
  RooGaussian pdf("gaus", "gaus", mtl, mean, width);
  pdf.fitTo(*datahist, Range(xlim[0], xlim[1]), SumW2Error(kTRUE), PrintLevel(-1), PrintEvalErrors(-1));

  TCanvas *cn = new TCanvas("cn", "cn", 800, 800);
  cn->cd();
  RooPlot *massframe = mtl.frame();
  datahist->plotOn(massframe, MarkerColor(38), LineColor(38), DataError(RooAbsData::SumW2));
  pdf.plotOn(massframe, LineColor(38), Range(xlim[0], xlim[1]));
  massframe->Draw();
  histo->Draw("samehist");
  TLegend *leg = new TLegend(0.58,0.82,0.93,0.92,NULL,"brNDC");
  if (mtop < 1e-6)
    leg->SetHeader(TString::Format("#tilde{M}_{J/#psi+l} = (%3.1f #pm %3.1f) GeV", mean.getVal(), mean.getError()));
  else
    leg->SetHeader(TString::Format("#splitline{M_{t}^{gen} = %3.1f GeV}{#tilde{M}_{J/#psi+l} = (%3.1f #pm %3.1f) GeV}", mtop+0.5, mean.getVal(), mean.getError()));
  leg_myStyle(leg);
  leg->Draw("same");
  channel_tex->Draw("same");
  if (mtop < 1e-6)
    cms_myStyle(lumi, true);
  else
    cms_myStyle(lumi, false);
  TString outFile = outdir;
  if (mtop < 1e-6)
    outFile += "GausianBinnedFit_Data";
  else
    outFile += TString::Format("GaussianBinnedFit_%d_5", (int)mtop);
  cn->SaveAs(outFile+".pdf");
  cn->SaveAs(outFile+".C");
  cn->SaveAs(outFile+".jpg");
  cn->SaveAs(outFile+".eps");

  res->Close();

  double *mean_err = new double[2];
  mean_err[0] = mean.getVal();
  mean_err[1] = mean.getError();

  return mean_err;
}
Ejemplo n.º 13
0
void fit_fractions_hist_syst(const Int_t n_loop = 1, const Int_t flag=2, const TString channel="ee", 
			     const Bool_t debug=false, const int rebin=4)
{

  int generated_events = 23513 - 1266;
  if ( channel == "mm" ) 
    generated_events = 32719 - 1715;

  // ========================================================================================
  //  Define the fit observable
  // ========================================================================================
  
  RooRealVar x("x","SVX mass",0.,10.);



  // ========================================================================================
  //  Define the fit parameters
  // ========================================================================================

  double f_c_0 = 0.242451;
  double f_l_0 = 0.494342;
  if ( channel=="mm" ){
    f_c_0 = 0.272683;
    f_l_0 = 0.493308;
  }

  RooRealVar f_c("f_c","c-jet fraction",    f_c_0,0.,1.);
  RooRealVar f_l("f_l","dusg-jet fraction", f_l_0,0.,1.);
 


  // ========================================================================================
  //  Build the Likelihood
  // ========================================================================================

#if HISTPDF>0
  
  TString dir = ( channel=="ee" ? "anaEle/" : ("anaMuo/") );


  TFile * f_pdf = new TFile(path + "DYJetsToLL.root");
  TH1F * h_b = (TH1F*) f_pdf->Get(dir + hname + "_b")->Clone("h_b");
  TH1F * h_c = (TH1F*) f_pdf->Get(dir + hname + "_c")->Clone("h_c");
  TH1F * h_l = (TH1F*) f_pdf->Get(dir + hname + "_l")->Clone("h_l");

  if ( rebin>0 ) {
    h_b->Rebin(rebin);
    h_c->Rebin(rebin);
    h_l->Rebin(rebin);
  }

  const int nSmooth = 0;

  // --- b-jet pdf:
  RooHistPdf * Pdf_b = new RooHistPdf("Pdf_b","b pdf", x, 
				      RooDataHist("h_b","",RooArgSet(x),h_b),
				      nSmooth);

  // --- c-jet pdf:
  RooHistPdf * Pdf_c = new RooHistPdf("Pdf_c","c pdf",x,
				      RooDataHist("h_c","",RooArgSet(x),h_c),
				      nSmooth);
  // --- dusg-jet pdf:
  RooHistPdf * Pdf_l = new RooHistPdf("Pdf_l","l pdf",x,
				      RooDataHist("h_l","",RooArgSet(x),h_l),
				      nSmooth);

#else  

  // --- b-jet pdf:

  RooRealVar b0("b0","b0",  3.68511e+02);
  RooRealVar b1("b1","b1",  4.18671e+00);
  RooRealVar b2("b2","b2", -5.43157e+00);
  RooRealVar b3("b3","b3", -5.37153e+00);
  RooRealVar b4("b4","b4",  1.68118e+00);
  RooRealVar b5("b5","b5",  4.74296e-01);
  if (channel=="mm"){
    b0.setVal( 2.15313e+03);
    b1.setVal( 4.95404e+00);
    b2.setVal(-6.02701e+00);
    b3.setVal(-6.03382e+00);
    b4.setVal( 1.85650e+00);
    b5.setVal( 4.98217e-01);
  }

  RooArgList b_pdf_par(b0,b1,b2,b3,b4,b5,x);
  RooGenericPdf * Pdf_b = new RooGenericPdf("Pdf_b","b pdf",
					    "@0*(TMath::Power(@6+@1,@2)+TMath::Exp(@3*@6))*(1.+TMath::Erf((@6-@4)/@5))",
					    b_pdf_par);


  RooRealVar b0_0("b0_0","b0_0",  3.68511e+02);
  RooRealVar b1_0("b1_0","b1_0",  4.18671e+00);
  RooRealVar b2_0("b2_0","b2_0", -5.43157e+00);
  RooRealVar b3_0("b3_0","b3_0", -5.37153e+00);
  RooRealVar b4_0("b4_0","b4_0",  1.68118e+00);
  RooRealVar b5_0("b5_0","b5_0",  4.74296e-01);
  if (channel=="mm"){
    b0_0.setVal( 2.15313e+03);
    b1_0.setVal( 4.95404e+00);
    b2_0.setVal(-6.02701e+00);
    b3_0.setVal(-6.03382e+00);
    b4_0.setVal( 1.85650e+00);
    b5_0.setVal( 4.98217e-01);
  }

  RooArgList b_pdf_par_0(b0_0,b1_0,b2_0,b3_0,b4_0,b5_0,x);
  RooGenericPdf * Pdf_b_0 = new RooGenericPdf("Pdf_b","b pdf",
					      "@0*(TMath::Power(@6+@1,@2)+TMath::Exp(@3*@6))*(1.+TMath::Erf((@6-@4)/@5))",
					      b_pdf_par_0);

  // --- c-jet  pdf:


  RooRealVar c0("c0","c0",  2.82240e+00);
  RooRealVar c1("c1","c1",  2.55373e+00);
  RooRealVar c2("c2","c2", -4.04638e+00);
  RooRealVar c3("c3","c3", -2.60516e+00);
  RooRealVar c4("c4","c4",  1.23763e+00);
  RooRealVar c5("c5","c5",  4.27637e-01);
  if (channel=="mm"){
    c0.setVal( 2.40900e+01);
    c1.setVal( 3.45622e+00);
    c2.setVal(-4.75556e+00);
    c3.setVal(-3.84626e+00);
    c4.setVal( 1.40510e+00);
    c5.setVal( 4.41045e-01);
  }

  RooArgList c_pdf_par(c0,c1,c2,c3,c4,c5,x);
  RooGenericPdf * Pdf_c = new RooGenericPdf("Pdf_c","c pdf",
					    "@0*(TMath::Power(@6+@1,@2)+TMath::Exp(@3*@6))*(1.+TMath::Erf((@6-@4)/@5))",
					    c_pdf_par);

  RooRealVar c0_0("c0_0","c0_0",  2.82240e+00);
  RooRealVar c1_0("c1_0","c1_0",  2.55373e+00);
  RooRealVar c2_0("c2_0","c2_0", -4.04638e+00);
  RooRealVar c3_0("c3_0","c3_0", -2.60516e+00);
  RooRealVar c4_0("c4_0","c4_0",  1.23763e+00);
  RooRealVar c5_0("c5_0","c5_0",  4.27637e-01);
  if (channel=="mm"){
    c0_0.setVal( 2.40900e+01);
    c1_0.setVal( 3.45622e+00);
    c2_0.setVal(-4.75556e+00);
    c3_0.setVal(-3.84626e+00);
    c4_0.setVal( 1.40510e+00);
    c5_0.setVal( 4.41045e-01);
  }

  RooArgList c_pdf_par_0(c0_0,c1_0,c2_0,c3_0,c4_0,c5_0,x);
  RooGenericPdf * Pdf_c_0 = new RooGenericPdf("Pdf_c_0","c pdf",
					      "@0*(TMath::Power(@6+@1,@2)+TMath::Exp(@3*@6))*(1.+TMath::Erf((@6-@4)/@5))",
					      c_pdf_par_0);


  // --- dusg-jet pdf:

  RooRealVar l0("l0","l0",  6.31062e+00);
  RooRealVar l1("l1","l1",  6.12407e-01);
  RooRealVar l2("l2","l2",  2.67040e-01);
  RooRealVar l3("l3","l3",  1.13059e+00);
  RooRealVar l4("l4","l4",  1.80036e-01);
  RooRealVar l5("l5","l5",  2.22999e+00);
  RooRealVar l6("l6","l6", -4.48947e+00);
   if (channel=="mm"){
   l0.setVal( 3.65986e+01);
   l1.setVal( 5.83322e-01);
   l2.setVal( 2.51782e-01);
   l3.setVal( 1.10027e+00);
   l4.setVal( 2.16042e-01);
   l5.setVal( 3.00909e+00);
   l6.setVal(-5.10485e+00);
  }
  
  RooArgList l_pdf_par(l0,l1,l2,l3,l4,l5,l6,x);
  RooGenericPdf * Pdf_l = new RooGenericPdf("Pdf_l","l pdf",
  					    "@0*(2.+TMath::Erf((@7-@1)/@2)+TMath::Erf((@7-@3)/@4))*TMath::Power(@7+@5,@6)",
  					    l_pdf_par);

  RooRealVar l0_0("l0_0","l0_0",  6.31062e+00);
  RooRealVar l1_0("l1_0","l1_0",  6.12407e-01);
  RooRealVar l2_0("l2_0","l2_0",  2.67040e-01);
  RooRealVar l3_0("l3_0","l3_0",  1.13059e+00);
  RooRealVar l4_0("l4_0","l4_0",  1.80036e-01);
  RooRealVar l5_0("l5_0","l5_0",  2.22999e+00);
  RooRealVar l6_0("l6_0","l6_0", -4.48947e+00);
  if (channel=="mm"){
   l0_0.setVal( 3.65986e+01);
   l1_0.setVal( 5.83322e-01);
   l2_0.setVal( 2.51782e-01);
   l3_0.setVal( 1.10027e+00);
   l4_0.setVal( 2.16042e-01);
   l5_0.setVal( 3.00909e+00);
   l6_0.setVal(-5.10485e+00);
  }
   
  RooArgList l_pdf_par_0(l0_0,l1_0,l2_0,l3_0,l4_0,l5_0,l6_0,x);
  RooGenericPdf * Pdf_l_0 = new RooGenericPdf("Pdf_l_0","l pdf",
					      "@0*(2.+TMath::Erf((@7-@1)/@2)+TMath::Erf((@7-@3)/@4))*TMath::Power(@7+@5,@6)",
					      l_pdf_par_0);

  if ( debug ){
    frame = x.frame();
    Pdf_b->plotOn(frame); 
    frame->Draw();
    //return;
  } 


#endif


  // --- build the likelihood:
  
  RooAddPdf model("model","Likelihood",RooArgList(*Pdf_c,*Pdf_l,*Pdf_b),RooArgList(f_c,f_l));
  RooAddPdf model_0("model_0","Likelihood",RooArgList(*Pdf_c_0,*Pdf_l_0,*Pdf_b_0),RooArgList(f_c,f_l));


  // ========================================================================================
  //  Read the data
  // ========================================================================================


  RooDataHist *dataHist = NULL;

  if ( flag==0 || flag==1 || flag==2 ){
    
    // --- Fit the data
    if ( flag==0 ){

      if ( channel == "ee" ){
	//f = new TFile(path + "DoubleElectron_2012_merge.root");
	//h = (TH1F*) f->Get("anaEle/"+hname)->Clone("h");
	f = new TFile("data_noBkg.root");
	h = (TH1F*) f->Get("hc_ee")->Clone("h");
      }
      else if ( channel == "mm" ){
	//f = new TFile(path + "DoubleMu_2012_merge.root");
	//h = (TH1F*) f->Get("anaMuo/"+hname)->Clone("h");
	f = new TFile("data_noBkg.root");
	h = (TH1F*) f->Get("hc_mm")->Clone("h");
      }
      else {
	std::cout << "\n*** ERROR: wrong channel name\n" << std::endl;
	return;
      }

      if ( rebin>0 )
	h->Rebin(rebin);

      dataHist = new RooDataHist("dataHist","x",RooArgSet(x),h);
      
    }

    // --- Fit the DY sample
    else if ( flag==1 ){
      
      f = new TFile(path + "DYJetsToLL.root");
      
      if ( channel == "ee" ){
	h = (TH1F*) f->Get("anaEle/"+hname)->Clone("h");
      }
      else if ( channel == "mm" ){
	h = (TH1F*) f->Get("anaMuo/"+hname)->Clone("h");
      }
      else {
	std::cout << "\n*** ERROR: wrong channel name\n" << std::endl;
	return;
      }
      
      if ( rebin>0 )
	h->Rebin(rebin);

      dataHist = new RooDataHist("dataHist","x",RooArgSet(x),h);
      
    }
    
    // --- Generate a toy MC
    else if ( flag==2 ){
      
      x.setBins(50);
      dataHist = model_0.generateBinned(RooArgSet(x), generated_events);
   
    }

    if ( debug ){
      RooFitResult * fitRes = model_0.fitTo(*dataHist,Save(),SumW2Error(kFALSE),Minimizer("Minuit2")); 
      frame = x.frame();
      dataHist->plotOn(frame);
      model_0.plotOn(frame);
      model_0.plotOn(frame, Components(*Pdf_b_0),LineStyle(kDashed),LineColor(kRed)) ;
      model_0.plotOn(frame, Components(*Pdf_c_0),LineStyle(kDashed),LineColor(kBlue)) ;
      model_0.plotOn(frame, Components(*Pdf_l_0),LineStyle(kDashed),LineColor(kBlack)) ;
      canvas = new TCanvas("canvas","canvas");
      frame->Draw();
      //return;
    }

    // --- Set the parameters of MultiGaus

    // b flavour

    int nDim_h = 5;
    int nDim_l = 6;

    TVectorD parMeans_b(nDim_h);
    parMeans_b(0) = b1.getVal();
    parMeans_b(1) = b2.getVal();
    parMeans_b(2) = b3.getVal();
    parMeans_b(3) = b4.getVal();
    parMeans_b(4) = b5.getVal();
    TMatrixDSym covMatrix_b(nDim_h);
    covMatrix_b(0,0) = 1.671e+00;        covMatrix_b(0,1) = -1.254e+00;       covMatrix_b(0,2) = -1.296e+00;       covMatrix_b(0,3) =  4.291e-01;       covMatrix_b(0,4) =  6.217e-02;
    covMatrix_b(1,0) = covMatrix_b(0,1); covMatrix_b(1,1) =  1.011e+00;       covMatrix_b(1,2) =  1.045e+00;       covMatrix_b(1,3) = -3.317e-01;       covMatrix_b(1,4) = -4.667e-02;
    covMatrix_b(2,0) = covMatrix_b(0,2); covMatrix_b(2,1) = covMatrix_b(1,2); covMatrix_b(2,2) =  1.104e+00;       covMatrix_b(2,3) = -3.351e-01;       covMatrix_b(2,4) = -4.523e-02;
    covMatrix_b(3,0) = covMatrix_b(0,3); covMatrix_b(3,1) = covMatrix_b(1,3); covMatrix_b(3,2) = covMatrix_b(2,3); covMatrix_b(3,3) =  1.143e-01;       covMatrix_b(3,4) =  1.704e-02;
    covMatrix_b(4,0) = covMatrix_b(0,4); covMatrix_b(4,1) = covMatrix_b(1,4); covMatrix_b(4,2) = covMatrix_b(2,4); covMatrix_b(4,3) = covMatrix_b(3,4); covMatrix_b(4,4) =  2.746e-03;
    covMatrix_b.Print();
    TVectorD genPars_b(nDim_l);
    

    // c flavour

    TVectorD parMeans_c(nDim_h);
    parMeans_c(0) = c1.getVal();
    parMeans_c(1) = c2.getVal();
    parMeans_c(2) = c3.getVal();
    parMeans_c(3) = c4.getVal();
    parMeans_c(4) = c5.getVal();
    TMatrixDSym covMatrix_c(nDim_h);
    covMatrix_c(0,0) = 2.401e-01;        covMatrix_c(0,1) = 1.875e-01;        covMatrix_c(0,2) = 1.673e-01;        covMatrix_c(0,3) = -1.856e-02;       covMatrix_c(0,4) = -1.120e-03;
    covMatrix_c(1,0) = covMatrix_c(0,1); covMatrix_c(1,1) = 3.539e-01;        covMatrix_c(1,2) = 3.859e-01;        covMatrix_c(1,3) = -5.883e-02;       covMatrix_c(1,4) = -8.237e-03;
    covMatrix_c(2,0) = covMatrix_c(0,2); covMatrix_c(2,1) = covMatrix_c(1,2); covMatrix_c(2,2) = 4.353e-01;        covMatrix_c(2,3) = -6.739e-02;       covMatrix_c(2,4) = -9.588e-03;
    covMatrix_c(3,0) = covMatrix_c(0,3); covMatrix_c(3,1) = covMatrix_c(1,3); covMatrix_c(3,2) = covMatrix_c(2,3); covMatrix_c(3,3) =  1.112e-02;       covMatrix_c(3,4) =  1.785e-03;
    covMatrix_c(4,0) = covMatrix_c(0,4); covMatrix_c(4,1) = covMatrix_c(1,4); covMatrix_c(4,2) = covMatrix_c(2,4); covMatrix_c(4,3) = covMatrix_c(3,4); covMatrix_c(4,4) =  3.735e-04;
    covMatrix_c.Print();
    TVectorD genPars_c(nDim_l);


    // light flavour

    TVectorD parMeans_l(nDim_l);
    parMeans_l(0) = l1.getVal();
    parMeans_l(1) = l2.getVal();
    parMeans_l(2) = l3.getVal();
    parMeans_l(3) = l4.getVal();
    parMeans_l(4) = l5.getVal();
    parMeans_l(5) = l6.getVal();
    TMatrixDSym covMatrix_l(nDim_l);
    covMatrix_l(0,0) = 7.090e-04;        covMatrix_l(0,1) = 3.629e-04;        covMatrix_l(0,2) = 6.320e-04;        covMatrix_l(0,3) = -7.600e-05;       covMatrix_l(0,4) = -1.336e-02;       covMatrix_l(0,5) =  1.077e-02;
    covMatrix_l(1,0) = covMatrix_l(0,1); covMatrix_l(1,1) = 2.661e-04;        covMatrix_l(1,2) = 2.863e-04;        covMatrix_l(1,3) =  1.026e-05;       covMatrix_l(1,4) = -5.617e-03;       covMatrix_l(1,5) =  4.414e-03;
    covMatrix_l(2,0) = covMatrix_l(0,2); covMatrix_l(2,1) = covMatrix_l(1,2); covMatrix_l(2,2) = 1.198e-03;        covMatrix_l(2,3) = -2.218e-05;       covMatrix_l(2,4) = -1.200e-02;       covMatrix_l(2,5) =  9.095e-03;
    covMatrix_l(3,0) = covMatrix_l(0,3); covMatrix_l(3,1) = covMatrix_l(1,3); covMatrix_l(3,2) = covMatrix_l(2,3); covMatrix_l(3,3) =  1.214e-03;       covMatrix_l(3,4) =  3.792e-03;       covMatrix_l(3,5) = -3.238e-03;
    covMatrix_l(4,0) = covMatrix_l(0,4); covMatrix_l(4,1) = covMatrix_l(1,4); covMatrix_l(4,2) = covMatrix_l(2,4); covMatrix_l(4,3) = covMatrix_l(3,4); covMatrix_l(4,4) =  3.927e-01;       covMatrix_l(4,5) = -3.457e-01;
    covMatrix_l(5,0) = covMatrix_l(0,5); covMatrix_l(5,1) = covMatrix_l(1,5); covMatrix_l(5,2) = covMatrix_l(2,5); covMatrix_l(5,3) = covMatrix_l(3,5); covMatrix_l(5,4) = covMatrix_l(4,5); covMatrix_l(5,5) =  3.127e-01;
    covMatrix_l.Print();
    TVectorD genPars_l(nDim_l);
 
    b_frame = x.frame();
    c_frame = x.frame();
    l_frame = x.frame();

    TH1* h0_b = Pdf_b_0->createHistogram("h0_b",x); 
    h0_b->SetEntries((int) (1.-f_c_0-f_l_0)*generated_events);
    h0_b->Scale((1.-f_c_0-f_l_0)*generated_events/h0_b->Integral());
    TH1* h0_c = Pdf_c_0->createHistogram("h0_c",x); 
    h0_c->SetEntries((int) f_c_0*generated_events);
    h0_c->Scale(f_c_0*generated_events/h0_c->Integral());
    TH1* h0_l = Pdf_l_0->createHistogram("h0_l",x); 
    h0_l->SetEntries((int) f_l_0*generated_events);
    h0_l->Scale(f_l_0*generated_events/h0_l->Integral());

    for (int iloop=0; iloop<n_loop; ++iloop ){

      if ( iloop % 100 == 0 ) 
	cout << " >>>>>>>>>>>> Iteration # " << iloop << endl;


      f_l.setVal(f_l_0);
      f_c.setVal(f_c_0);

      double chi2 = 99999.;
      double prob = -999.;

      double chi2_b = 9999.;
      double chi2_c = 9999.;
      double chi2_l = 9999.;

      double ks_b = -999.;
      double ks_c = -999.;
      double ks_l = -999.;

      //while ( chi2_b>0.5 || std::isnan(chi2_b) ){
      while ( ks_b<0.1 ){

	MultiGaus(parMeans_b, covMatrix_b, genPars_b);
	//genPars_b.Print();

	b1.setVal(genPars_b[0]);
	b2.setVal(genPars_b[1]);
	b3.setVal(genPars_b[2]);
	b4.setVal(genPars_b[3]);
	b5.setVal(genPars_b[4]);
      

	TH1* h1_b = Pdf_b->createHistogram("h1_b",x); 
	h1_b->SetEntries((int) (1.-f_c_0-f_l_0)*generated_events);
	h1_b->Scale((1.-f_c_0-f_l_0)*generated_events/h1_b->Integral());
	//h1_b->Draw("SAME");
	chi2_b = h1_b->Chi2Test(h0_b,"WW CHI2/NDF");
	h_chi2_b.Fill(chi2_b);
	ks_b = h1_b->KolmogorovTest(h0_b);
	h_ks_b.Fill(ks_b);

	delete h1_b;
      }

      //while ( chi2_c>0.5 || std::isnan(chi2_c) ){
      while ( ks_c<0.1 ){

	MultiGaus(parMeans_c, covMatrix_c, genPars_c);
	//genPars_c.Print();

	c1.setVal(genPars_c[0]);
	c2.setVal(genPars_c[1]);
	c3.setVal(genPars_c[2]);
	c4.setVal(genPars_c[3]);
	c5.setVal(genPars_c[4]);

	TH1* h1_c = Pdf_c->createHistogram("h1_c",x); 
	h1_c->SetEntries((int) f_c_0*generated_events);
	h1_c->Scale(f_c_0*generated_events/h1_c->Integral());
	//h1_c->Draw("SAME");
	chi2_c = h1_c->Chi2Test(h0_c,"WW CHI2/NDF");
	h_chi2_c.Fill(chi2_c);
	ks_c = h1_c->KolmogorovTest(h0_c);
	h_ks_c.Fill(ks_c);

	delete h1_c;
      }


      //while ( chi2_l>0.5 || std::isnan(chi2_l) ){
      while ( ks_l<0.1 ){

	MultiGaus(parMeans_l, covMatrix_l, genPars_l);
	//genPars_l.Print();

	l1.setVal(genPars_l[0]);
	l2.setVal(genPars_l[1]);
	l3.setVal(genPars_l[2]);
	l4.setVal(genPars_l[3]);
	l5.setVal(genPars_l[4]);
	l6.setVal(genPars_l[5]);

	TH1* h1_l = Pdf_l->createHistogram("h1_l",x); 
	h1_l->SetEntries((int) f_l_0*generated_events);
	h1_l->Scale(f_l_0*generated_events/h1_l->Integral());
	//h1_l->Draw("SAME");
	chi2_l = h1_l->Chi2Test(h0_l,"WW CHI2/NDF");
	h_chi2_l.Fill(chi2_l);
	ks_l = h1_l->KolmogorovTest(h0_l);
	h_ks_l.Fill(ks_l);

	delete h1_l;
      }

      RooFitResult * fitRes = model.fitTo(*dataHist,Save(),SumW2Error(kFALSE),Minimizer("Minuit2"),PrintLevel(1),Verbose(0));

      if (fitRes->status() != 0 ) continue;
      
      frame = x.frame();
      dataHist->plotOn(frame);
      model.plotOn(frame);
       
      //chi2 = frame->chiSquare("model_Norm[x]","h_dataHist",2);
      chi2 = frame->chiSquare(2);
      prob = TMath::Prob(chi2,2);
      
      h_chi2.Fill(chi2);
      h_prob.Fill(prob);
      

      //if  ( prob < 0.6 ) continue;
      if ( chi2 > 5. ) continue;
      if ( f_c.getVal()<0.01 ||
      	   f_l.getVal()<0.01 ||
	   (1.-f_c.getVal()-f_l.getVal())<0.01 ) continue;
      
      if ( f_c.getVal()>0.99 ||
      	   f_l.getVal()>0.99 ||
      	   (1.-f_c.getVal()-f_l.getVal())>0.99 ) continue;

      
      Pdf_b->plotOn(b_frame);
      Pdf_c->plotOn(c_frame);
      Pdf_l->plotOn(l_frame);
      
      
      h_b1.Fill(genPars_b[0]);
      h_b2.Fill(genPars_b[1]);
      h_b3.Fill(genPars_b[2]);
      h_b4.Fill(genPars_b[3]);
      h_b5.Fill(genPars_b[4]);
      
      h_c1.Fill(genPars_c[0]);
      h_c2.Fill(genPars_c[1]);
      h_c3.Fill(genPars_c[2]);
      h_c4.Fill(genPars_c[3]);
      h_c5.Fill(genPars_c[4]);
      
      h_l1.Fill(genPars_l[0]);
      h_l2.Fill(genPars_l[1]);
      h_l3.Fill(genPars_l[2]);
      h_l4.Fill(genPars_l[3]);
      h_l5.Fill(genPars_l[4]);
      h_l6.Fill(genPars_l[5]);

      if ( debug ) {
	model.plotOn(frame, Components(*Pdf_b),LineStyle(kDashed),LineColor(kRed)) ;
	model.plotOn(frame, Components(*Pdf_c),LineStyle(kDashed),LineColor(kBlue)) ;
	model.plotOn(frame, Components(*Pdf_l),LineStyle(kDashed),LineColor(kBlack)) ;
	canvas = new TCanvas("canvas","canvas");
	frame->Draw();
      }

      h_fc.Fill(f_c.getVal());

    }

    Pdf_b_0->plotOn(b_frame,LineColor(kRed),LineWidth(1));
    Pdf_c_0->plotOn(c_frame,LineColor(kRed),LineWidth(1));
    Pdf_l_0->plotOn(l_frame,LineColor(kRed),LineWidth(1));

    c_chi2 = new TCanvas();
    h_chi2.Draw();
    c_prob = new TCanvas();
    h_prob.Draw();

    c_chi2_pdf = new TCanvas("c_chi2_pdf", "Pdf's chi2", 1024, 768);
    c_chi2_pdf->Divide(3,2);
    c_chi2_pdf->cd(1);
    h_chi2_b.Draw();
    c_chi2_pdf->cd(2);
    h_chi2_c.Draw();
    c_chi2_pdf->cd(3);
    h_chi2_l.Draw();
    c_chi2_pdf->cd(4);
    h_ks_b.Draw();
    c_chi2_pdf->cd(5);
    h_ks_c.Draw();
    c_chi2_pdf->cd(6);
    h_ks_l.Draw();

    c_bpars = new TCanvas("c_bpars", "generated b parameters: distributions", 1024, 768);
    c_bpars->Divide(3,2);
    c_bpars->cd(1);
    h_b1.Draw();
    c_bpars->cd(2);
    h_b2.Draw();
    c_bpars->cd(3);
    h_b3.Draw();
    c_bpars->cd(4);
    h_b4.Draw();
    c_bpars->cd(5);
    h_b5.Draw();

    c_cpars = new TCanvas("c_cpars", "generated c parameters: distributions", 1024, 768);
    c_cpars->Divide(3,2);
    c_cpars->cd(1);
    h_c1.Draw();
    c_cpars->cd(2);
    h_c2.Draw();
    c_cpars->cd(3);
    h_c3.Draw();
    c_cpars->cd(4);
    h_c4.Draw();
    c_cpars->cd(5);
    h_c5.Draw();

    c_lpars = new TCanvas("l_lpars", "generated dusg parameters: distributions", 1024, 768);
    c_lpars->Divide(3,2);
    c_lpars->cd(1);
    h_l1.Draw();
    c_lpars->cd(2);
    h_l2.Draw();
    c_lpars->cd(3);
    h_l3.Draw();
    c_lpars->cd(4);
    h_l4.Draw();
    c_lpars->cd(5);
    h_l5.Draw();
    c_lpars->cd(6);
    h_l6.Draw();

    c_bpdf = new TCanvas();
    b_frame->Draw();
    c_cpdf = new TCanvas();
    c_frame->Draw();
    c_lpdf = new TCanvas();
    l_frame->Draw();

    c_fc = new TCanvas();
    h_fc.Draw();
   
    c_bpdf ->SaveAs("figs/c_bpdf.png");
    c_cpdf ->SaveAs("figs/c_cpdf.png");
    c_lpdf ->SaveAs("figs/c_lpdf.png");
    c_fc   ->SaveAs("figs/c_fc.png");
    c_chi2 ->SaveAs("figs/c_chi2.png");
    c_prob ->SaveAs("figs/c_prob.png");
    c_bpars->SaveAs("figs/c_bpars.png");
    c_cpars->SaveAs("figs/c_cpars.png");
    c_lpars->SaveAs("figs/c_lpars.png");
    c_chi2_pdf->SaveAs("figs/c_chi2_pdf.png");
    
    c_bpdf ->SaveAs("figs/c_bpdf.root");
    c_cpdf ->SaveAs("figs/c_cpdf.root");
    c_lpdf ->SaveAs("figs/c_lpdf.root");
    c_fc   ->SaveAs("figs/c_fc.root");
    c_chi2 ->SaveAs("figs/c_chi2.root");
    c_prob ->SaveAs("figs/c_prob.root");
    c_bpars->SaveAs("figs/c_bpars.root");
    c_cpars->SaveAs("figs/c_cpars.root");
    c_lpars->SaveAs("figs/c_lpars.root");
    c_chi2_pdf->SaveAs("figs/c_chi2_pdf.root");

  }

}
Ejemplo n.º 14
0
void fitTF1(TCanvas *canvas, TH1F h, double XMIN_, double XMAX_, double dX_, double params[], Color_t LC_=kBlack) { //double& FWHM_, double& x0_, double& x1_, double& x2_, double& y0_, double& y1_, double& INT_, double& YIELD_) {
//TCanvas* fitTF1(TH1F h, double HSCALE_, double XMIN_, double XMAX_) {
//TF1* fitTF1(TH1F h, double HSCALE_, double XMIN_, double XMAX_) {
	gROOT->ForceStyle();
	RooMsgService::instance().setSilentMode(kTRUE);
	for(int i=0;i<2;i++) RooMsgService::instance().setStreamStatus(i,kFALSE);

	//TCanvas *canvas = new TCanvas(TString::Format("canvas_%s",h.GetName()),TString::Format("canvas_%s",h.GetName()),1800,1200);

	RooDataHist *RooHistFit = 0;
	RooAddPdf *model = 0;

	RooWorkspace w = RooWorkspace("w","workspace");

	RooRealVar x("mbbReg","mbbReg",XMIN_,XMAX_);
	RooRealVar kJES("CMS_scale_j","CMS_scale_j",1,0.9,1.1);
	RooRealVar kJER("CMS_res_j","CMS_res_j",1,0.8,1.2);
	kJES.setConstant(kTRUE);
	kJER.setConstant(kTRUE);

	TString hname = h.GetName();

	RooHistFit = new RooDataHist("fit_"+hname,"fit_"+hname,x,&h);


	RooRealVar YieldVBF = RooRealVar("yield_"+hname,"yield_"+hname,h.Integral());
	RooRealVar m("mean_"+hname,"mean_"+hname,125,100,150);
	RooRealVar s("sigma_"+hname,"sigma_"+hname,12,3,30);
	RooFormulaVar mShift("mShift_"+hname,"@0*@1",RooArgList(m,kJES));
	RooFormulaVar sShift("sShift_"+hname,"@0*@1",RooArgList(m,kJER));
	RooRealVar a("alpha_"+hname,"alpha_"+hname,1,-10,10);
	RooRealVar n("exp_"+hname,"exp_"+hname,1,0,100);
	RooRealVar b0("b0_"+hname,"b0_"+hname,0.5,0.,1.);
	RooRealVar b1("b1_"+hname,"b1_"+hname,0.5,0.,1.);
	RooRealVar b2("b2_"+hname,"b2_"+hname,0.5,0.,1.);
	RooRealVar b3("b3_"+hname,"b3_"+hname,0.5,0.,1.);
	
	RooBernstein bkg("signal_bkg_"+hname,"signal_bkg_"+hname,x,RooArgSet(b0,b1,b2));
	RooRealVar fsig("fsig_"+hname,"fsig_"+hname,0.7,0.0,1.0);
	RooCBShape sig("signal_gauss_"+hname,"signal_gauss_"+hname,x,mShift,sShift,a,n);

	model = new RooAddPdf("signal_model_"+hname,"signal_model_"+hname,RooArgList(sig,bkg),fsig);

	//RooFitResult *res = model->fitTo(*RooHistFit,RooFit::Save(),RooFit::SumW2Error(kFALSE),"q");
	model->fitTo(*RooHistFit,RooFit::Save(),RooFit::SumW2Error(kFALSE),"q");

	//res->Print();
	//model->Print();
	
	canvas->cd();
	canvas->SetTopMargin(0.1);
	RooPlot *frame = x.frame();
// no scale
	RooHistFit->plotOn(frame);
	model->plotOn(frame,RooFit::LineColor(LC_),RooFit::LineWidth(2));//,RooFit::LineStyle(kDotted));
	model->plotOn(frame,RooFit::Components(bkg),RooFit::LineColor(LC_),RooFit::LineWidth(2),RooFit::LineStyle(kDashed));
// with scale
//	RooHistFit->plotOn(frame,RooFit::Normalization(HSCALE_,RooAbsReal::NumEvent));
//	model->plotOn(frame,RooFit::Normalization(HSCALE_,RooAbsReal::NumEvent),RooFit::LineWidth(1));
//	model->plotOn(frame,RooFit::Components(bkg),RooFit::LineColor(kBlue),RooFit::LineWidth(1),RooFit::LineStyle(kDashed),RooFit::Normalization(HSCALE_,RooAbsReal::NumEvent));
	 
	frame->GetXaxis()->SetLimits(50,200);
	frame->GetXaxis()->SetNdivisions(505);
	frame->GetXaxis()->SetTitle("M_{b#bar{b}} (GeV)");
	frame->GetYaxis()->SetTitle("Events");
	frame->Draw();
	h.SetFillColor(kGray);
	h.Draw("hist,same");
	frame->Draw("same");
	gPad->RedrawAxis();

	TF1 *tmp = model->asTF(x,fsig,x);
	//tmp->Print();

	double y0_ = tmp->GetMaximum();
	double x0_ = tmp->GetMaximumX();
	double x1_ = tmp->GetX(y0_/2.,XMIN_,x0_);
	double x2_ = tmp->GetX(y0_/2.,x0_,XMAX_);
	double FWHM_ = x2_-x1_;
	double INT_ = tmp->Integral(XMIN_,XMAX_);
	double YIELD_= YieldVBF.getVal();
	double y1_ = dX_*0.5*y0_*(YieldVBF.getVal()/tmp->Integral(XMIN_,XMAX_));

	params[0] = x0_;
	params[1] = x1_;
	params[2] = x2_;
	params[3] = y0_;
	params[4] = y1_;
	params[5] = FWHM_;
	params[6] = INT_;
	params[7] = YIELD_;

	//cout<<"Int = "<<tmp->Integral(XMIN_,XMAX_)<<", Yield = "<<YieldVBF.getVal()<<", y0 = "<<y0_<<", y1 = "<<y1_ <<", x0 = "<< x0_ << ", x1 = "<<x1_<<", x2 = "<<x2_<<", FWHM = "<<FWHM_<<endl;

	TLine ln = TLine(x1_,y1_,x2_,y1_);
	ln.SetLineColor(kMagenta+3);
	ln.SetLineStyle(7);
	ln.SetLineWidth(2);
	ln.Draw();
	
	canvas->Update();
	canvas->SaveAs("testC.png");
	
//	tmp->Delete();
//	frame->Delete();
//	res->Delete();
//	TF1 *f1 = model->asTF(x,fsig,x);
//	return f1;
	
	////tmp->Delete();
	////ln->Delete();
	////model->Delete();
	////RooHistFit->Delete();
	////w->Delete();
	////YieldVBF->Delete();
	////frame->Delete();
	////res->Delete();
	//delete tmp;
	//delete ln;
	//delete model;
	//delete RooHistFit;
	//delete w;
	//delete YieldVBF;
	//delete frame;
	//delete res;

//	return canvas;
}
Ejemplo n.º 15
0
int main(){

  BaBarStyle p;
  p.SetBaBarStyle();
  //gROOT->SetStyle("Plain");

  Bool_t doNorm = kTRUE;
  Bool_t doComparison = kFALSE;
  Bool_t doFract = kFALSE;
  Bool_t doFit = kFALSE;
  Bool_t doPlots = kFALSE;

  //define DalitzSpace for generation
  EvtPDL pdl;
  pdl.readPDT("evt.pdl");
  EvtDecayMode mode("D0 -> K- pi+ pi0");
  EvtDalitzPlot dalitzSpace(mode);

  RooRealVar m2Kpi_d0mass("m2Kpi_d0mass","m2Kpi_d0mass",1.,dalitzSpace.qAbsMin(EvtCyclic3::AB),dalitzSpace.qAbsMax(EvtCyclic3::AB));
  RooRealVar m2Kpi0_d0mass("m2Kpi0_d0mass","m2Kpi0_d0mass",1.,dalitzSpace.qAbsMin(EvtCyclic3::AC),dalitzSpace.qAbsMax(EvtCyclic3::AC));
  RooRealVar m2pipi0_d0mass("m2pipi0_d0mass","m2pipi0_d0mass",1.,dalitzSpace.qAbsMin(EvtCyclic3::BC),dalitzSpace.qAbsMax(EvtCyclic3::BC));
  RooCategory D0flav("D0flav","D0flav");
  D0flav.defineType("D0",-1);
  D0flav.defineType("antiD0",1);

  //this is just to plot the m23 pdf
  Float_t total = pow(dalitzSpace.bigM(),2) + pow(dalitzSpace.mA(),2) + pow(dalitzSpace.mB(),2) + pow(dalitzSpace.mC(),2);
  RooRealVar totalm("totalm","totalm",total);
  RooFormulaVar mass13a("mass13a","@0-@1-@2",RooArgSet(totalm,m2Kpi_d0mass,m2pipi0_d0mass));

  cout << "read the dataset" << endl;

  TFile hello("DataSet_out_tmp.root");
  gROOT->cd();
  RooDataSet *data = (RooDataSet*)hello.Get("fulldata");
  RooDataSet *data_1 = (RooDataSet*)data->reduce("D0flav ==  1 && isWS == 0 && d0LifetimeErr < 0.5 && d0Lifetime > -2. && d0Lifetime < 4.");
  RooDataSet *finaldata = (RooDataSet*)data_1->reduce("deltaMass > 0.1449 && deltaMass < 0.1459 && d0Mass > 1.8495 && d0Mass < 1.8795");
  RooDataSet *leftdata = (RooDataSet*)(RooDataSet*)data_1->reduce("d0Mass > 1.74 && d0Mass < 1.79");
  RooDataSet *rightdata = (RooDataSet*)data_1->reduce("d0Mass > 1.94 && d0Mass < 1.99");

  //here we set the weights for the dataset
  finaldata->setWeightVar(0);
  leftdata->setWeightVar(0);
  rightdata->setWeightVar(0);

  //if you want to have a little dataset to test, uncomment next line and rename finaldata above
  //RooDataSet *finaldata = finaldata_1->reduce(EventRange(1,1000));
  cout << "*************************************************************" << endl;
  cout << "The final data entry    " << finaldata->numEntries() << endl;
  cout << "*************************************************************" << endl;

  //Construct signal pdf
  string dirname = "configmaps/effmapping_RS_CP/";

  RooKpipi0pdf *D0pdf = new RooKpipi0pdf("D0pdf","D0pdf",m2Kpi_d0mass,m2Kpi0_d0mass,&dalitzSpace,dirname,1);
  RooKpipi0pdf *D0pdf23 = new RooKpipi0pdf("D0pdf23","D0pdf23",m2Kpi_d0mass,mass13a,&dalitzSpace,dirname,1);

  if(doNorm) D0pdf->getManager()->calNorm();

  //When we plot the 1D projection, need to calculate the 1D integral
  //set the precision here
  //cout << "config integrator " << endl;
  RooNumIntConfig *cfg = RooAbsReal::defaultIntegratorConfig();
  cfg->setEpsAbs(1E-3);
  cfg->setEpsRel(1E-3);
  cfg->method1D().setLabel("RooSegmentedIntegrator1D");
  //cfg.getConfigSection("RooSegmentedIntegrator1D").setRealValue("numSeg",3);
  //cfg->method1D()->Print("v");
  D0pdf->setIntegratorConfig(*cfg);
  D0pdf23->setIntegratorConfig(*cfg);

  cout << "about to init" << endl;

  m2Kpi_d0mass.setBins(150);
  m2Kpi0_d0mass.setBins(150);
  m2pipi0_d0mass.setBins(150);

  //background description
  //RooBkg combdalitz("combdalitz","combdalitz",m2Kpi_d0mass,m2Kpi0_d0mass,&dalitzSpace);
  //RooBkg combdalitz23("combdalitz23","combdalitz23",m2Kpi_d0mass,mass13a,&dalitzSpace);

  RooRealVar Nsig("Nsig","Nsig", 653962. + 2218.);
  RooRealVar Nbkg("Nbkg","Nbkg", 2255. + 551.);

  RooDataHist* dbdalitz = new RooDataHist("dbdalitz","dbdalitz",RooArgSet(m2Kpi_d0mass,m2Kpi0_d0mass),*finaldata);
  RooDataHist* dbdalitz23 = new RooDataHist("dbdalitz23","dbdalitz23",RooArgSet(m2Kpi_d0mass,m2pipi0_d0mass),*finaldata);

  ////////////////////////////////////////
  //background parametrization using sidebands histograms
  ////////////////////////////////////////
  TH2F *lefth = m2Kpi_d0mass.createHistogram("lefth",m2Kpi0_d0mass);
  leftdata->fillHistogram(lefth,RooArgList(m2Kpi_d0mass,m2Kpi0_d0mass));
  TH2F *righth = m2Kpi_d0mass.createHistogram("righth",m2Kpi0_d0mass);
  rightdata->fillHistogram(righth,RooArgList(m2Kpi_d0mass,m2Kpi0_d0mass));

  TH2F *lefth23 = m2Kpi_d0mass.createHistogram("lefth23",m2pipi0_d0mass);
  leftdata->fillHistogram(lefth23,RooArgList(m2Kpi_d0mass,m2pipi0_d0mass));
  TH2F *righth23 = m2Kpi_d0mass.createHistogram("righth23",m2pipi0_d0mass);
  rightdata->fillHistogram(righth23,RooArgList(m2Kpi_d0mass,m2pipi0_d0mass));

  righth->Scale(lefth->Integral()/righth->Integral());
  lefth->Sumw2();
  righth->Sumw2();
  righth23->Scale(lefth23->Integral()/righth23->Integral());
  lefth23->Sumw2();
  righth23->Sumw2();

  RooDataHist *lefthist = new RooDataHist("lefthist","lefthist",RooArgSet(m2Kpi_d0mass,m2Kpi0_d0mass),lefth);
  RooDataHist *righthist = new RooDataHist("righthist","righthist",RooArgSet(m2Kpi_d0mass,m2Kpi0_d0mass),righth);
  RooDataHist *lefthist23 = new RooDataHist("lefthist23","lefthist23",RooArgSet(m2Kpi_d0mass,m2pipi0_d0mass),lefth23);
  RooDataHist *righthist23 = new RooDataHist("righthist23","righthist23",RooArgSet(m2Kpi_d0mass,m2pipi0_d0mass),righth23);

  RooHistPdf leftpdf("leftpdf","leftpdf",RooArgSet(m2Kpi_d0mass,m2Kpi0_d0mass),*lefthist,4);
  RooHistPdf rightpdf("rightpdf","rightpdf",RooArgSet(m2Kpi_d0mass,m2Kpi0_d0mass),*righthist,4);
  RooHistPdf leftpdf23("leftpdf23","leftpdf23",RooArgSet(m2Kpi_d0mass,m2pipi0_d0mass),*lefthist23,4);
  RooHistPdf rightpdf23("rightpdf23","rightpdf23",RooArgSet(m2Kpi_d0mass,m2pipi0_d0mass),*righthist23,4);

  RooRealVar fcomb("fcomb","fcomb",0.738);
  RooAddPdf combdalitz("combdalitz","combdalitz",RooArgList(leftpdf,rightpdf),RooArgList(fcomb));
  RooAddPdf combdalitz23("combdalitz23","combdalitz23",RooArgList(leftpdf23,rightpdf23),RooArgList(fcomb));
  ///////////////////////////////////////

  RooAddPdf totpdf("totpdf","totpdf",RooArgList(*D0pdf,combdalitz),RooArgList(Nsig,Nbkg));
  RooAddPdf totpdf23("totpdf23","totpdf23",RooArgList(*D0pdf23,combdalitz23),RooArgList(Nsig,Nbkg));

  if(doFit){
    // Start Minuit session on Chi2
    RooChi2Var chi2("chi2","chi2",totpdf,*dbdalitz);
    RooMinuit m2(chi2);
    m2.migrad();
    m2.hesse();
    RooFitResult* fitRes = m2.save();
    fitRes->Print("v");
    RooArgSet results(fitRes->floatParsFinal());
    RooArgSet conresults(fitRes->constPars());
    results.add(conresults);
    results.writeToFile("fit_isobar_RS.txt");

    //save the stupid result
    TFile f("fit_RSDalitz_result.root","RECREATE");
    fitRes->Write();
    f.Close();
  }

  if(doFract) {

    cout << "Calculating fit fractions" << endl;
    TFile f("fit_RSDalitz_result.root");
    RooFitResult* fitRes = (RooFitResult*)f.Get("chi2");

    //now calculate the fit fractions
    const Int_t nRes = D0pdf->getManager()->getnRes();

    //recalculate the normalization if necessary
    D0pdf->getManager()->calNorm();

    EvtComplex normarray[nRes][nRes];

    const Int_t myRes = 12;
    TH1F fitty[myRes];

    //read the integral value from the cache file.
    //In this way we don't need to compute the normalization everytime during MIGRAD
    char int_name[50];
    D0pdf->getManager()->getFileName(int_name);

    ifstream f1;
    f1.open(int_name);
    if (!f1){
      cout << "Error opening file " << endl;
      assert(0);
    }
  
    Double_t re=0.,im=0.;
    //Read in the cache file and store back to array
    for(Int_t j=0;j<nRes;j++) {
      char thname[100];
      sprintf(thname,"thname_%d",j);
      if(j < myRes) fitty[j] = TH1F(thname,thname,30,0.,1.);
      for(Int_t k=0;k<nRes;k++){
	f1 >> re >> im;       
	normarray[j][k] = EvtComplex(re,im);
      }
    }   

    EvtComplex mynorm[myRes][myRes];
    Int_t m = 0, l = 0;
    for(Int_t i=0;i<myRes;i++){
      for(Int_t j=0;j<myRes;j++){
	if(i==0) l = 7;
	else if(i==1) l = 6;
	else if(i==2) l = 11;
	else if(i==3) l = 4;
	else if(i==4) l = 5;
	else if(i==5) l = 3;
	else if(i==6) l = 9;
	else if(i==7) l = 10;
	else if(i==8) l = 12;
	else if(i==9) l = 8;
	else if(i==10) l = 2;
	else if(i==11) l = 0;

	if(j==0) m = 7;
	else if(j==1) m = 6;
	else if(j==2) m = 11;
	else if(j==3) m = 4;
	else if(j==4) m = 5;
	else if(j==5) m = 3;
	else if(j==6) m = 9;
	else if(j==7) m = 10;
	else if(j==8) m = 12;
	else if(j==9) m = 8;
	else if(j==10) m = 2;
	else if(j==11) m = 0;

	mynorm[i][j] = normarray[l][m];
      }
    }

    //do 100 experiments and extract parameters using covariance matrix
    for(Int_t l=0;l<300;l++){
      RooArgList listpar = fitRes->randomizePars();
      if(l==0) listpar.Print();

      Double_t mynormD0 = 0.;
      EvtComplex coeff_i(0.,0.), coeff_j(0.,0.);
      for(Int_t i=0;i<2*myRes;i++){
	for(Int_t j=0;j<2*myRes;j++){
	  if(i==(2*myRes - 2)) coeff_i = EvtComplex(1.,0.);
	  else coeff_i = EvtComplex(((RooAbsReal*)listpar.at(i))->getVal()*cos(((RooAbsReal*)listpar.at(i+1))->getVal()),
				    ((RooAbsReal*)listpar.at(i))->getVal()*sin(((RooAbsReal*)listpar.at(i+1))->getVal()));

	  if(j==(2*myRes - 2)) coeff_j = EvtComplex(1.,0.);
	  else coeff_j = EvtComplex(((RooAbsReal*)listpar.at(j))->getVal()*cos(((RooAbsReal*)listpar.at(j+1))->getVal()),
				    ((RooAbsReal*)listpar.at(j))->getVal()*sin(((RooAbsReal*)listpar.at(j+1))->getVal()));

	  mynormD0 += real(coeff_i*conj(coeff_j)*(mynorm[i/2][j/2]));
	  j++;
	}
	i++;
      }

      //now calculate the fit fractions
      for(Int_t i=0;i<2*myRes;i++){
	Double_t fitfrac = 0.;
	if(i==(2*myRes - 2)) fitfrac = abs(mynorm[i/2][i/2])/mynormD0;
	else fitfrac = abs2( ((RooAbsReal*)listpar.at(i))->getVal())*abs(mynorm[i/2][i/2])/mynormD0;
	fitty[i/2].Fill(fitfrac);
	i++;
      }
    }// nexperiments

    Double_t tot_frac = 0.;
    for(Int_t i=0;i<myRes;i++){
      tot_frac += fitty[i].GetMean();
      cout << "Resonance " << i << ": fit fraction = " << fitty[i].GetMean() << " +/- " << fitty[i].GetRMS() << endl;
    }

    cout << "Total fit fraction = " << tot_frac << endl;
    cout << "///////////////////////////" << endl;
  }

  if(doPlots){
    //Make the plots
    // REMEBER: if you want roofit to consider the reweighted errors, you must put DataError(RooAbsData::SumW2))
    //******************************************************
    RooPlot* xframe = m2Kpi_d0mass.frame();
    dbdalitz->plotOn(xframe,MarkerSize(0.1),DrawOption("z"));
    totpdf.plotOn(xframe);
    xframe->getAttLine()->SetLineWidth(1);
    xframe->getAttLine()->SetLineStyle(1);
    xframe->SetTitle("");
    xframe->GetXaxis()->SetTitle("s_{12} [GeV^{2}/c^{4}]");
    xframe->GetYaxis()->SetTitle("Events/4 MeV^{2}/c^{4}");
    Double_t chi2Kpi = xframe->chiSquare();

    RooPlot* yframe = m2Kpi0_d0mass.frame();
    dbdalitz->plotOn(yframe,MarkerSize(0.1),DrawOption("z"));
    totpdf.plotOn(yframe);
    yframe->getAttLine()->SetLineWidth(1);
    yframe->getAttLine()->SetLineStyle(1);
    yframe->SetTitle("");
    yframe->GetXaxis()->SetTitle("s_{13} [GeV^{2}/c^{4}]");
    yframe->GetYaxis()->SetTitle("Events/5 MeV^{2}/c^{4}");
    Double_t chi2Kpi0 = yframe->chiSquare();
    /*
    RooPlot* zframe = m2pipi0_d0mass.frame(0.,2.3);
    dbdalitz23->plotOn(zframe,MarkerSize(0.1),DrawOption("z"));
    totpdf23.plotOn(zframe);
    zframe->getAttLine()->SetLineWidth(1);
    zframe->getAttLine()->SetLineStyle(1);
    zframe->SetTitle("");
    zframe->GetXaxis()->SetTitle("m^{2}_{#pi^{+}#pi^{0}}");
    Double_t chi2pipi0 = zframe->chiSquare();

    cout << "Chi2 for Kpi = " << chi2Kpi << endl;
    cout << "Chi2 for Kpi0 = " << chi2Kpi0 << endl;
    cout << "Chi2 for pipi0 = " << chi2pipi0 << endl;

    RooPlot* pullFramem12 = m2Kpi_d0mass.frame() ;
    pullFramem12->SetTitle("");
    pullFramem12->GetXaxis()->SetTitle("");
    pullFramem12->addPlotable(xframe->pullHist()) ;
    pullFramem12->SetMaximum(5.);
    pullFramem12->SetMinimum(-5.);

    RooPlot* pullFramem13 = m2Kpi0_d0mass.frame() ;
    pullFramem13->SetTitle("");
    pullFramem13->GetXaxis()->SetTitle("");
    pullFramem13->addPlotable(yframe->pullHist()) ;
    pullFramem13->SetMaximum(5.);
    pullFramem13->SetMinimum(-5.);

    RooPlot* pullFramem23 = m2pipi0_d0mass.frame() ;
    pullFramem23->SetTitle("");        
    pullFramem23->GetXaxis()->SetTitle("");
    pullFramem23->addPlotable(zframe->pullHist()) ;
    pullFramem23->SetMaximum(5.);
    pullFramem23->SetMinimum(-5.);

    TCanvas *c2 = new TCanvas("c2","residuals",1200,200);
    c2->Divide(3,1);
    c2->cd(1);pullFramem12->Draw();
    c2->cd(2);pullFramem13->Draw();
    c2->cd(3);pullFramem23->Draw();
    c2->SaveAs("RSresiduals.eps");
    */
    totpdf.plotOn(xframe,Project(m2Kpi0_d0mass),Components(RooArgSet(combdalitz)),DrawOption("F"),FillColor(kRed));
    totpdf.plotOn(yframe,Project(m2Kpi_d0mass),Components(RooArgSet(combdalitz)),DrawOption("F"),FillColor(kRed));
    //totpdf23.plotOn(zframe,Project(m2Kpi_d0mass),Components(RooArgSet(combdalitz23)),DrawOption("F"),FillColor(kRed));

    TPaveText *box_m12 = new TPaveText(2.5,2.5,2.7,2.7,"");
    box_m12->AddText("(b)");
    box_m12->SetFillColor(10);

    TPaveText *box_m13 = new TPaveText(2.5,2.5,2.7,2.7,"");
    box_m13->AddText("(c)");
    box_m13->SetFillColor(10);

    TCanvas c1("c1","c1",600,600);
    c1.cd();
    xframe->Draw();box_m12->Draw("SAME");
    c1.SaveAs("RSfit_m2Kpi.eps");

    TCanvas c2("c2","c2",600,600);
    c2.cd();
    yframe->Draw();box_m13->Draw("SAME");
    c2.SaveAs("RSfit_m2Kpi0.eps");
    /*
    TCanvas *c1 = new TCanvas("c1","allevents",1200,400);
    c1->Divide(3,1);
    c1->cd(1);xframe->Draw();
    //p.SetBaBarLabel(-1,-1,-1,"preliminary");
    c1->cd(2);yframe->Draw();
    //p.SetBaBarLabel(-1,-1,-1,"preliminary");
    c1->cd(3);zframe->Draw();
    //p.SetBaBarLabel(-1,-1,-1,"preliminary");
    c1->SaveAs("RSsigfit.eps");
    */
  }

  if(doComparison){
    RooDataSet *littledata = (RooDataSet*)finaldata->reduce(EventRange(1,70000));
    RooArgSet VarList1(m2Kpi_d0mass,m2Kpi0_d0mass);
    Int_t num_entries = littledata->numEntries();
    RooDataSet* genpdf = D0pdf->generate(VarList1,num_entries);

    Int_t nbinx = 20;
    Int_t nbiny = 20;
    m2Kpi_d0mass.setBins(nbinx);
    m2Kpi0_d0mass.setBins(nbiny);

    TH2F* pdfhist = new TH2F("pdfhist","pdfhist",nbinx,0.39,3.,nbiny,0.39,3.);
    TH2F* datahist = new TH2F("datahist","datahist",nbinx,0.39,3.,nbiny,0.39,3.);
    pdfhist = genpdf->createHistogram(m2Kpi_d0mass,m2Kpi0_d0mass);
    datahist = finaldata->createHistogram(m2Kpi_d0mass,m2Kpi0_d0mass);
    pdfhist->GetXaxis()->SetTitle("m_{K#pi}^{2}");
    pdfhist->GetYaxis()->SetTitle("m_{K#pi^{0}}^{2}");

    pdfhist->Scale(datahist->Integral()/pdfhist->Integral());

    pdfhist->Add(datahist,-1.);

    TCanvas c2;
    c2.cd();pdfhist->Draw("LEGO2Z");
    c2.SaveAs("RSsigdiff.eps");

    TFile ftmp("prova.root","RECREATE");
    ftmp.cd();pdfhist->Write();
    ftmp.Close();

  }

  return 0;
}//end of the macro
Ejemplo n.º 16
0
int fitHisto(int siteNum,string dataVer)
{

//===>initialize variable
	bool anaLiHe=true;//He8/Li9 bg
    int ADNumOfSite[3]={0};
    int daqHistNum=5;
    if( dataVer.find("13")!=-1 || dataVer.find("14")!=-1 || dataVer.find("15")!=-1 || dataVer.find("16")!=-1)
    {
        ADNumOfSite[0]=2;
        ADNumOfSite[1]=2;
        ADNumOfSite[2]=4;
        daqHistNum=5;
    } else
    {
        if( dataVer.find("11")!=-1 || dataVer.find("12")!=-1 )
        {
            ADNumOfSite[0]=2;
            ADNumOfSite[1]=1;
            ADNumOfSite[2]=3;
            daqHistNum=4;
        }
    }
	string site;
	if( siteNum==1 )
	{
		site="EH1";
	} else if(siteNum==2)
	{
		site="EH2";
	}else if (siteNum==3)
	{
		site="EH3";
	}else
	{
		site="EH1";
	}

//===>initialize histograms
	//livetime
	string runnum;
	TH1F* h[daqHistNum];//the fifth is for daqtime
	Double_t totalTime[5]={0.};

	//Li9 He8
	double n98total=0.;
	//double in98total=0.;
    double ifitn98total=0.;
    double n98Rate=0.;
    double in98Rate=0.;
    double tlivetime=0.;
	TH1F* showermuonNum[6]; 
	TH1F* time2lastshowermuon[6];
	TH1F* hh[6];

//===>get histograms from .root file for analyse
	string filename;
    filename=site;
    filename+="mergedHist_";
    filename+=dataVer;
    filename+=".root";
    TFile* f=new TFile(filename.c_str());

		//livetime
		for( int i=0 ; i<daqHistNum ; i++ )
		{

			stringstream hname;
			if( i==daqHistNum-1 )
			{
				hname<<"LiveTime/DaqTime";
			} else
			{
				hname<<"LiveTime/AD";
				hname<<i+1;
				hname<<"LiveTime";	
			}
			h[i] = (TH1F*)f->Get(hname.str().c_str());
			if( !(h[i]) )
			{
				cout<<"Can not get Hist : "<<hname.str()<<" from "<<site<<"/"<<runnum<<" ."<<endl;
				//return true;
                continue;
			}
		}

		//Li9 He8
        if(anaLiHe)
		{
            for( int i=0 ; i<6 ; i++ )
            {
                TString hnameLi;
                hnameLi="lidj/showermuonNum";
                hnameLi+=i+1;
                showermuonNum[i]=(TH1F*)f->Get(hnameLi);
                hnameLi="lidj/time2lastshowermuon";
                hnameLi+=i+1;
                hnameLi+="4Li";
                time2lastshowermuon[i]=(TH1F*)f->Get(hnameLi);
            }
		}
	
//===>analyse 
	TAxis *xaxis = h[0]->GetXaxis();
	int binNum = xaxis->GetNbins();
    int BinBound=h[0]->FindBin(1346428800);//2012.9.1 0:0:0
	//livetime
    if( BinBound!=0 )
    {
        if( site=="EH2" )
        {
            for(int j=1  ; j<=BinBound ; j++ )
            {
                h[1]->SetBinContent(j,0);
            }
        }
        if( site=="EH3" )
        {
            for(int j=1  ; j<=BinBound ; j++ )
            {
                h[3]->SetBinContent(j,0);
            }
        }
    }
    double totalTimeSpecical=0.;
    for( int j=BinBound ; j<=binNum ; j++ )
    {
        totalTimeSpecical+=h[4]->GetBinContent(j);
    }

    for( int i=0 ; i<5 ; i++ )
    {
        totalTime[i]=0.;
        for( int j=1 ; j<=binNum ; j++ )
        {
            totalTime[i]+=h[i]->GetBinContent(j);
        }

    }
    double totalDaqtime=0.;
    if( site=="EH2" )
    {
        totalDaqtime=totalTime[4]+totalTimeSpecical;
    }else if( site=="EH3" )
    {
        totalDaqtime=totalTime[4]*3+totalTimeSpecical;
    } else
    {
        totalDaqtime=totalTime[4]*2;
    }

	//Li He
    std::cout<<"begin to analyse Li "<<endl;
	if(anaLiHe)
	{
        int hnum=time2lastshowermuon[0]->FindBin(100);
        //std::cout<<"0.001  : "<<time2lastshowermuon[0]->FindBin(0.001)<<endl;
        //std::cout<<"100  : "<<time2lastshowermuon[0]->FindBin(100)<<endl;
        //std::cout<<"hnum  : "<<hnum<<endl;
        for( int k=0 ; k<6 ; k++ )
        {
            TString hhname="slice";
            hhname+=k+1;
            hh[k]=new TH1F(hhname,"hh",hnum-2,0.001,100);
                for( int i=1 ; i<hnum-2 ; i++ )
                {
                    hh[k]->SetBinContent(i,time2lastshowermuon[k]->GetBinContent(i+1));
                }
                hh[k]->SetOption("E1");
        }
        double showerTh[7] = {0.02, 0.5, 1.5, 2.5, 3.5, 4.5, 5.0};
        TH1F* LiResult[5];
        LiResult[0]= new TH1F("LiResult", "All", 6, showerTh);
        LiResult[1]= new TH1F("LiResult", "AD1", 6, showerTh);
        LiResult[2]= new TH1F("LiResult", "AD2", 6, showerTh);
        LiResult[3]= new TH1F("LiResult", "AD3", 6, showerTh);
        LiResult[4]= new TH1F("LiResult", "AD4", 6, showerTh);
		double NumMuon[6]={0.};
		double RateMuon[6]={0.};
		double NumIbd[6]={0.};
        
		RooRealVar x("x","x",0.001,40., "s");
		RooRealVar tauLi9("tauLi9", "tauLi9", -0.257, "s");
		RooRealVar tauHe8("tauHe8", "tauHe8", -0.172, "s");
		RooRealVar rateMu("rateMu","rate of showermuon",-0.1,-10., 0.,"Hz");
		RooRealVar Li9Frac("Li9Frac","Li9's Frac", 0.0);//R
		RooRealVar N98("N98","total number of Li9 and He8",500.,0.,1.e5);
		//RooRealVar N98("N98","total number of Li9 and He8",3e2, 1e1, 2.e5);
		RooFormulaVar lambdaLi9("lambdaLi9","lambdaLi9","1/@0 + @1",RooArgList(tauLi9, rateMu));
		RooFormulaVar lambdaHe8("lambdaHe8","lambdaHe8","1/@0 + @1",RooArgList(tauHe8, rateMu));
		RooFormulaVar coeLi9("coeLi9","coeLi9","@0 * @1 ",RooArgList(N98,Li9Frac));
		RooFormulaVar coeHe8("coeHe8","coeHe8","@0 * ( 1 - @1 )",RooArgList(N98,Li9Frac));
		RooRealVar NIbd("NIbd","number of background",3e2, 1e1, 2.e6);
		RooExponential expLi9("expLi9", "Li9 distribution", x, lambdaLi9);
		RooExponential expHe8("expHe8", "He8 distribution", x, lambdaHe8);
        double Ibdrate[3]={0.0076,0.0067,0.00082};
        RooRealVar rateIbd("rateIbd","rateIbd",-Ibdrate[siteNum-1],-10,0.,"Hz");
        RooFormulaVar lambdaIbd("lambdaIbd","lambdaIbd","@0 + @1",RooArgList(rateIbd, rateMu));
		RooExponential expIbd("expIbd","Ibd distribution",x,rateMu);
		//RooExponential expIbd("expIbd","Ibd distribution",x,lambdaIbd);
		
		RooFitResult* fitres;
		RooAddPdf* sum;
		RooDataHist* data;
        RooPlot* mesframe[6];
		double n98[41]={0.};
		double in98[41]={0.};
		double nIbd[41]={0.};
		double inIbd[41]={0.};
		double minNLL[41]={0.};
        double rateMuValue[41]={0.};
        double rateMuErr[41]={0.};
		//double minNl[6]={0.};
		int minindex[6]={0};
		double n98fit[6]={0.};
		double in98fit[6]={0.};
        double rateMufit[6]={0.};
		double binwidth=0.;
        TH1F* lh[5][6];
        TString lname[5]={"","AD1","AD2","AD3","AD4"};
        int lcolor[5]={4,3,2,6,5};
        bool draw6slice=false;
        TCanvas* c;
        TString xTitle[6]={"slice 1 : 0.02~0.5GeV","slice 2 : 0.5~1.5GeV","slice 3 : 1.5~2.5GeV","slice 4 : 2.5~3.5GeV","slice 5 : 3.5~4.5GeV","slice 6 : >4.5GeV"};
        if( draw6slice )
        {
	        c = new TCanvas("c","c",2000,800) ; 
	        c->Divide(3,2);
	        gStyle->SetEndErrorSize(5.0);
	        gStyle->SetMarkerSize(0.1);
	        //gStyle->SetHistLineWidth(1);
	        if( 0 )
	        {
	            // it's strange ,if you can't draw following six figs in the big 3*2 pad,you can fist use these code,run once,don't exit the ROOT,then you can draw six figs!!!
			    data = new RooDataHist("data", "data", x, time2lastshowermuon[0]);
				sum  = new RooAddPdf("sum","sum",RooArgList(expLi9, expHe8, expIbd),RooArgList(coeLi9, coeHe8, NIbd));
		        RooPlot* mesframe = x.frame() ;
		        data->plotOn(mesframe) ;
		        c->cd(1);
		        mesframe->Draw();
	            return true;
	        }
        }
        for( int ihist=0 ; ihist<1 ; ihist++ )
        {
			double minNl[6]={0.};
			for( int j=0 ; j<6 ; j++ )
			{
	            std::cout<<"now is  "<< j+1<<endl;
	            NumIbd[j]=hh[j]->Integral(1,hh[j]->FindBin(40));
	            hh[j]->Rebin(100);
				data = new RooDataHist("data", "data", x, hh[j]);
				sum  = new RooAddPdf("sum","sum",RooArgList(expLi9, expHe8, expIbd),RooArgList(coeLi9, coeHe8, NIbd));
				for( int i=0 ; i<41 ; i++ )
				{
					Li9Frac.setVal(i*0.025);
					fitres = sum->fitTo((*data),Save(),PrintLevel(-1),Extended(kTRUE));
	                //fitres->Print();
					n98[i]=N98.getVal(0);
					in98[i]=N98.getError();
	                nIbd[i]=NIbd.getVal(0);
	                inIbd[i]=NIbd.getError();
	                rateMuValue[i]=rateMu.getVal(0);
	                rateMuErr[i]=rateMu.getError();
					minNLL[i] = fitres->minNll();
					if( minNLL[i]<minNl[j] )
					{
						minNl[j]=minNLL[i];
						minindex[j]=i;
					}
				}
				n98fit[j]=n98[minindex[j]];
				in98fit[j]=in98[minindex[j]];
	            rateMufit[j]=rateMuValue[minindex[j]];
	            if( draw6slice )
	            {
		            //for drawing fit figure
					Li9Frac.setVal(minindex[j]*0.025);
					fitres = sum->fitTo((*data),Save(),PrintLevel(-1),Extended(kTRUE));
		            //fitres->Print();
		            mesframe[j] = x.frame() ;
		            data->plotOn(mesframe[j]) ;
		            sum->plotOn(mesframe[j]);
		            sum->plotOn(mesframe[j],Components(expIbd),LineStyle(kDashed),LineColor(kGreen)) ;
		            sum->plotOn(mesframe[j],Components(RooArgSet(expLi9,expHe8)),LineStyle(kDashed),LineColor(kRed)) ;
		            xTitle[j]+="        time since last muon (s)";
		            mesframe[j]->GetXaxis()->SetTitle(xTitle[j]);
		            mesframe[j]->GetYaxis()->SetTitle("Entries");
		            c->cd(j+1);
		            mesframe[j]->Draw();
		            //gPad->SetLogy();
	            }
			}
	        
			n98total=(n98fit[0]+n98fit[1]+n98fit[2]+(n98fit[3]+n98fit[4]+n98fit[5])*exp(-1/0.257))/0.678;
			ifitn98total=sqrt(in98fit[0]*in98fit[0]+in98fit[1]*in98fit[1]+in98fit[2]*in98fit[2]+((in98fit[3]+in98fit[4]+in98fit[5])*exp(-1/0.257)*(in98fit[3]+in98fit[4]+in98fit[5])*exp(-1/0.257)))/0.678;
	        if( ihist==0 )
	        {
	            for( int i=0 ; i<ADNumOfSite[siteNum-1] ; i++ )
	            {
	                tlivetime+=totalTime[i];
	            }
	        }else
	        {
	            tlivetime=totalTime[ihist-1];
	        }
	        n98Rate=n98total/(tlivetime/(24*3600));
	        in98Rate=sqrt((ifitn98total/(tlivetime/(24*3600)))*(ifitn98total/(tlivetime/(24*3600)))+(n98total/(tlivetime/(24*3600))/2)*(n98total/(tlivetime/(24*3600))/2));
	        for( int j=0 ; j<6 ; j++ )
	        {
	            LiResult[ihist]->SetBinContent(j+1,n98fit[j]);
	            LiResult[ihist]->SetBinError(j+1,in98fit[j]);
			    for( int jbin=0 ; jbin<binNum ; jbin++ )
	            {
	                NumMuon[j]+=showermuonNum[j]->GetBinContent(jbin);
	            }
				RateMuon[j]=NumMuon[j]/totalDaqtime;
	            //std::cout<<"RateMuon[j]  : "<<RateMuon[j]<<endl;
	            //std::cout<<"RateMuon0[j]  : "<<RateMuon0[j]<<endl;
	            std::cout<<"  R "<<minindex[j]*0.025<<"   n98["<<minindex[j]<<"] "<<n98fit[j]<<"   in98["<<minindex[j]<<"] "<< in98fit[j]<<"   fitRateMu["<<minindex[j]<<"] "<<rateMufit[j]<<"  realRateMu "<<RateMuon[j]<<"   NumTol "<<NumIbd[j]<<endl;
	        }
	        std::cout<<"n98Num   : "<<n98total<<" +- "<<ifitn98total<<" Rate  : "<<n98Rate<<" +- "<< in98Rate<<endl;
        }
        
            /*
        //TCanvas* c4 = new TCanvas("c4", "c4", 600, 400);
        //gStyle->SetEndErrorSize(0.0);
        LiResult[0]->SetMarkerStyle(20);
		LiResult[0]->SetMarkerColor(lcolor[0]);
		LiResult[0]->SetLineColor(lcolor[0]);
		LiResult[0]->SetMarkerSize(1.0);
		LiResult[0]->SetMinimum(0);
		LiResult[0]->SetMaximum(LiResult[0]->GetMaximum()*1.5);
		LiResult[0]->GetXaxis()->SetTitle("Muon visible energy (GeV)");
		LiResult[0]->GetYaxis()->SetTitle("Fitted ^{9}Li events");
		LiResult[0]->SetTitle("");
        LiResult[0]->SetStats(kFALSE);
		LiResult[0]->Draw("EP");
        TLegend *legend=new TLegend(.6,.65,.79,.89);
        TString legendLabel=dataVer+" "+site+" "+"All";
        legend->AddEntry(LiResult[0],legendLabel,"lp");

        for( int ihist=1 ; ihist<ADNumOfSite[siteNum-1]+1; ihist++ )
        {
            LiResult[ihist]->SetMarkerStyle(20);
		    LiResult[ihist]->SetMarkerColor(lcolor[ihist]);
		    LiResult[ihist]->SetLineColor(lcolor[ihist]);
		    LiResult[ihist]->SetMarkerSize(1.0);
            LiResult[ihist]->SetStats(kFALSE);
		    LiResult[ihist]->Draw("EPsame");
            legend->AddEntry(LiResult[ihist],lname[ihist],"lp");
        }
        legend->SetFillColor(0);
        legend->Draw();
        */
	}	
	
    //f->Close();
//===>print result
	std::cout<<""<<endl;
	std::cout<<site <<"'s infomation : "<<endl;
	std::cout<<""<<endl;
	for( int i=0 ; i<ADNumOfSite[siteNum-1] ; i++ )
	{
		std::cout<<"Total AD"<<i+1<<"LiveTime                         : "<<totalTime[i]/(24*3600)<<endl;
	}
	std::cout<<"Total DaqTime : "<<totalTime[daqHistNum-1]/(24*3600)<<" day" <<endl;
	std::cout<<""<<endl;

	if(anaLiHe)
	{
	    std::cout<<" "<<endl;
        /*
	    std::cout<<"Li9/He8 "<<endl;
	    std::cout<<"n98total  : "<<n98total <<" +- "<<in98total <<" Rate:"<<n98total/totalTime[0]*24*3600 <<" +- "<<in98total/totalTime[0]*24*3600 <<endl;
	    std::cout<<"n98total0(without rpc)  : "<<n98total0 <<" +- "<<in98total0 <<" Rate:"<<n98total0/totalTime0[0]*24*3600 <<" +- "<<in98total0/totalTime0[0]*24*3600 <<endl;
        */
	}

//===>write into .root file
	string rootname=site;
	rootname+="FitResult_"+dataVer+".root";
	TFile* file = new TFile(rootname.c_str(),"RECREATE");
    file->cd();
    for( int i=0 ; i<daqHistNum ; i++ )
    {
        h[i]->Write();
    }
    
    if( anaLiHe )
    {
		//for( int i=0 ; i<ADNumOfSite[siteNum-1] ; i++ )
		for( int i=0 ; i<6 ; i++ )
		{
			hh[i]->Write();
		}
    }
	file->Close();
	f->Close();
	return 0;
}
Ejemplo n.º 17
0
void fitPtOverMCJLST(int mass = 125, int LHCsqrts = 7, int whichtype = 1, 
		     bool correctErrors = false, /* string changeParName = "", */
		     bool showErrorPDFs = false, string systString = "Default")

// whichtype
// 0 - gg Signal
// 1 - VBF Signal
// 2 - ZZ
// 3 - ZX
// 4 - ggZZ
// 5 - WH
// 6 - ZH
// 7 - ttH

{

  string changeParName = "";
  if (systString == "Default") changeParName = "up";

  string nameSample[8] = {"gg","vbf","zz","zx","ggzz","wh","zh","tth"};
  float maxType[8] = {2.4,3.2,1.6,1.6,1.6,3.2,3.2,3.2};   
  float rebinType[8] = {1,2,1,1,4,10,10,40};
  
  for (int t = 0; t < 8; t++) {
    if (mass > 150) maxType[t] = int(117.90*maxType[t]/sqrt(mass-10.91))/10.;
  }

  char fileToOpen[200];
  sprintf(fileToOpen,"selRootFiles/PToverM_%s%d_SEL_%dTeV.root",nameSample[whichtype].c_str(),mass,LHCsqrts);
  // if (whichtype == 3) sprintf(fileToOpen,"PTOVERM_%s_SEL_allTeV.root",nameSample[whichtype].c_str());

  RooRealVar* ptoverm = new RooRealVar("ptoverm","p_{T}/M^{4l}",0.,maxType[whichtype],"GeV/c");
 
  TFile input(fileToOpen);
  // if (systString == "Mass" || systString == "Mela") {
  //  sprintf(fileToOpen,"ptovermH_%sUp",systString.c_str());
  // } else {
  sprintf(fileToOpen,"ptovermH_%s",systString.c_str());
  //}
  TH1F* ptovermH = (TH1F*)input.Get(fileToOpen);
  
  if (rebinType[whichtype] > 1) ptovermH->Rebin(rebinType[whichtype]);
  if (maxType[whichtype] < ptovermH->GetBinLowEdge(ptovermH->GetNbinsX() + 1) - ptovermH->GetBinWidth(1)) {
    int theBin = ptovermH->FindBin(maxType[whichtype]);
    ptovermH->GetXaxis()->SetRange(1,theBin-1);
  }

  gROOT->ProcessLine(".L mytdrstyle.C");
  gROOT->ProcessLine("setTDRStyle()");
  
  // cout << endl << "Signal " << endl;   
  ptoverm->setBins(ptovermH->GetNbinsX());

  RooDataHist* rdh = new RooDataHist("rdh","Some dataset",RooArgList(*ptoverm),Import(*ptovermH,kFALSE));
 
  // fit definitions
  // RooWorkspace *ws = new RooWorkspace("ws");

  RooRealVar m("m","emme", 1.,0.01, 40.);
  RooRealVar n("n","enne", 0.93, 0.05, 15.);
  RooRealVar n2("n2","enne2", 0.75, 0.5, 15.);
  RooRealVar bb("bb","bibi",0.02, 0.000005, 20.0);
  RooRealVar T("T","tti",0.2,0.00000005,1.);
  RooRealVar bb2("bb2","bibi2",0.02, 0.0005, 10.0);
  RooRealVar fexp("fexp","f_exp",0.02, 0.0, 1.0);
  if (whichtype == 0) {
    if (LHCsqrts == 8) {
      m.setVal(3.319);   // m.setConstant(kTRUE);
      n.setVal(0.7606);    if (systString != "Default" || mass != 125) n.setConstant(kTRUE); 
      n2.setVal(0.8061);   n2.setConstant(kTRUE);
      bb.setVal(3.728);   // bb.setConstant(kTRUE);
      T.setVal(0.00333);   // T.setConstant(kTRUE);
      bb2.setVal(1.7172);    // bb2.setConstant(kTRUE);
      fexp.setVal(0.002144);   if (systString != "Default" || mass != 125) fexp.setConstant(kTRUE);
    } else {
      m.setVal(0.061);   // m.setConstant(kTRUE);
      n.setVal(1.6141);   if (systString == "Resummation" || systString == "TopMass")  n.setConstant(kTRUE);
      n2.setVal(1.3294);   n2.setConstant(kTRUE);
      bb.setVal(4.2761);   // bb.setConstant(kTRUE);
      T.setVal(0.0361);   // T.setConstant(kTRUE);
      bb2.setVal(1.6643);   bb2.setConstant(kTRUE);
      fexp.setVal(0.0004);   // fexp.setConstant(kTRUE);
    }
  } else if (whichtype == 1) {
    m.setVal(1.006);   // m.setConstant(kTRUE);
    n.setVal(10.939);   n.setConstant(kTRUE);
    n2.setVal(1.1448);   n2.setConstant(kTRUE);
    bb.setVal(0.02048);   bb.setConstant(kTRUE);
    T.setVal(0.16115);   if (systString.find("Mela") != string::npos) T.setConstant(kTRUE); // T.setConstant(kTRUE);
    bb2.setVal(1.0024);   bb2.setConstant(kTRUE);
    fexp.setVal(0.005);   fexp.setConstant(kTRUE);
    if (mass > 300) {
      fexp.setVal(0.0);   fexp.setConstant(kFALSE);
    }
    if (mass > 500) {
      bb2.setVal(5.0);  //  bb2.setConstant(kFALSE);
    }
    if (mass > 500) {
      bb.setVal(15.0);  //  bb.setConstant(kFALSE);
    }
  } else if (whichtype == 2) {
    if (LHCsqrts == 8) {
      m.setVal(1.0476);   // m.setConstant(kTRUE);    
      bb.setVal(3.3088);  // if (mass != 140) bb.setConstant(kTRUE);
      n2.setVal(0.7146);   n2.setConstant(kTRUE);
      n.setVal(0.9518);      n.setConstant(kTRUE);
      bb2.setVal(100000.);  bb2.setConstant(kTRUE);
      T.setVal(0.0021889);    if (systString.find("Mela") != string::npos || mass != 140) T.setConstant(kTRUE);
      fexp.setVal(0.0);    fexp.setConstant(kTRUE);
    } else {
      m.setVal(1.028);   // m.setConstant(kTRUE);    
      bb.setVal(2.91); // bb.setConstant(kTRUE);
      n2.setVal(0.7146);  n2.setConstant(kTRUE);
      n.setVal(0.9518);     n.setConstant(kTRUE);
      bb2.setVal(100000.);  bb2.setConstant(kTRUE);
      T.setVal(0.002248);   if (systString.find("Mela") != string::npos) T.setConstant(kTRUE);
      fexp.setVal(0.0);    fexp.setConstant(kTRUE);
    }
  } else if (whichtype == 3) {
    m.setVal(1.411);   // m.setConstant(kTRUE);
    n.setVal(3.4523);     n.setConstant(kTRUE);
    n2.setVal(0.6910);    n2.setConstant(kTRUE);
    bb.setVal(0.00039);  // bb.setConstant(kTRUE);
    T.setVal(0.118);   // T.setConstant(kTRUE);
    bb2.setVal(0.0224);   bb2.setConstant(kTRUE);
    fexp.setVal(0.0);   fexp.setConstant(kTRUE);
  } else if (whichtype == 4) {
    m.setVal(1.411);   // m.setConstant(kTRUE);
    n.setVal(5.756);    // n.setConstant(kTRUE);
    n2.setVal(0.8738);   // n2.setConstant(kTRUE);
    bb.setVal(0.00039);  // bb.setConstant(kTRUE);
    T.setVal(0.118);   // T.setConstant(kTRUE);
    bb2.setVal(0.0224);   bb2.setConstant(kTRUE);
    fexp.setVal(0.0);   fexp.setConstant(kTRUE);
  } else if (whichtype == 5 && LHCsqrts == 8) {
    m.setVal(1.006);   // m.setConstant(kTRUE);
    n.setVal(10.939);    n.setConstant(kTRUE);
    n2.setVal(1.1448);   n2.setConstant(kTRUE);
    bb.setVal(3.897);   bb.setConstant(kTRUE);
    T.setVal(0.1009);  // T.setConstant(kTRUE);
    bb2.setVal(1.0224);   bb2.setConstant(kTRUE);
    fexp.setVal(0.01);   fexp.setConstant(kTRUE);
  } else {
    // cout << "Entro qui" << endl;
    m.setVal(1.006);   // m.setConstant(kTRUE);
    n.setVal(10.939);    n.setConstant(kTRUE);
    n2.setVal(1.1448);   n2.setConstant(kTRUE);
    bb.setVal(0.0129);  bb.setConstant(kTRUE);
    T.setVal(0.1009);    // T.setConstant(kTRUE);
    bb2.setVal(1.0224);   bb2.setConstant(kTRUE);
    fexp.setVal(0.01);   fexp.setConstant(kTRUE);
  }
 
  
  RooModifTsallis* rt3 = new RooModifTsallis("rt3","rt3",*ptoverm,m,n,n2,bb,bb2,T,fexp);
  // ws->import(*rt3);

  // fit
  RooFitResult* fit = rt3->fitTo(*rdh,Minos(0),Save(1),SumW2Error(kTRUE),NumCPU(1));  

  float mVal = m.getVal();   
  float nVal = n.getVal();
  float n2Val = n2.getVal();
  float bbVal = bb.getVal();
  float bb2Val = bb2.getVal();
  float fexpVal = fexp.getVal();
  float TVal = T.getVal();

  if (correctErrors) {
    // Tsallis errors not reliable, use toy MC

    TH1F* mHist = new TH1F("mHist","m",21,-0.5*mVal,0.5*mVal);
    TH1F* nHist = new TH1F("nHist","n",21,-0.2*nVal,0.2*nVal);
    TH1F* n2Hist = new TH1F("n2Hist","n2",21,-0.2*n2Val,0.2*n2Val);
    TH1F* bbHist = new TH1F("bbHist","bb",21,-0.2*bbVal,0.2*bbVal);
    TH1F* bb2Hist = new TH1F("bb2Hist","bb2",21,-0.2*bb2Val,0.2*bb2Val);
    TH1F* fexpHist = new TH1F("fexpHist","fexp",21,-0.2*fexpVal-0.000001,0.2*fexpVal+0.000001);
    TH1F* THist = new TH1F("THist","T",21,-0.5*TVal,0.5*TVal);
    mHist->GetXaxis()->SetTitle("m-m_{gen}");
    nHist->GetXaxis()->SetTitle("n-n_{gen}");
    n2Hist->GetXaxis()->SetTitle("n2-n2_{gen}");
    bbHist->GetXaxis()->SetTitle("bb-bb_{gen}");
    bb2Hist->GetXaxis()->SetTitle("bb2-bb2_{gen}");
    THist->GetXaxis()->SetTitle("T-T_{gen}");
    fexpHist->GetXaxis()->SetTitle("fexp-fexp_{gen}");

    for (unsigned int iToy = 0; iToy < 200; iToy++) {

      cout << endl << "####" << endl;
      cout << "Generating toy experiment n. " << iToy+1 << endl;

      m.setVal(mVal);
      n.setVal(nVal);
      n2.setVal(n2Val);
      bb.setVal(bbVal);
      bb2.setVal(bb2Val);
      fexp.setVal(fexpVal);
      T.setVal(TVal);

      TDatime *now = new TDatime();
      Int_t seed = now->GetDate() + now->GetTime();
      cout << "RooFit Generation Seed = " << seed+iToy << endl;
      RooRandom::randomGenerator()->SetSeed(seed+iToy);
      cout << "####" << endl << endl;

      RooDataSet *dataToy = rt3->generate(RooArgSet(*ptoverm),ptovermH->GetEntries());
      RooDataHist *dataToyH = new RooDataHist("dataToyH","toy",RooArgSet(*ptoverm),*dataToy);
      
      rt3->fitTo(*dataToyH,Minos(0),SumW2Error(kTRUE),NumCPU(1));  
  
      if (fit->floatParsFinal().find("m")) mHist->Fill(m.getVal()-mVal);
      if (fit->floatParsFinal().find("n")) nHist->Fill(n.getVal()-nVal);
      if (fit->floatParsFinal().find("n2")) n2Hist->Fill(n2.getVal()-n2Val);
      if (fit->floatParsFinal().find("bb")) bbHist->Fill(bb.getVal()-bbVal);
      if (fit->floatParsFinal().find("bb2")) bb2Hist->Fill(bb2.getVal()-bb2Val);
      if (fit->floatParsFinal().find("fexp")) fexpHist->Fill(fexp.getVal()-fexpVal);
      if (fit->floatParsFinal().find("T")) THist->Fill(T.getVal()-TVal);
    }

    TCanvas cant("cant","Test canvas",5.,5.,900.,500.);
    cant.Divide(4,2);
    cant.cd(1);   mHist->Draw();
    cant.cd(2);   nHist->Draw();
    cant.cd(3);   n2Hist->Draw();
    cant.cd(4);   bbHist->Draw();
    cant.cd(5);   bb2Hist->Draw();
    cant.cd(6);   fexpHist->Draw();
    cant.cd(7);   THist->Draw();
    // cant.SaveAs("figs/testToys.pdf");
    cant.SaveAs("newfigs/testToys.pdf");

    if (fit->floatParsFinal().find("m")) m.setError(mHist->GetRMS());
    if (fit->floatParsFinal().find("n")) n.setError(nHist->GetRMS());
    if (fit->floatParsFinal().find("n2")) n2.setError(n2Hist->GetRMS());
    if (fit->floatParsFinal().find("bb")) bb.setError(bbHist->GetRMS());
    if (fit->floatParsFinal().find("bb2")) bb2.setError(bb2Hist->GetRMS());
    if (fit->floatParsFinal().find("fexp")) fexp.setError(fexpHist->GetRMS());
    if (fit->floatParsFinal().find("T")) T.setError(THist->GetRMS());
  }

  m.setVal(mVal);
  n.setVal(nVal);
  n2.setVal(n2Val);
  bb.setVal(bbVal);
  bb2.setVal(bb2Val);
  fexp.setVal(fexpVal);
  T.setVal(TVal);

  char fileToSave[200];
  // if (changeParName != "") 
  //  sprintf(fileToSave,"text/paramsPTOverMCJLST_%s_%dTeV_%s_%s.txt",nameSample[whichtype].c_str(),LHCsqrts,systString.c_str(),changeParName.c_str()); 
  // else 
  sprintf(fileToSave,"text/paramsPTOverMCJLST_%s%d_%dTeV_%s.txt",nameSample[whichtype].c_str(),mass,LHCsqrts,systString.c_str());
  ofstream os1(fileToSave);
  if (changeParName != "") {
    sprintf(fileToSave,"m%s",changeParName.c_str());  m.SetName(fileToSave);
    sprintf(fileToSave,"n%s",changeParName.c_str());  n.SetName(fileToSave);
    sprintf(fileToSave,"n2%s",changeParName.c_str());  n2.SetName(fileToSave);
    sprintf(fileToSave,"bb%s",changeParName.c_str());  bb.SetName(fileToSave);
    sprintf(fileToSave,"bb2%s",changeParName.c_str());  bb2.SetName(fileToSave);
    sprintf(fileToSave,"fexp%s",changeParName.c_str());  fexp.SetName(fileToSave);
    sprintf(fileToSave,"T%s",changeParName.c_str());  T.SetName(fileToSave);
  }
  (RooArgSet(m,n,n2,bb,bb2,fexp,T)).writeToStream(os1,false);
  os1.close();

  RooRealVar mup("mup","emme", 1.,0.01, 30.);
  RooRealVar nup("nup","enne", 0.93, 0.5, 15.);
  RooRealVar n2up("n2up","enne2", 0.75, 0.5, 15.);
  RooRealVar bbup("bbup","bibi",0.02, 0.00005, 20.0);
  RooRealVar Tup("Tup","tti",0.2,0.00000005,1.);
  RooRealVar bb2up("bb2up","bibi2",0.02, 0.0005, 10.0);
  RooRealVar fexpup("fexpup","f_exp",0.02, 0.0, 1.0);
 
  RooModifTsallis* rt3up = new RooModifTsallis("rt3up","rt3up",*ptoverm,mup,nup,n2up,bbup,bb2up,Tup,fexpup);
  // ws->import(*rt3up);
 
  RooRealVar mdown("mdown","emme", 1.,0.01, 30.);
  RooRealVar ndown("ndown","enne", 0.93, 0.5, 15.);
  RooRealVar n2down("n2down","enne2", 0.75, 0.5, 15.);
  RooRealVar bbdown("bbdown","bibi",0.02, 0.00005, 20.0);
  RooRealVar Tdown("Tdown","tti",0.2,0.00000005,1.);
  RooRealVar bb2down("bb2down","bibi2",0.02, 0.0005, 10.0);
  RooRealVar fexpdown("fexpdown","f_exp",0.02, 0.0, 1.0);

  RooModifTsallis* rt3down = new RooModifTsallis("rt3down","rt3down",*ptoverm,mdown,ndown,n2down,bbdown,bb2down,Tdown,fexpdown);
  // ws->import(*rt3down);

  RooPlot *frame = ptoverm->frame();

  char reducestr[300];
  sprintf(reducestr,"ptoverm > %f && ptoverm < %f",ptoverm->getMin(),ptoverm->getMax());
  
  rdh->plotOn(frame,DataError(RooAbsData::SumW2),Cut(reducestr));
  static RooHist *hpull;
  float chi2 = 0.;

  if (changeParName == "") {
    sprintf(fileToSave,"text/paramsPTOverMCJLST_%s%d_%dTeV_Default.txt",nameSample[whichtype].c_str(),mass,LHCsqrts);
    ifstream is1(fileToSave);
    (RooArgSet(mup,nup,n2up,bbup,bb2up,fexpup,Tup)).readFromStream(is1,false);

    mdown.setVal(fabs(3*mup.getVal() - 2*m.getVal()));
    ndown.setVal(fabs(3*nup.getVal() - 2*n.getVal()));
    n2down.setVal(fabs(3*n2up.getVal() - 2*n2.getVal()));
    bbdown.setVal(fabs(3*bbup.getVal() - 2*bb.getVal()));
    Tdown.setVal(fabs(3*Tup.getVal() - 2*T.getVal()));
    bb2down.setVal(fabs(3*bb2up.getVal() - 2*bb2.getVal()));
    fexpdown.setVal(fabs(3*fexpup.getVal() - 2*fexp.getVal()));

    if (showErrorPDFs) {
      rt3->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
      hpull = frame->pullHist();
      rt3up->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
      if (systString.find("Mela") == string::npos) rt3down->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
    } else {
      rt3->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
      hpull = frame->pullHist();
    }
  } else {
    mup.setVal(m.getVal() + m.getError());   cout << "mup = " << mup.getVal() << endl;
    nup.setVal(n.getVal() + n.getError());
    n2up.setVal(n2.getVal() + n2.getError());
    bbup.setVal(bb.getVal() + bb.getError());
    Tup.setVal(T.getVal() + T.getError());
    bb2up.setVal(bb2.getVal() + bb2.getError());
    fexpup.setVal(fexp.getVal() + fexp.getError());

    mdown.setVal(m.getVal() - m.getError());  cout << "mdown = " << mdown.getVal() << endl;
    ndown.setVal(n.getVal() - n.getError());
    n2down.setVal(n2.getVal() - n2.getError());
    bbdown.setVal(bb.getVal() - bb.getError());
    Tdown.setVal(T.getVal() - T.getError());
    bb2down.setVal(bb2.getVal() - bb2.getError());
    fexpdown.setVal(fexp.getVal() - fexp.getError());

    rt3->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
    hpull = frame->pullHist();
    if (showErrorPDFs) {
      rt3up->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
      rt3down->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent));
    }
  }

  double *ypulls = hpull->GetY();
  unsigned int nBins = rdh->numEntries();
  unsigned int nFullBins = 0;
  for (unsigned int i = 0; i < nBins; i++) {
    cout << "Pull of bin " << i << " = " << ypulls[i] << endl;
    if (fabs(ypulls[i]) < 5.0) chi2 += ypulls[i]*ypulls[i]; 
    cout << "Partial chi2 = " << chi2 << endl;
    if (fabs(ypulls[i]) > 0.0001 && fabs(ypulls[i]) < 5.0) nFullBins++;
  }
  for (unsigned int i = 0; i < nBins; i++) {
    if (fabs(ypulls[i]) < 0.0001) ypulls[i] = 999.; 
    hpull->SetPointError(i,0.,0.,0.,0.);
  } 
  int nFitPar = fit->floatParsFinal().getSize() - 1;

  TCanvas can("can","The canvas",5.,5.,500.,900.); 
  can.Divide(1,3);

  TLatex *t = new TLatex();
  t->SetNDC();
  t->SetTextAlign(22);
  t->SetTextSize(0.06);

  can.cd(1);
  gPad->SetBottomMargin(0.0);
  frame->Draw();
  // gPad->SetLogy(); 
  // Htest->Draw();
  sprintf(fileToSave,"%s %d GeV at %d TeV",nameSample[whichtype].c_str(),mass,LHCsqrts);
  t->DrawLatex(0.6,0.8,fileToSave); 

  can.cd(2);
  gPad->SetLogy(); 
  gPad->SetTopMargin(0.0);
  frame->Draw();
 
  RooPlot* pull = ptoverm->frame(Title("Pull Distribution")) ;
  pull->GetYaxis()->SetTitle("Pull");
  /* pull->SetLabelSize(0.08,"XYZ");
  pull->SetTitleSize(0.08,"XYZ");
  pull->SetTitleOffset(0.6,"Y");
  pull->SetTitleOffset(1.0,"X"); */
  pull->addPlotable(hpull,"P") ; 
  pull->SetMinimum(-6.); 
  pull->SetMaximum(6.); 

  can.cd(3);
  gPad->SetGridy();
  pull->Draw();
  sprintf(fileToSave,"#chi^{2}/n_{DoF} = %4.1f/%d",chi2,nFullBins - nFitPar);
  if (chi2 < 1000.) t->DrawLatex(0.80,0.86,fileToSave);

  // sprintf(fileToSave,"figs/fitPTOverMCJLST_%s%d_%dTeV_%s.pdf",nameSample[whichtype].c_str(),mass,LHCsqrts,systString.c_str());
  sprintf(fileToSave,"newfigs/fitPTOverMCJLST_%s%d_%dTeV_%s.pdf",nameSample[whichtype].c_str(),mass,LHCsqrts,systString.c_str());
  can.SaveAs(fileToSave);

}
Ejemplo n.º 18
0
void FitBias(TString CAT,TString CUT,float SIG,float BKG,int NTOYS)
{
  gROOT->ForceStyle();
  
  RooMsgService::instance().setSilentMode(kTRUE);
  RooMsgService::instance().setStreamStatus(0,kFALSE);
  RooMsgService::instance().setStreamStatus(1,kFALSE);
  
  // -----------------------------------------
  TFile *fTemplates = TFile::Open("templates_"+CUT+"_"+CAT+"_workspace.root");
  RooWorkspace *wTemplates = (RooWorkspace*)fTemplates->Get("w");
  RooRealVar *x            = (RooRealVar*)wTemplates->var("mTop");
  RooAbsPdf *pdf_signal    = (RooAbsPdf*)wTemplates->pdf("ttbar_pdf_Nominal");
  RooAbsPdf *pdf_bkg       = (RooAbsPdf*)wTemplates->pdf("qcdCor_pdf"); 
  TRandom *rnd = new TRandom();
  rnd->SetSeed(0);
  x->setBins(250);   
  RooPlot *frame;

  TFile *outf;

  if (NTOYS > 1) { 
    outf = TFile::Open("FitBiasToys_"+CUT+"_"+CAT+".root","RECREATE");
  }

  float nSigInj,nBkgInj,nSigFit,nBkgFit,eSigFit,eBkgFit,nll;

  TTree *tr = new TTree("toys","toys");
  
  tr->Branch("nSigInj",&nSigInj,"nSigInj/F");
  tr->Branch("nSigFit",&nSigFit,"nSigFit/F");
  tr->Branch("nBkgInj",&nBkgInj,"nBkgInj/F");
  tr->Branch("nBkgFit",&nBkgFit,"nBkgFit/F");
  tr->Branch("eSigFit",&eSigFit,"eSigFit/F");
  tr->Branch("eBkgFit",&eBkgFit,"eBkgFit/F");
  tr->Branch("nll"    ,&nll    ,"nll/F");

  for(int itoy=0;itoy<NTOYS;itoy++) {
    // generate pseudodataset
    nSigInj = rnd->Poisson(SIG);
    nBkgInj = rnd->Poisson(BKG);
    RooRealVar *nSig = new RooRealVar("nSig","nSig",nSigInj);
    RooRealVar *nBkg = new RooRealVar("nBkg","nBkg",nBkgInj);
    RooAddPdf *model = new RooAddPdf("model","model",RooArgList(*pdf_signal,*pdf_bkg),RooArgList(*nSig,*nBkg)); 
    RooDataSet *data = model->generate(*x,nSigInj+nBkgInj);
    
    RooDataHist *roohist = new RooDataHist("roohist","roohist",RooArgList(*x),*data);
    // build fit model
    RooRealVar *nFitSig = new RooRealVar("nFitSig","nFitSig",SIG,0,10*SIG);
    RooRealVar *nFitBkg = new RooRealVar("nFitBkg","nFitBkg",BKG,0,10*BKG);
    RooAddPdf *modelFit = new RooAddPdf("modelFit","modelFit",RooArgList(*pdf_signal,*pdf_bkg),RooArgList(*nFitSig,*nFitBkg)); 
    // fit the pseudo dataset
    RooFitResult *res = modelFit->fitTo(*roohist,RooFit::Save(),RooFit::Extended(kTRUE));
    //res->Print();
    nSigFit = nFitSig->getVal();
    nBkgFit = nFitBkg->getVal();
    eSigFit = nFitSig->getError();
    eBkgFit = nFitBkg->getError();
    nll     = res->minNll();
    tr->Fill();
    if (itoy % 100 == 0) {
      cout<<"Toy #"<<itoy<<": injected = "<<nSigInj<<", fitted = "<<nSigFit<<", error = "<<eSigFit<<endl;
    }
    if (NTOYS == 1) {
      frame = x->frame();
      roohist->plotOn(frame); 
      model->plotOn(frame);
    }
  }
  if (NTOYS == 1) {
    TCanvas *can = new TCanvas("Toy","Toy",900,600);
    frame->Draw();
  }  
  else {
    outf->cd();
    tr->Write();
    outf->Close();
    fTemplates->Close();
  }  
}
Ejemplo n.º 19
0
RooAddPdf fitScaledMuMuGammaMass(
  const char *histoname = "scaledMmgMass_00",
  const char *filename = "scaledMmgHistos.root",
  const char* plotOpt = "NEU",
  const int nbins = 20)
{
  gROOT->ProcessLine(".L tdrstyle.C");
  setTDRStyle();
  gStyle->SetPadRightMargin(0.05);

  double minMass = 60;
  double maxMass = 120;
  RooRealVar  mass("mass","m(#mu#mu#gamma)", minMass, maxMass,"GeV/c^{2}");

  // Read data set

  TFile * file = new TFile(filename);
  TH1F * hh = (TH1F*) file->Get(histoname);
  if (!hh) {
    cout << "Didn't find " << histoname << " in " << filename << endl;
    return;
  }
  RooDataHist *data = new RooDataHist("data", "data", RooArgSet(mass), hh);
//   RooDataSet *data = RooDataSet::read(filename,RooArgSet(mass));
//   RooDataSet *dataB = RooDataSet::read(filenameB,RooArgSet(mass));

// Build p.d.f.

////////////////////////////////////////////////
//             Parameters                     //
////////////////////////////////////////////////

//  Signal p.d.f. parameters
//  Parameters for a Gaussian and a Crystal Ball Lineshape
  RooRealVar  cbBias ("#Deltam_{CB}", "CB Bias", 0.05, -10, 10,"GeV/c^{2}");
  RooRealVar  cbSigma("#sigma_{CB}","CB Width", 1.6, 0.001, 10.0,"GeV/c^{2}");
  RooRealVar  cbCut  ("a_{CB}","CB Cut", 1.5, 0.1, 2.0);
  RooRealVar  cbPower("n_{CB}","CB Power", 1.3, 0.1, 20.0);

//   cbSigma.setConstant(kTRUE);
//   cbCut.setConstant(kTRUE);
//   cbPower.setConstant(kTRUE);

//  Parameters for Breit-Wigner
  RooRealVar bwMean("m_{Z}","BW Mean", 91.1876, "GeV/c^{2}");
  RooRealVar bwWidth("#Gamma_{Z}", "BW Width", 2.4952, "GeV/c^{2}");

  // Keep Breit-Wigner parameters fixed to the PDG values
//   bwMean.setConstant(kTRUE);
//   bwWidth.setConstant(kTRUE);


//  Background p.d.f. parameters
// Parameters for exponential
  RooRealVar expRate("#lambda_{exp}", "Exponential Rate", -0.119, -10, 1);

//   expRate.setConstant(kTRUE);



// fraction of signal
//  RooRealVar  frac("frac", "Signal Fraction", 0.1,0.,0.3.);
/*  RooRealVar  nsig("N_{S}", "#signal events", 9000, 0.,10000.);
  RooRealVar  nbkg("N_{B}", "#background events", 1000,2,10000.);*/
  RooRealVar  nsig("N_{S}", "#signal events", 29300, 0.1, 100000.);
  RooRealVar  nbkg("N_{B}", "#background events", 0, 0., 10000.);

//   nbkg.setConstant(kTRUE);



////////////////////////////////////////////////
//               P.D.F.s                      //
////////////////////////////////////////////////

// Di-photon mass signal p.d.f.
  RooBreitWigner bw("bw", "bw", mass, bwMean, bwWidth);
//   RooGaussian    signal("signal", "A  Gaussian Lineshape", mass, m0, sigma);
  RooCBShape     cball("cball", "A  Crystal Ball Lineshape", mass, cbBias, cbSigma, cbCut, cbPower);

  mass.setBins(100000, "fft");
  RooFFTConvPdf BWxCB("BWxCB","bw (X) crystall ball", mass, bw, cball);


// Di-photon mass background  p.d.f.
  RooExponential bg("bg","bkgd exp", mass, expRate);

// Di-photon mass model p.d.f.
  RooAddPdf      model("model", "signal + background mass model", RooArgList(BWxCB, bg), RooArgList(nsig, nbkg));


  TStopwatch t ;
  t.Start() ;
  model.fitTo(*data,FitOptions("mh"),Optimize(0),Timer(1));
//   signal->fitTo(*data,FitOptions("mh"),Optimize(0),Timer(1));

  t.Print() ;

  TCanvas *c = new TCanvas("c","Unbinned Invariant Mass Fit", 0,0,800,600);
// Plot the fit results
  RooPlot* plot = mass.frame(Range(minMass,maxMass)/*,Bins(nbins)*/);

// Plot 1
//   dataB->plotOn(plot, MarkerColor(kRed), LineColor(kRed));
  data->plotOn(plot);
//   model.plotOn(plot);
  model.plotOn(plot);
  //model.paramOn(plot, Format(plotOpt, AutoPrecision(1)), Parameters(RooArgSet(nsig, nbkg, m0, sigma)));
  model.paramOn(plot, Format(plotOpt, AutoPrecision(1)), Parameters(RooArgSet(cbBias, cbSigma, cbCut, cbPower, bwMean, bwWidth, expRate, nsig, nbkg)));

//   model.plotOn(plot, Components("signal"), LineStyle(kDashed), LineColor(kRed));
  model.plotOn(plot, Components("bg"), LineStyle(kDashed), LineColor(kRed));


  plot->Draw();

//   TLatex *   tex = new TLatex(0.2,0.8,"CMS preliminary");
//   tex->SetNDC();
//   tex->SetTextFont(42);
//   tex->SetLineWidth(2);
//   tex->Draw();
//   tex->DrawLatex(0.2, 0.725, "7 TeV Data, L = 258 pb^{-1}");
//
//   float fsig_peak = NormalizedIntegral(model,
//                       mass,
//                       cbBias.getVal() - 2.5*cbSigma.getVal(),
//                       cbBias.getVal() + 2.5*cbSigma.getVal()
//                     );

//   float fbkg_peak = NormalizedIntegral(bg,
//                       mass,
//                       m0.getVal() - 2.5*sigma.getVal(),
//                       m0.getVal() + 2.5*sigma.getVal()
//                     );

/*  double nsigVal = fsig_peak * nsig.getVal();
  double nsigErr = fsig_peak * nsig.getError();
  double nsigErrRel = nsigErr / nsigVal;*/
//   double nbkgVal = fbkg_peak * nbkg.getVal();
//   double nbkgErr = fbkg_peak * nbkg.getError();
//   double nbkgErrRel = nbkgErr / nbkgVal;

//   cout << "nsig " << nsigVal << " +/- " << nsigErr << endl;
//   cout << "S/B_{#pm2.5#sigma} " << nsigVal/nbkgVal << " +/- "
//     << (nsigVal/nbkgVal)*sqrt(nsigErrRel*nsigErrRel + nbkgErrRel*nbkgErrRel)
//     << endl;

//   tex->DrawLatex(0.2, 0.6, Form("N_{S} = %.0f#pm%.0f", nsigVal, nsigErr) );
//   tex->DrawLatex(0.2, 0.525, Form("S/B_{#pm2.5#sigma} = %.1f", nsigVal/nbkgVal) );
//   tex->DrawLatex(0.2, 0.45, Form("#frac{S}{#sqrt{B}}_{#pm2.5#sigma} = %.1f", nsigVal/sqrt(nbkgVal)));

//   leg = new TLegend(0.65,0.6,0.9,0.75);
//   leg->SetFillColor(kWhite);
//   leg->SetLineColor(kWhite);
//   leg->SetShadowColor(kWhite);
//   leg->SetTextFont(42);

//   TLegendEntry * ldata  = leg->AddEntry(data, "Opposite Sign");
//   TLegendEntry * ldataB = leg->AddEntry(dataB, "Same Sign");
//   ldata->SetMarkerStyle(20);
//   ldataB->SetMarkerStyle(20);
//   ldataB->SetMarkerColor(kRed);

//   leg->Draw();

  cout << "histogram name, cbMean, cbMeanErr, cbWidth, cbWidthErr\n"
    << histoname << "\t"
    << cbBias.getVal() << "\t"
    << cbBias.getError() << "\t"
    << cbSigma.getVal() << "\t"
    << cbSigma.getError() << "\t"
    << std::endl << std::flush;

  return model;



}