Пример #1
0
void DrawMigrationMatrix(TTree* tr)
{

  TEventTree evTr;
  evTr.Init(tr);
  
  long nentries = tr->GetEntries();
  //nentries = 100000;

 // TFile fOut("testGenHists.root","RECREATE");
  TConfiguration config;
  float binLimits[config.GetNPhoPtBins()+1];
  vector <float> vecLimits = config.GetPhoPtBinsLimits();
  for (int i=0; i<config.GetNPhoPtBins()+1; i++){
    binLimits[i]=vecLimits[i];
  }
  TH2F* histMigr = new TH2F("hist","migration matrix", config.GetNPhoPtBins(),binLimits,config.GetNPhoPtBins(),binLimits);

  for (long entry=0; entry<100000; entry++)
  //for (long entry=0; entry<nentries; entry++)
 
    {
      evTr.GetEntryNeededBranchesOnly(entry);
      evTr.GetEntryMCSpecific(entry);

      if (evTr.treeLeaf.nMC==0) continue;

      for (int iMC=0; iMC<evTr.treeLeaf.nMC; iMC++)
        {

          /////////////////////////////////////
          // photons check starts
          /////////////////////////////////////

          if (fabs(evTr.treeLeaf.mcPID[iMC])==22){
            for (int ipho=0; ipho<evTr.treeLeaf.nPho; ipho++){
              if (evTr.treeLeaf.mcIndex[iMC]==evTr.treeLeaf.phoGenIndex[ipho]){
                int binx = config.FindPhoPtBinByPhoPt(evTr.treeLeaf.mcEt[iMC])+1;
                int biny = config.FindPhoPtBinByPhoPt(evTr.treeLeaf.phoEt[ipho])+1;
                float binCont = histMigr->GetBinContent(binx,biny)+1;
                //std::cout<<"binx="<<binx<<", biny="<<biny<<", binCont="<<binCont<<std::endl;
                histMigr->SetBinContent(binx,biny,binCont);
             
              } //end of if (mcIndex[iMC]==phoGenIndex[ipho])
            } //end of loop over photons
          } //end of if (fabs(mcPID[iMC])==22)

          /////////////////////////////////////
          // photons check ends
          /////////////////////////////////////


        } //end of loop over iMC    
    } //end of loop over entry 

  for (int iy=1; iy<histMigr->GetNbinsY()+1; iy++){
    float totalGen=0;
    for (int ix=1; ix<histMigr->GetNbinsX()+1; ix++){
      totalGen+=histMigr->GetBinContent(ix,iy);
    }
    for (int ix=1; ix<histMigr->GetNbinsX()+1; ix++){
      float cont = histMigr->GetBinContent(ix,iy)/totalGen;
      histMigr->SetBinContent(ix,iy,cont);
    }
  }

  TCanvas c("matrMigr","matrMigr");
  histMigr->Print();
  for (int ix=1; ix<histMigr->GetNbinsX()+1; ix++){
    for (int iy=1; iy<histMigr->GetNbinsY()+1; iy++){
      std::cout<<histMigr->GetBinContent(ix,iy)<<" ";
    }
    std::cout<<std::endl;
  }
  histMigr->SetStats(0);
  histMigr->GetXaxis()->SetMoreLogLabels(1);
  histMigr->GetYaxis()->SetMoreLogLabels(1);
  histMigr->SetMarkerSize(1);
  histMigr->Draw("COLZ TEXT");
  c.SetLogx();
  c.SetLogy();
  c.SaveAs("matrMigr.png");
}
Пример #2
0
void fitSignal(){

std::string shapes_file = "mlfit.root";
std::string data_file = "param_ws.root";
std::string channel = "ch1";
     
     TFile *dfile = TFile::Open(data_file.c_str());
     TFile *sfile = TFile::Open(shapes_file.c_str());

     TH1F *bkg   = (TH1F*)sfile->Get(Form("shapes_fit_b/%s/total",channel.c_str()));
     TH1F *data  = (TH1F*)dfile->Get("SR_data");		// TH1 for data 
     TH1F *signal= (TH1F*)dfile->Get("SR_signal");		// TH1 for signal 
     TH2F *covar = (TH2F*)sfile->Get(Form("shapes_fit_b/%s/total_covar",channel.c_str()));

     // bkg and covariance defined as pdf / GeV, so scale by bin widhts 
     //

     int nbins = data->GetNbinsX();

     if (!isTH1Input){
      for (int b=1;b<=nbins;b++){
       double bw = bkg->GetBinWidth(b);
       bkg->SetBinContent(b,bkg->GetBinContent(b)*bw);
       for (int j=1;j<=nbins;j++){
       	covar->SetBinContent(b,j,covar->GetBinContent(b,j)*bw*bw);
       }
      }
     }

     RooArgList xlist_;
     RooArgList olist_;
     RooArgList mu_;

     bkg->Print() ;
     covar->Print() ; 
     signal->Print() ;
     data->Print() ;  

     // Make a dataset (simultaneous)
     RooCategory sampleType("bin_number","Bin Number");
     RooRealVar  observation("observed","Observed Events bin",1);

     // You have to define the samples types first!, because RooFit suuuuucks!
     for (int b=1;b<=nbins;b++){
        sampleType.defineType(Form("%d",b-1),b-1);
        sampleType.setIndex(b-1);
     }

     RooArgSet   obsargset(observation,sampleType);
     RooDataSet obsdata("combinedData","Data in all Bins",obsargset);
     //obsdata.add(RooArgSet(observation,sampleType));

     for (int b=1;b<=nbins;b++){
        observation.setVal(data->GetBinContent(b));
        sampleType.setIndex(b-1);
        std::cout << sampleType.getLabel() << ", " << sampleType.getIndex() << std::endl;
        //RooArgSet localset(observation,sampleType);
   	//obsdata.add(localset);
        obsdata.add(RooArgSet(observation,sampleType));
	std::cout << " Observed at " << b << ", " << observation.getVal() << std::endl;
     }

     // make a constraint term for the background, and a RooRealVar for bkg 
     for (int b=1;b<=nbins;b++){
	double bkgy = (double)bkg->GetBinContent(b);
	RooRealVar *mean_ = new RooRealVar(Form("exp_bin_%d_In",b),Form("expected bin %d",b),bkgy); 
	mean_->setConstant(true);
	RooRealVar *x_ = new RooRealVar(Form("exp_bin_%d",b),Form("bkg bin %d",b),bkgy,0.2*bkgy,bkgy*4);
	std::cout << " Exp background At " << b << ", " << x_->getVal() << std::endl;
	xlist_.add(*x_);
	mu_.add(*mean_);
     }      

     // constraint PDF for background
     // Convert TH2 -> TMatrix 
     TMatrixDSym Tcovar(nbins);
     for (int i=0;i<nbins;i++){
      for (int j=0;j<nbins;j++){
	//if (i==j)Tcovar[i][j] = covar->GetBinContent(i+1,j+1);
	//else Tcovar[i][j] = 0;
	Tcovar[i][j] = covar->GetBinContent(i+1,j+1);
      }
     }
     std::cout<< "Made Covariance" << std::endl;
     RooMultiVarGaussian constraint_pdf("constraint_pdf","Constraint for background pdf",xlist_,mu_,Tcovar);
     std::cout<< "Made Covariance Gauss" << std::endl;
     
     // Make the signal component 
     RooRealVar r("r","r",1,-5,5);
     RooArgList signals_;
     for (int b=1;b<=nbins;b++) {
	RooProduct *sigF = new RooProduct(Form("signal_%d",b),"signal nominal",RooArgSet(r,RooFit::RooConst(signal->GetBinContent(b))));
	std::cout << " Signal At " << b << ", " << sigF->getVal() << std::endl;
	signals_.add(*sigF);
     }

     RooArgList plist_;
     RooArgList slist_;
 
     sampleType.setIndex(1); 
     RooSimultaneous combined_pdf("combined_pdf","combined_pdf",sampleType);
     for (int b=1;b<=nbins;b++){
       RooAddition *sum = new RooAddition(Form("splusb_bin_%d",b),Form("Signal plus background in bin %d",b),RooArgList(*((RooRealVar*)(signals_.at(b-1))),*((RooRealVar*)(xlist_.at(b-1)))));
       RooPoisson  *pois = new RooPoisson(Form("pdf_bin_%d",b),Form("Poisson in bin %d",b),observation,(*sum)); 
       // Who cares about poissons?
       //RooGaussian *pois = new RooGaussian(Form("pdf_bin_%d",b),Form("Poisson in bin %d",b),observation,(*sum),RooFit::RooConst(TMath::Sqrt(sum->getVal())));
       combined_pdf.addPdf(*pois,Form("%d",b-1));
       slist_.add(*sum);
       plist_.add(*pois);
     }
     combined_pdf.Print("v");
     obsdata.Print("v");
     // Make a prodpdf instread
     RooProdPdf combinedpdfprod("maybefinalpdf","finalpdf",RooArgList(combined_pdf,constraint_pdf));
     RooAbsReal *nll_ = combined_pdf.createNLL(obsdata,RooFit::ExternalConstraints(RooArgList(constraint_pdf)));
     //
     RooMinimizer m(*nll_);
     m.minimize("Minuit2","minimize");

     // constrained fit!
     r.setConstant(true);
     double nllMin = nll_->getVal();

     TFile *fout = new TFile("simple.root","RECREATE");
     TTree *tree = new TTree("limit","limit");

     float deltaNLL_;
     float r_;
     tree->Branch("r",&r_,"r/F");
     tree->Branch("deltaNLL",&deltaNLL_,"deltaNLL/F");

     RooMinimizer mc(*nll_);
     //combinedpdfprod.fitTo(obsdata);
     //
     for(float rv=-2;rv<=2;rv+=0.2){
	r.setVal(rv);
	r_=rv;
	mc.minimize("Minuit2","minimize");
	deltaNLL_ = nll_->getVal() - nllMin; 
	tree->Fill();
     }

     fout->cd();
     tree->Write();
     fout->Close();
     /*
     RooAbsReal *nll_ = combinedpdfprod.createNLL(obsdata);
     nll_->Print("v");
     // Minimize
     RooMinimizer m(*nll_);
     r.setConstant(true);
     std::cout << combinedpdfprod.getVal() << std::endl;
     std::cout << constraint_pdf.getVal() << std::endl;
     //m.Print();
     m.minimize("Minuit2","minimize");
     */
}