Example #1
0
int main(int argc, char* argv[]){
  if (argc != 3 && argc != 1) return 0;

  TH1::AddDirectory(false);
  gROOT->ProcessLine(".x /user2/sfarry/WJet/root/lhcbStyle.C");

  if (argc == 1){
    TFile* file0 = TFile::Open("root://hepgrid11.ph.liv.ac.uk///dpm/ph.liv.ac.uk/home/lhcb/electroweak/zmumu.pythia.root");
    TTree* t = (TTree*)file0->Get("Zjet");
    TObjArray* hists = get_mass_v_vars(t);
    TFile* f = new TFile("output.root","RECREATE");
    hists->Write();
    f->Close();

  }
  else if (argc == 3){
    char* input = argv[1];
    char* output = argv[2];
    TFile* f = TFile::Open(input, "READ");
    TTree* t = (TTree*)f->Get("Zjet");
  
    TObjArray *hists = 0;
    if ( t ) {
      hists = get_mass_v_vars(t);
    }
    if (hists){
      TFile* g = TFile::Open(output, "RECREATE");
      hists->Write();
      g->Close();
    }
  }
  return 0;
}
Example #2
0
/* *************************************************************************** *
 *                                                                             *
 * Format:                                                                     *
 *                                                                             *
 * Save into a format to be used in main code                                  *
 *                                                                             *
 * *************************************************************************** */
void GeomAcc::Format(TString saveName, TString pol){

  TString plotName;
  if(pol == "NoPol/") plotName = "GeoEff";
  else if (pol == "Long/") plotName = "GeoLongEff";
  else if (pol == "Trans/") plotName = "GeoTransEff"; 

  TFile *f1 = TFile::Open("Output/" + saveName);
  TH2D *GeoEff2 = (TH2D*) f1->Get(plotName);
  GeoEff2->SetName("Geometric Acceptance");

  //
  //hack to use existing description plot
  //

  TFile *f2 = TFile::Open("Description/" + saveName);
  TH1 * Descrip = (TH1*) f2->Get("Description");

  TObjArray * histList = new TObjArray(0);
  histList->Add(GeoEff2);
  histList->Add(Descrip);

  TFile* saveFile = new TFile("Efficiency/"+ pol+ saveName, "recreate");
  histList->Write();
  saveFile->Close();
 

  return;
}
Example #3
0
void DrawGlobal(TObjArray List,TFile *in, TFile *out){
  TObjArray List;

  TCanvas *MeanTk = new TCanvas("MeanTk","MeanTk",10,10,900,500);

  TIFTree->Project("h0","Tracks.MeanTrack:number","Clusters.entries_all>2000");
  
  h0->SetTitle("Number of Events with at least on Track/Total number of Events");
  h0->GetXaxis()->SetTitle("Run Number");
  h0->GetXaxis()->CenterTitle(1);
  h0->GetYaxis()->SetTitle("Fraction of Events with nTracks non zero");
  h0->GetYaxis()->CenterTitle(1); 
  h0->SetMarkerStyle(20);
  h0->SetStats(0);
  h0->Draw();
  List.Add(MeanTk);

  TCanvas *Events = new TCanvas("Events","Events",10,10,900,500);

  TIFTree->Project("h3","Clusters.entries_all:number","Clusters.entries_all>2000");
  
  h3->SetTitle("Total Number of Events");
  h3->GetXaxis()->SetTitle("Run Number");
  h3->GetXaxis()->CenterTitle(1);
  h3->GetYaxis()->SetTitle("Events");
  h3->GetYaxis()->CenterTitle(1); 
  h3->SetMarkerStyle(20);
  h3->SetStats(0);
  h3->Draw();
  List.Add(Events);

  TCanvas *nTracks = new TCanvas("nTracks","nTracks",10,10,900,500);

  TIFTree->Project("h","Tracks.mean:number","Clusters.entries_all>2000");
  
  h->SetTitle("Mean Track number per Event");
  h->GetXaxis()->SetTitle("Run Number");
  h->GetXaxis()->CenterTitle(1);
  h->GetYaxis()->SetTitle("Mean Track number per Event");
  h->GetYaxis()->CenterTitle(1); 
  h->SetMarkerStyle(20);
  h->SetStats(0);
  h->Draw();
  List.Add(nTracks);
  
  TCanvas *nRecHits= new TCanvas("nRecHits","nRecHits",10,10,900,500);  
  TIFTree->Project("h1","RecHits.mean:number","Clusters.entries_all>2000");
  
  h1->SetTitle("Mean RecHits Number per Event");
  h1->GetXaxis()->SetTitle("Run Number");
  h1->GetXaxis()->CenterTitle(1);
  h1->GetYaxis()->SetTitle("Mean RecHits Number per Event");
  h1->GetYaxis()->CenterTitle(1); 
  h1->SetMarkerStyle(20);
  h1->SetStats(0);
  h1->Draw();
  List.Add(nRecHits);

  TCanvas *nCluster= new TCanvas("nClusters","nClusters",10,10,900,500);
  TIFTree->Project("h2","Clusters.mean_corr:number","Clusters.entries_all>2000");
  
  h2->SetTitle("Mean Number of Cluster per Event");
  h2->GetXaxis()->SetTitle("Run Number");
  h2->GetXaxis()->CenterTitle(1);
  h2->GetYaxis()->SetTitle("Mean Number of Cluster per Event");
  h2->GetYaxis()->CenterTitle(1); 
  h2->SetMarkerStyle(20);
  h2->SetStats(0);
  h2->Draw();
  List.Add(nClusters);

 out->cd();
 List.Write();
 // out->Close();

 in->cd();
}
Example #4
0
/*
vector<std::pair<double, double> > fit_mass(RooDataSet* ds, string oFile, string cut, string massvar = "Z0_M"){
  RooRealVar m( massvar.c_str(), massvar.c_str(), 60000., 120000. );
  RooPlot* plot = m.frame();

  // Breit Wigner - Z Lineshape
  RooRealVar m0( "m0", "m0", 0 );
  RooRealVar width( "width", "width", 1500, 0, 5000 );
  RooBreitWigner bw( "gauss", "gauss", m, m0, width );

  // Crystal-Ball - Detector response + FSR
  RooRealVar mean( "mean", "mean", 90300, 70000, 110000 );
  RooRealVar sigma( "sigma", "sigma", 500, 0, 5000);
  RooRealVar alpha( "alpha", "alpha", 2.2, 0.01, 5 );
  RooRealVar n( "n", "n", 0.48, 0.01, 80 );
  RooCBShape cb( "cb", "cb", m, mean, sigma, alpha, n );

  //exponential - DY component + background
  RooRealVar lambda("lambda", "slope", -2e-5, -30., 0.);
  RooExponential expo("expo", "exponential PDF", m, lambda);


  //Set cache for FFT convolution
  m.setBins(10000, "cache");
  m.setMin("cache", 50500);
  m.setMax("cache", 129500);

  //convolve PDFs
  RooFFTConvPdf pdf( "pdf", "pdf", m, cb, bw );

  //Background fraction
  RooRealVar b("b", "background", 0.7, 0, 1);

  RooAddPdf sum("sum", "crystal ball + gaussian + expo", RooArgList(pdf, expo), RooArgList(b));

  //sum.fitTo(*ds, RooFit::Extended());
  sum.fitTo(*ds);

  //Make mass plot
  TCanvas* canv = new TCanvas( "canv", "canv", 800.0, 600.0 );
  plot -> GetXaxis() -> SetTitle( "M_{#mu#mu} [GeV]" );
  plot -> GetYaxis() -> SetTitleOffset( 1.5 );
  ds->plotOn( plot );
  sum.plotOn(plot);

  //print chi2 on plot and add tpavetext
  ostringstream sstream;
  sstream<<"#chi^{2}/nDoF = "<<plot->chiSquare();
  TPaveText* p = new TPaveText(0.15, 0.7, 0.5, 0.9, "NDC");
  p->SetFillStyle(0);
  p->SetBorderSize(0.0);
  plot->addObject(p);
  p->AddText(cut.c_str());
  p->AddText(sstream.str().c_str());
  plot->Draw();
  p->Draw();
  canv->SaveAs( ("BWxCB_"+oFile+".pdf").c_str() );

  std::vector< std::pair<double, double> > parms;
  // return as pair with value and error of mean
  parms.push_back(std::pair<double, double>(mean.getVal()  , mean.getError()));
  parms.push_back(std::pair<double, double>(sigma.getVal() , sigma.getError()));
  return parms;

}


TObjArray* get_mass_v_vars(RooDataSet* dsUp, RooDataSet* dsDown){
  //mass variable
  RooRealVar m( "Z0_M", "Z0_M", 60000., 120000. );
  //other variables needed to make dataset
  int nvars = 4;
  string vars[] = { "muplus_ETA", "muminus_ETA", "muplus_PHI", "muminus_PHI"};
  double los[]  = { 2.0, 2.0, -TMath::Pi(), -TMath::Pi() };
  double his[]  = { 4.5, 4.5, TMath::Pi(), TMath::Pi()   };
  int binss[]   = { 10, 10, 10, 10 };

  TObjArray* hists = new TObjArray();

  //fit_mass(ds, "", "");

  for (int i = 0 ; i < nvars ; ++i){
    string var = vars[i] ;
    double lo  = los[i]  ;
    double hi  = his[i]  ;
    int bins   = binss[i];
    vector<RooDataSet*> magup_datasets   ;
    vector<RooDataSet*> magdown_datasets ;
    for (int i = 0 ; i < bins ; ++i) {
      ostringstream cutup, cutdown;
      double binlo = lo + i*((hi - lo)/bins);
      double binhi = lo + (i+1)*((hi-lo)/bins);
      cutup  <<var<<">"<<binlo<<" && "<<var<<"<"<<binhi;
      //add dataset with specific cuts
      magup_datasets.push_back((RooDataSet*)dsUp->reduce(cutup.str().c_str()));
      magdown_datasets.push_back((RooDataSet*)dsDown->reduce(cutup.str().c_str()));
      
    }
    //make mass histogram
    TH1F* magup_hist   = new TH1F(("mass_v_"+var+"_magup").c_str()   , ("mass_v_"+var+"_magup").c_str()   , bins, lo, hi);
    TH1F* magdown_hist = new TH1F(("mass_v_"+var+"_magdown").c_str() , ("mass_v_"+var+"_magdown").c_str() , bins, lo, hi);
    TH1F* magup_width   = new TH1F(("width_v_"+var+"_magup").c_str()   , ("width_v_"+var+"_magup").c_str()   , bins, lo, hi);
    TH1F* magdown_width = new TH1F(("width_v_"+var+"_magdown").c_str() , ("width_v_"+var+"_magdown").c_str() , bins, lo, hi);
    //calculate latex version of variable if possible
    string latexvar;
    if (var.find("ETA") != std::string::npos) latexvar = "#eta";
    else if (var.find("PHI") != std::string::npos ) latexvar = "#phi";
    else latexvar = var;
    for (int i = 0 ; i < bins ; ++i) {
      ostringstream s1, s2;
      s1<<var<<"_magup_"<<i;
      s2<<var<<"_magdown_"<<i;
      double binlo = lo + i*((hi - lo)/bins);
      double binhi = lo + (i+1)*((hi-lo)/bins);
      //cut to be presented on plot
      ostringstream label;
      label<<binlo<<" < "<<latexvar<<" < "<<binhi;
      std::vector<std::pair<double, double> > magup_result = fit_mass(magup_datasets.at(i), s1.str(), label.str());
      std::vector<std::pair<double, double> > magdown_result = fit_mass(magdown_datasets.at(i), s2.str(), label.str());
      magup_hist->SetBinContent(i+1, magup_result.at(0).first);
      magup_hist->SetBinError(i+1, magup_result.at(0).second);
      magdown_hist->SetBinContent(i+1, magdown_result.at(0).first);
      magdown_hist->SetBinError(i+1, magdown_result.at(0).second);

      magup_width->SetBinContent(i+1, magup_result.at(1).first);
      magup_width->SetBinError(i+1, magup_result.at(1).second);
      magdown_width->SetBinContent(i+1, magdown_result.at(1).first);
      magdown_width->SetBinError(i+1, magdown_result.at(1).second);
      
    }
    
    TCanvas* canv = new TCanvas( "canv", "canv", 800.0, 600.0 );
    magup_hist->SetXTitle(latexvar.c_str());
    magup_hist->SetYTitle("Fitted Z0 Mass");
    magdown_hist->SetMarkerColor(2);
    magdown_hist->SetMarkerStyle(2);
    magup_hist->Draw("e1");
    magdown_hist->Draw("e1same");
    canv->SaveAs(("mass_v_"+var+".pdf").c_str());

    hists->Add(magup_hist);
    hists->Add(magdown_hist);

    hists->Add(magup_width);
    hists->Add(magdown_width);
  }


  return hists;

}


TObjArray* get_mass_v_vars(TTree* t){

  TCut cut("muminus_PT > 20000 && muplus_PT > 20000 && muplus_ETA > 2.0 && muplus_ETA < 4.5 && muminus_ETA > 2.0 && muminus_ETA < 4.5 && Z0_M > 60000 && Z0_M < 120000");

  //mass variable
  RooRealVar m( "Z0_M", "Z0_M", 60000., 120000. );
  //other variables needed to make dataset
  RooRealVar pt1("muplus_PT"   , "muplus_PT"   , 20000, 1000000);
  RooRealVar pt2("muminus_PT"  , "muminus_PT"  , 20000, 1000000);
  RooRealVar eta1("muplus_ETA" , "muplus_ETA"  , 2, 4.5);
  RooRealVar eta2("muminus_ETA", "muminus_ETA" , 2, 4.5);
  RooRealVar phi1("muplus_PHI" , "muplus_PHI"  , -TMath::Pi(), TMath::Pi());
  RooRealVar phi2("muminus_PHI", "muminus_PHI" , -TMath::Pi(), TMath::Pi());
  RooRealVar polarity("Polarity", "Polarity", -2, 2);

  TFile f("temp.root","RECREATE");
  TTree* upTree   = (TTree*)t->CopyTree("Polarity > 0");
  TTree* downTree = (TTree*)t->CopyTree("Polarity < 0");

  

  cout<<"Number of entries in trees: "<<t->GetEntries()<<" "<<upTree->GetEntries()<<" "<<downTree->GetEntries()<<endl;

  RooDataSet* dsUp  = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*upTree), RooFit::Cut(cut.GetTitle()));
  RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*downTree), RooFit::Cut(cut.GetTitle()));
  cout<<"Number of entries in datasets: "<<dsUp->sumEntries()<<" "<<dsDwn->sumEntries()<<endl;
  TObjArray* hists = get_mass_v_vars(dsUp, dsDwn);
  return hists;

}
TObjArray* get_mass_v_vars(TTree* t, TTree* u){

  TCut cut("muminus_PT > 20000 && muplus_PT > 20000 && muplus_ETA > 2.0 && muplus_ETA < 4.5 && muminus_ETA > 2.0 && muminus_ETA < 4.5 && Z0_M > 60000 && Z0_M < 120000");

  //mass variable
  RooRealVar m( "Z0_M", "Z0_M", 60000., 120000. );
  //other variables needed to make dataset
  RooRealVar pt1("muplus_PT"   , "muplus_PT"   , 20000, 1000000);
  RooRealVar pt2("muminus_PT"  , "muminus_PT"  , 20000, 1000000);
  RooRealVar eta1("muplus_ETA" , "muplus_ETA"  , 2, 4.5);
  RooRealVar eta2("muminus_ETA", "muminus_ETA" , 2, 4.5);
  RooRealVar phi1("muplus_PHI" , "muplus_PHI"  , -TMath::Pi(), TMath::Pi());
  RooRealVar phi2("muminus_PHI", "muminus_PHI" , -TMath::Pi(), TMath::Pi());
  RooRealVar polarity("Polarity", "Polarity", -2, 2);

  RooDataSet* dsUp  = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*t), RooFit::Cut(cut.GetTitle()));
  RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2), RooFit::Import(*u), RooFit::Cut(cut.GetTitle()));
  cout<<"Number of entries in datasets: "<<dsUp->sumEntries()<<" "<<dsDwn->sumEntries()<<endl;
  TObjArray* hists = get_mass_v_vars(dsUp, dsDwn);
  return hists;

}
TObjArray* get_refit_mass_v_vars(RooDataSet* dsUp, RooDataSet* dsDown){

  //As previous function with refit
  //should be merged
  RooRealVar m( "Z0_Refit_M", "Z0_Refit_M", 60000., 120000. );
  RooRealVar eta1("muplus_Refit_ETA" , "muplus_Refit_ETA"  , 2, 4.5);
  RooRealVar eta2("muminus_Refit_ETA", "muminus_Refit_ETA" , 2, 4.5);
  RooRealVar phi1("muplus_Refit_PHI" , "muplus_Refit_PHI"  , -TMath::Pi(), TMath::Pi());
  RooRealVar phi2("muminus_Refit_PHI", "muminus_Refit_PHI" , -TMath::Pi(), TMath::Pi());

  int nvars = 4;
  string vars[] = {"muplus_Refit_ETA", "muminus_Refit_ETA", "muplus_Refit_PHI", "muminus_Refit_PHI"};
  double los[] = {2.0, 2.0, -TMath::Pi(), -TMath::Pi()};
  double his[] = {4.5, 4.5, TMath::Pi(), TMath::Pi()};
  int binss[] = {10, 10, 10, 10};

  TObjArray* hists = new TObjArray();

  for (int i = 0 ; i < nvars ; ++i){
    string var = vars[i];
    double lo  = los[i];
    double hi  = his[i];
    int bins   = binss[i];
    vector<RooDataSet*> magup_datasets;
    vector<RooDataSet*> magdown_datasets;
    for (int i = 0 ; i < bins ; ++i) {
      ostringstream cutup, cutdown;
      double binlo = lo + i*((hi - lo)/bins);
      double binhi = lo + (i+1)*((hi-lo)/bins);
      cutup  <<var<<">"<<binlo<<" && "<<var<<"<"<<binhi ;
      cutdown<<var<<">"<<binlo<<" && "<<var<<"<"<<binhi;
      //add dataset with specific cuts
      magup_datasets.push_back((RooDataSet*)dsUp->reduce(cutup.str().c_str()));
      magdown_datasets.push_back((RooDataSet*)dsDown->reduce(cutdown.str().c_str()));
      
    }

    TH1F* magup_hist   = new TH1F(("mass_v_"+var+"_refit_magup").c_str()  , ("mass_v_"+var+"_refit_magup").c_str(), bins, lo, hi);
    TH1F* magdown_hist = new TH1F(("mass_v_"+var+"_refit_magdown").c_str(), ("mass_v_"+var+"_refit_magdown").c_str(), bins, lo, hi);

    TH1F* magup_width   = new TH1F(("width_v_"+var+"_refit_magup").c_str()   , ("width_v_"+var+"_refit_magup").c_str()   , bins, lo, hi);
    TH1F* magdown_width = new TH1F(("width_v_"+var+"_refit_magdown").c_str() , ("width_v_"+var+"_refit_magdown").c_str() , bins, lo, hi);

    string latexvar;
    if (var.find("ETA") != std::string::npos) latexvar = "#eta";
    else if (var.find("PHI") != std::string::npos ) latexvar = "#phi";
    else latexvar = var;
    for (int i = 0 ; i < bins ; ++i) {

      ostringstream s1, s2;
      s1<<var<<"_refit_magup_"<<i;
      s2<<var<<"_refit_magdown_"<<i;
      double binlo = lo + i*((hi - lo)/bins);
      double binhi = lo + (i+1)*((hi-lo)/bins);
      //cut to be presented on plot
      ostringstream label;
      label<<binlo<<" < "<<latexvar<<" < "<<binhi;
      std::vector< std::pair<double, double> > magup_result = fit_mass(magup_datasets.at(i), s1.str(), label.str(), "Z0_Refit_M");
      std::vector< std::pair<double, double> > magdown_result = fit_mass(magdown_datasets.at(i), s1.str(), label.str(), "Z0_Refit_M");
      magup_hist->SetBinContent   (i+1, magup_result.at(0).first);
      magup_hist->SetBinError     (i+1, magup_result.at(0).second);
      magdown_hist->SetBinContent (i+1, magdown_result.at(0).first);
      magdown_hist->SetBinError   (i+1, magdown_result.at(0).second);

      magup_width->SetBinContent  (i+1, magup_result.at(1).first);
      magup_width->SetBinError    (i+1, magup_result.at(1).second);
      magdown_width->SetBinContent(i+1, magdown_result.at(1).first);
      magdown_width->SetBinError  (i+1, magdown_result.at(1).second);

    }
    
    TCanvas* canv = new TCanvas( "canv", "canv", 800.0, 600.0 );
    magup_hist->SetXTitle(latexvar.c_str());
    magup_hist->SetYTitle("Fitted Z0 Mass");
    magdown_hist->SetLineColor(2);
    magdown_hist->SetMarkerColor(2);
    magdown_hist->SetMarkerStyle(20);
    magup_hist->Draw("e1");
    magdown_hist->Draw("e1same");
    canv->SaveAs(("mass_v_"+var+"_refit.pdf").c_str());
    hists->Add(magup_hist);
    hists->Add(magdown_hist);
    hists->Add(magup_width);
    hists->Add(magdown_width);
  }

  return hists;

}



TObjArray* get_refit_mass_v_vars(TTree* t){

  // As previous function with refit
  // should be merged

  TCut cut("muminus_Refit_PT > 20000 && muplus_Refit_PT > 20000 && muplus_Refit_ETA > 2.0 && muplus_Refit_ETA < 4.5 && muminus_Refit_ETA > 2.0 && muminus_Refit_ETA < 4.5 && Z0_Refit_M > 60000 && Z0_Refit_M < 120000");

  RooRealVar m( "Z0_Refit_M", "Z0_Refit_M", 60000., 120000. );

  RooRealVar pt1("muplus_Refit_PT"   , "muplus_Refit_PT"   , 20000, 1000000);
  RooRealVar pt2("muminus_Refit_PT"  , "muminus_Refit_PT"  , 20000, 1000000);
  RooRealVar eta1("muplus_Refit_ETA" , "muplus_Refit_ETA"  , 2, 4.5);
  RooRealVar eta2("muminus_Refit_ETA", "muminus_Refit_ETA" , 2, 4.5);
  RooRealVar phi1("muplus_Refit_PHI" , "muplus_Refit_PHI"  , -TMath::Pi(), TMath::Pi());
  RooRealVar phi2("muminus_Refit_PHI", "muminus_Refit_PHI" , -TMath::Pi(), TMath::Pi());
  RooRealVar polarity("Polarity", "Polarity", -2, 2);

  TFile* g = new TFile("temp.root", "RECREATE");
  TTree* upTree  = (TTree*)t->CopyTree("Polarity > 0");
  TTree* dwnTree = (TTree*)t->CopyTree("Polarity < 0");


  RooDataSet* dsUp = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*upTree), RooFit::Cut(cut.GetTitle()));
  RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*dwnTree), RooFit::Cut(cut.GetTitle()));


  return get_refit_mass_v_vars(dsUp, dsDwn);
}

TObjArray* get_refit_mass_v_vars(TTree* t, TTree* u){

  // As previous function with refit
  // should be merged

  TCut cut("muminus_Refit_PT > 20000 && muplus_Refit_PT > 20000 && muplus_Refit_ETA > 2.0 && muplus_Refit_ETA < 4.5 && muminus_Refit_ETA > 2.0 && muminus_Refit_ETA < 4.5 && Z0_Refit_M > 60000 && Z0_Refit_M < 120000");

  RooRealVar m( "Z0_Refit_M", "Z0_Refit_M", 60000., 120000. );

  RooRealVar pt1("muplus_Refit_PT"   , "muplus_Refit_PT"   , 20000, 1000000);
  RooRealVar pt2("muminus_Refit_PT"  , "muminus_Refit_PT"  , 20000, 1000000);
  RooRealVar eta1("muplus_Refit_ETA" , "muplus_Refit_ETA"  , 2, 4.5);
  RooRealVar eta2("muminus_Refit_ETA", "muminus_Refit_ETA" , 2, 4.5);
  RooRealVar phi1("muplus_Refit_PHI" , "muplus_Refit_PHI"  , -TMath::Pi(), TMath::Pi());
  RooRealVar phi2("muminus_Refit_PHI", "muminus_Refit_PHI" , -TMath::Pi(), TMath::Pi());
  RooRealVar polarity("Polarity", "Polarity", -2, 2);

  RooDataSet* dsUp = new RooDataSet("dsUp", "dsUp", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*t), RooFit::Cut(cut.GetTitle()));
  RooDataSet* dsDwn = new RooDataSet("dsDwn", "dsDwn", RooArgSet(m, pt1, pt2, eta1, eta2, phi1, phi2, polarity), RooFit::Import(*u), RooFit::Cut(cut.GetTitle()));

  return get_refit_mass_v_vars(dsUp, dsDwn);
}

int main(int argc, char* argv[]){
  if (argc != 3 && argc != 1 && argc != 4) return 0;
  



  TH1::AddDirectory(false);
  gROOT->ProcessLine(".x /user2/sfarry/WJet/root/lhcbStyle.C");

  if (argc == 1){
    TFile* file0 = TFile::Open("root://hepgrid11.ph.liv.ac.uk///dpm/ph.liv.ac.uk/home/lhcb/refit/ZMuMu.Refit.2015.root");
    TTree* t = (TTree*)file0->Get("ZMuMu/DecayTree");
    TObjArray* hists = get_mass_v_vars(t);
    TObjArray* refit_hists = get_refit_mass_v_vars(t);
    TFile* f = new TFile("test.root","RECREATE");
    hists->Write();
    refit_hists->Write();
    f->Close();

  }
  else if (argc == 3){
    char* input = argv[1];
    char* output = argv[2];
    TFile* f = TFile::Open(input, "READ");
    RooDataSet* dsUp = (RooDataSet*)f->Get("dataup");
    RooDataSet* dsDown = (RooDataSet*)f->Get("datadown");
    TTree* t = (TTree*)f->Get("ZMuMu/DecayTree");
    TObjArray* branches = t->GetListOfBranches();
    bool has_refit = false;
    for (int i = 0 ; i < branches->GetEntries() ; ++i){
      TBranch* branch = (TBranch*)branches->At(i);
      string name = branch->GetName();
      //if (strncmp((name, "boson", 5) == 0){
      if (name.find("boson") == 0){
	std::string replace = name.replace(0, 5, "Z0");
	branch->SetNameTitle(replace.c_str(), replace.c_str());
      }
      if (name.find("Refit") != std::string::npos) has_refit = true;

    }
  
    TObjArray *hists = 0;
    TObjArray *refit_hists = 0;
    if ( dsUp && dsDown ) {
      hists = get_mass_v_vars(dsUp, dsDown);
      refit_hists = get_refit_mass_v_vars(dsUp, dsDown);
    }
    else if ( t ) {
      hists = get_mass_v_vars(t);
      if (has_refit) refit_hists = get_refit_mass_v_vars(t);
    }
    if (hists){
      TFile* g = TFile::Open(output, "RECREATE");
      hists->Write();
      if (refit_hists) refit_hists->Write();
      g->Close();
    }
  }
  else if (argc == 4){
    char* inputUp   = argv[1];
    char* inputDown = argv[2];
    char* output    = argv[3];
    TFile* f = TFile::Open(inputUp, "READ");
    TFile* g = TFile::Open(inputDown, "READ");
    TTree* t = (TTree*)f->Get("ZMuMu/DecayTree");
    TTree* u = (TTree*)g->Get("ZMuMu/DecayTree");

    cout<<t<<" "<<u<<endl;

    cout<<"okay so far"<<endl;

    TObjArray* branches = t->GetListOfBranches();
    cout<<"got list of branches"<<endl;
    bool has_refit = false;
    for (int i = 0 ; i < branches->GetEntries() ; ++i){
      TBranch* branch = (TBranch*)branches->At(i);
      string name = branch->GetName();
      //if (strncmp((name, "boson", 5) == 0){
      if (name.find("boson") == 0){
	std::string replace = name.replace(0, 5, "Z0");
	branch->SetNameTitle(replace.c_str(), replace.c_str());
      }
      if (name.find("Refit") != std::string::npos) has_refit = true;

    }
    branches = u->GetListOfBranches();
    for (int i = 0 ; i < branches->GetEntries() ; ++i){
      TBranch* branch = (TBranch*)branches->At(i);
      string name = branch->GetName();
      //if (strncmp((name, "boson", 5) == 0){
      if (name.find("boson") == 0){
	std::string replace = name.replace(0, 5, "Z0");
	branch->SetNameTitle(replace.c_str(), replace.c_str());
      }
      if (name.find("Refit") != std::string::npos) has_refit = true;

    }

    cout<<"renamed branches"<<endl;
  
    TObjArray *hists = 0;
    TObjArray *refit_hists = 0;
    if ( t && u ) {
      hists = get_mass_v_vars(t, u);
      if (has_refit) refit_hists = get_refit_mass_v_vars(t, u);
    }
    if (hists){
      TFile* g = TFile::Open(output, "RECREATE");
      hists->Write();
      if (refit_hists) refit_hists->Write();
      g->Close();
    }
  }
  return 0;
}
*/
int main(int argc, char* argv[]){
  if (argc != 3 && argc != 1 && argc != 4) return 0;
  

  TH1::AddDirectory(false);
  gROOT->ProcessLine(".x /user2/sfarry/Analyses/WJet/root/lhcbStyle.C");

  Fitter z0_2015;
  z0_2015.fitvar="Z0_M";
  z0_2015.fitmodel = Fitter::z0;
  z0_2015.lo = 60000.;
  z0_2015.hi = 120000;
  z0_2015.vars    = {"muplus_ETA", "muminus_ETA", "muplus_PHI", "muminus_PHI"};
  z0_2015.los     =  {2.0, 2.0, -TMath::Pi(), -TMath::Pi() };
  z0_2015.his     =  {4.5, 4.5,  TMath::Pi(),  TMath::Pi() };
  z0_2015.bins    = { 10, 10, 10, 10 };
  z0_2015.vars2d  = { {"muplus_ETA", "muplus_PHI"}, {"muminus_ETA", "muminus_PHI"} };
  z0_2015.los2d   =  { {2.0, -TMath::Pi()}, {2.0, -TMath::Pi()} };
  z0_2015.his2d   =  { {4.5,  TMath::Pi()}, {4.5,  TMath::Pi()} };
  z0_2015.bins2d  = { {5, 5}, {5, 5} };

  Fitter z0_2015_refit;
  z0_2015_refit.fitvar="Z0_Refit_M";
  z0_2015_refit.fitmodel = Fitter::z0;
  z0_2015_refit.lo = 60000.;
  z0_2015_refit.hi = 120000;
  z0_2015_refit.vars   = {"muplus_Refit_ETA", "muminus_Refit_ETA", "muplus_Refit_PHI", "muminus_Refit_PHI"};
  z0_2015_refit.los    = {2.0, 2.0, -TMath::Pi(), -TMath::Pi()};
  z0_2015_refit.his    = {4.5, 4.5,  TMath::Pi(),  TMath::Pi()};
  z0_2015_refit.bins   = {10, 10, 10, 10};
  z0_2015_refit.vars2d = { {"muplus_Refit_ETA", "muplus_Refit_PHI"}, {"muminus_Refit_ETA", "muminus_Refit_PHI"} };
  z0_2015_refit.los2d  = { {2.0, -TMath::Pi()}, {2.0, -TMath::Pi()} };
  z0_2015_refit.his2d  = { {4.5,  TMath::Pi()}, {4.5,  TMath::Pi()} };
  z0_2015_refit.bins2d = { {5, 5}, {5, 5} };

  string input = "root://hepgrid11.ph.liv.ac.uk///dpm/ph.liv.ac.uk/home/lhcb/refit/ZMuMu.Refit.2015.root";
  string output = "output.root";

  if (argc > 1){
    input = argv[1];
  }
  if (argc > 2){
    output = argv[2];
  }


  TFile* f = TFile::Open(input.c_str(), "READ");
  RooDataSet* dsUp   = (RooDataSet*)f->Get("dsUp");
  RooDataSet* dsDown = (RooDataSet*)f->Get("dsDown");
  RooDataSet* dsUp_Refit   = (RooDataSet*)f->Get("dsUp_Refit");
  RooDataSet* dsDown_Refit = (RooDataSet*)f->Get("dsDown_Refit");
  TObjArray *hists = 0;
  TObjArray *refit_hists = 0;
  if ( dsUp && dsDown && dsUp_Refit && dsDown_Refit ) {
    hists = z0_2015.get_mass_v_vars(dsUp);
    refit_hists = z0_2015_refit.get_mass_v_vars(dsUp_Refit);
  }
  if (hists){
    TFile* g = TFile::Open(output.c_str(), "RECREATE");
    hists->Write();
    if (refit_hists) refit_hists->Write();
    g->Close();
  }
  
  return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------
void ComparisonDataMC(TString fileNameData = "Data/efficiency_new.root", TString fileNameSim ="MonteCarlo/efficiency_new.root", Bool_t integrated = kFALSE)
{
  // Open input Data files
  TFile *fileData = new TFile(fileNameData.Data(), "read");
  if (!fileData || !fileData->IsOpen()) {
    printf("cannot open file %s \n",fileNameData.Data());
    return;
  }
  // Open input Sim files
  TFile *fileSim = new TFile(fileNameSim.Data(), "read");
  if (!fileSim || !fileSim->IsOpen()) {
    printf("cannot open file %s \n",fileNameSim.Data());
    return;
  }
  
  TString hname = integrated ? "integratedTracking" : "tracking";
  
  // Get Global Data and Sim graphs
  
//  TGraphAsymmErrors *effVScentData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny("trackingEffVscentrality"));
//  if (!effVScentData) {
//    printf("Efficiency vs centrality from data not found\n");
//    return;
//  }
//  TGraphAsymmErrors *effVScentSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny("trackingEffVscentrality"));
//  if (!effVScentSim) {
//    printf("Efficiency vs centrality from sim not found\n");
//    return;
//  }
  
  TGraphAsymmErrors *effVSrunData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny("trackingEffVsRun"));
  if (!effVSrunData) {
    printf("Efficiency vs run from data not found\n");
    return;
  }
  TGraphAsymmErrors *effVSrunSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny("trackingEffVsRun"));
  if (!effVSrunSim) {
    printf("Efficiency vs run from sim not found\n");
    return;
  }
  
  
  TGraphAsymmErrors *effVSyData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny(Form("%sEffVsy",hname.Data())));
  if (!effVSyData) {
    printf("Efficiency vs rapidity from data not found\n");
    return;
  }
  TGraphAsymmErrors *effVSySim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny(Form("%sEffVsy",hname.Data())));
  if (!effVSySim) {
    printf("Efficiency vs rapidity from sim not found\n");
    return;
  }

  
  TGraphAsymmErrors *effVSptData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny(Form("%sEffVspt",hname.Data())));
  if (!effVSptData) {
    printf("Efficiency vs pt from data not found\n");
    return;
  }
  TGraphAsymmErrors *effVSptSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny(Form("%sEffVspt",hname.Data())));
  if (!effVSptSim) {
    printf("Efficiency vs pt from sim not found\n");
    return;
  }
  
  TGraphAsymmErrors *effVSphiData = static_cast<TGraphAsymmErrors*>(fileData->FindObjectAny(Form("%sEffVsphi",hname.Data())));
  if (!effVSphiData) {
    printf("Efficiency vs phi from data not found\n");
    return;
  }
  TGraphAsymmErrors *effVSphiSim = static_cast<TGraphAsymmErrors*>(fileSim->FindObjectAny(Form("%sEffVsphi",hname.Data())));
  if (!effVSphiSim) {
    printf("Efficiency vs phi from sim not found\n");
    return;
  }
  
  // Create an array list with the global ratios
  TObjArray globalRatios;
  
  // Create an array with the global plots of the individual efficencies and the ratios
  TObjArray globalRatiosAndEff;
  
//  globalRatios.Add(CreateRatioGraph("RatioEffVsCent","data/sim tracking efficiency versus centrality",effVScentData,effVScentSim));
  
  //---- Eff vs run
  TGraphAsymmErrors* effVSrunDataCopy = static_cast<TGraphAsymmErrors*>(effVSrunData->Clone()); // We make clones to do not modify them
  TGraphAsymmErrors* effVSrunSimCopy = static_cast<TGraphAsymmErrors*>(effVSrunSim->Clone());
  
  TGraphAsymmErrors *ratioRun = CreateRatioGraph("RatioEffVsRun","data/sim tracking efficiency versus run",*effVSrunData,*effVSrunSim);
  globalRatios.Add(ratioRun);
  
  TGraphAsymmErrors* ratioRunCopy = static_cast<TGraphAsymmErrors*>(ratioRun->Clone());
  
  globalRatiosAndEff.Add(DrawRatio("RatioEffVSRunAndEff","Comparison Data&MC tracking efficiency versus run", effVSrunDataCopy,effVSrunSimCopy,ratioRunCopy));
  //-----
  
  //---- Eff vs y
  TGraphAsymmErrors* effVSyDataCopy = static_cast<TGraphAsymmErrors*>(effVSyData->Clone()); // We make clones to do not modify them
  TGraphAsymmErrors* effVSySimCopy = static_cast<TGraphAsymmErrors*>(effVSySim->Clone());
  
  TGraphAsymmErrors *ratioY = CreateRatioGraph("RatioEffVsY","data/sim tracking efficiency versus rapidity",*effVSyData,*effVSySim);
  globalRatios.Add(ratioY);
  
  TGraphAsymmErrors* ratioYCopy = static_cast<TGraphAsymmErrors*>(ratioY->Clone());
 
  globalRatiosAndEff.Add(DrawRatio("RatioEffVSyAndEff","Comparison Data&MC tracking efficiency versus rapidity", effVSyDataCopy,effVSySimCopy,ratioYCopy));
  //-----

  //-----Eff vs Pt
  TGraphAsymmErrors* effVSptDataCopy = static_cast<TGraphAsymmErrors*>(effVSptData->Clone()); // We make clones to do not modify them
  TGraphAsymmErrors* effVSptSimCopy = static_cast<TGraphAsymmErrors*>(effVSptSim->Clone());

  TGraphAsymmErrors *ratioPt = CreateRatioGraph("RatioEffVsPt","data/sim tracking efficiency versus Pt",*effVSptData,*effVSptSim);
  globalRatios.Add(ratioPt);
  
  TGraphAsymmErrors* ratioPtCopy = static_cast<TGraphAsymmErrors*>(ratioPt->Clone());
  
   globalRatiosAndEff.Add(DrawRatio("RatioEffVSptAndEff","Comparison Data&MC tracking efficiency versus Pt",effVSptDataCopy,effVSptSimCopy,ratioPtCopy));
  //-----
  
  //----Eff vs phi
  TGraphAsymmErrors* effVSphiDataCopy = static_cast<TGraphAsymmErrors*>(effVSphiData->Clone()); // We make clones to do not modify them
  TGraphAsymmErrors* effVSphiSimCopy = static_cast<TGraphAsymmErrors*>(effVSphiSim->Clone());
  
  TGraphAsymmErrors *ratioPhi = CreateRatioGraph("RatioEffVsPhi","data/sim tracking efficiency versus phi",*effVSphiData,*effVSphiSim);
  globalRatios.Add(ratioPhi);
  
  TGraphAsymmErrors* ratioPhiCopy = static_cast<TGraphAsymmErrors*>(ratioPhi->Clone());
  
  globalRatiosAndEff.Add(DrawRatio("RatioEffVSphiAndEff","Comparison Data&MC tracking efficiency versus phi",effVSphiDataCopy,effVSphiSimCopy,ratioPhiCopy));
  //-------
  
  //----Eff vs y vs phi

  TH2F *effVSyVSphiData = static_cast<TH2F*>(fileData->FindObjectAny("trackingEffVsphi-y"));
  if (!effVSyVSphiData) {
    printf("Efficiency vs rapidity vs phi from data not found\n");
    return;
  }
  TH2F *effVSyVSphiSim = static_cast<TH2F*>(fileSim->FindObjectAny("trackingEffVsphi-y"));
  if (!effVSyVSphiSim) {
    printf("Efficiency vs rapidity vs phi from sim not found\n");
    return;
  }
  Int_t nBins2dX = effVSyVSphiData->GetXaxis()->GetNbins();
  Int_t nBins2dY = effVSyVSphiData->GetYaxis()->GetNbins();
  Double_t effData2D,effSim2D,ratio2D;
  
  TH2F *effVSphiVSyRatio = new TH2F("RatioEffVSphiVSy","EffData/EffSim vs phi vs y",nBins2dX, effVSyVSphiData->GetXaxis()->GetBinLowEdge(1), effVSyVSphiData->GetXaxis()->GetBinUpEdge(nBins2dX),nBins2dY, effVSyVSphiData->GetYaxis()->GetBinLowEdge(1), effVSyVSphiData->GetYaxis()->GetBinUpEdge(nBins2dY));
  effVSphiVSyRatio->GetXaxis()->SetTitle("phi");
  effVSphiVSyRatio->GetYaxis()->SetTitle("y");
    
  for (Int_t i = 1 ; i <= nBins2dX ; i++ )
  {
    for (Int_t j = 1 ; j <= nBins2dY ; j++ )
    {
      effData2D = effVSyVSphiData->GetBinContent(i,j);
      effSim2D = effVSyVSphiSim->GetBinContent(i,j);

      if (effData2D > 0. && effSim2D > 0.)
      {
        ratio2D = effData2D/effSim2D;
//        ratio2DErrh = rat*TMath::Sqrt(effDErrh*effDErrh/effD*effD + effSErrl*effSErrl/effS*effS);
//        ratio2DErrl = rat*TMath::Sqrt(effDErrl*effDErrl/effD*effD + effSErrh*effSErrh/effS*effS);
      }
      if (effData2D == 0 && effSim2D == 0)
      {
        ratio2D = 1.;
//        ratio2DErrh = 0.;
//        ratio2DErrl = 0.;
      }
      if (effData2D == 0 && effSim2D > 0.)
      {
        ratio2D = 0.;
//        ratio2DErrh = 0.;
//        ratio2DErrl = 0.;
      }
      if (effData2D > 0. && effSim2D == 0)
      {
        ratio2D = 2.;
//        ratio2DErrh = 0.;
//        ratio2DErrl = 0.;
      }
      effVSphiVSyRatio->SetBinContent(i,j,ratio2D);
    }
  }
  
  
  TH2F *effVSphiVSyRatioRapBins = new TH2F();
  effVSphiVSyRatioRapBins->GetXaxis()->SetTitle("phi");
  effVSphiVSyRatioRapBins->GetYaxis()->SetTitle("y");
  effVSphiVSyRatioRapBins->SetName("RatioEffVSphiVSyRapBins");
  effVSphiVSyRatioRapBins->SetTitle("EffData/EffSim vs phi vs y");

  
  Int_t nxBins = effVSphiVSyRatio->GetXaxis()->GetNbins();
  Int_t nyBins = effVSphiVSyRatio->GetYaxis()->GetNbins();
  
  Double_t xBinEdge[nxBins+1];
  Double_t yBinEdge[nyBins+1];
  
  for (Int_t ybin = 0 ; ybin <= nyBins ; ybin++)
  {
    yBinEdge[ybin] = 2*TMath::ATan(TMath::Exp((effVSphiVSyRatio->GetYaxis()->GetBinLowEdge(ybin+1))));
  }
  for (Int_t xbin = 0 ; xbin <= nxBins ; xbin++)
  {
    xBinEdge[xbin] = effVSphiVSyRatio->GetXaxis()->GetBinLowEdge(xbin+1);
  }
  
  effVSphiVSyRatioRapBins->SetBins(nxBins,xBinEdge,nyBins,yBinEdge);
  
  for (Int_t xbin = 1 ; xbin <= nxBins ; xbin++)
  {
    for (Int_t ybin = 1 ; ybin <= nyBins ; ybin++)
    {
      effVSphiVSyRatioRapBins->SetBinContent(xbin,ybin,effVSphiVSyRatio->GetBinContent(xbin,ybin));
    }
  }
  globalRatiosAndEff.Add(effVSphiVSyRatio);
  globalRatiosAndEff.Add(effVSphiVSyRatioRapBins);

 
  //--------
  
  TString hname2 = integrated ? "IntegratedChamber" : "Chamber";
  
  // Get Chamber and DE Data and Sim graphs
//  TObjArray *listChEffVSrunData = static_cast<TObjArray*>(fileData->FindObjectAny("ChambersEffVSrun"));
//  if (!listChEffVSrunData) {
//    printf("list of Chamber efficiencies vs run from data not found\n");
//    return;
//  }
//  TObjArray *listChEffVSrunSim = static_cast<TObjArray*>(fileSim->FindObjectAny("ChambersEffVSrun"));
//  if (!listChEffVSrunSim) {
//    printf("list of Chamber efficiencies vs run from sim not found\n");
//    return;
//  }

  TObjArray *listChEffVSDEData = static_cast<TObjArray*>(fileData->FindObjectAny(Form("%sEffVsDE",hname2.Data())));
  if (!listChEffVSDEData) {
    printf("list of Chamber efficiencies per DE from data not found\n");
    return;
  }
  TObjArray *listChEffVSDESim = static_cast<TObjArray*>(fileSim->FindObjectAny(Form("%sEffVsDE",hname2.Data())));
  if (!listChEffVSDESim) {
    printf("list of Chamber efficiencies per DE from sim not found\n");
    return;
  }
  
//  TObjArray *listDEEffVSrunData = static_cast<TObjArray*>(fileData->FindObjectAny("DEEffVSrun"));
//  if (!listDEEffVSrunData) {
//    printf("list of DE efficiencies vs run from data not found\n");
//    return;
//  }
//  TObjArray *listDEEffVSrunSim = static_cast<TObjArray*>(fileSim->FindObjectAny("DEEffVSrun"));
//  if (!listDEEffVSrunSim) {
//    printf("list of DE efficiencies vs run from sim not found\n");
//    return;
//  }
  
  // Graph for global efficiency vs run
  TGraphAsymmErrors* gData ;//= static_cast<TGraphAsymmErrors*>(listChEffVSrunData->At(0));
  TGraphAsymmErrors* gSim ;//= static_cast<TGraphAsymmErrors*>(listChEffVSrunSim->At(0));
  
  
  //----Eff vs run  
//  TGraphAsymmErrors *ratioEffvsrRun = CreateRatioGraph("RatioEffVsRun","data/sim tracking efficiency versus run",*gData,*gSim);
//  globalRatios.Add(ratioEffvsrRun);
//  
//  TGraphAsymmErrors* ratioEffvsrRunCopy = static_cast<TGraphAsymmErrors*>(ratioEffvsrRun->Clone());
//  
//  globalRatiosAndEff.Add(DrawRatio("RatioEffVsRunAndEff","Comparison Data&MC tracking efficiency versus run",gData,gSim,ratioEffvsrRunCopy));
  //-------

  //globalRatios.Add(CreateRatioGraph("RatioEffVsRun","data/sim tracking efficiency versus run",*gData,*gSim));
  
  // Create a list with the Chamber and DE ratios
//  TObjArray chamberVSrunRatios;
//  TObjArray deVSrunRatios;
  TObjArray chamberVSdeRatios;
  
//  TObjArray chamberVSrunRatiosAndEff;
//  TObjArray deVSrunRatiosAndEff;
  TObjArray chamberVSdeRatiosAndEff;
  
  // Compute the ratios for Chamber vs run
//  for (Int_t nList = 1 ; nList < listChEffVSrunData->GetEntries() ; nList++)
//  {
//    gData = static_cast<TGraphAsymmErrors*>(listChEffVSrunData->At(nList));
//    gSim = static_cast<TGraphAsymmErrors*>(listChEffVSrunSim->At(nList));
//    if (!gData || !gSim )
//    {
//      printf("Error readig from Chamber efficiency vs run list \n");
//      return;
//    }
//    //----Eff of Chs vs run
//    TString name =  Form("RatioEffCh%dVsRun",nList); TString title = Form("Chamber %d data/sim tracking efficiency versus run",nList);
//    
//    TGraphAsymmErrors *ratioEffChVsrRun = CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim);
//    chamberVSrunRatios.Add(ratioEffChVsrRun);
//    
//    TGraphAsymmErrors* ratioEffChVsrRunCopy = static_cast<TGraphAsymmErrors*>(ratioEffChVsrRun->Clone());
//    
//    TString nameRatio =  Form("RatioEffCh%dVsRunAndEff",nList); TString titleRatio = Form("Comparison Data&MC Ch%d tracking efficiency versus run",nList);
//    chamberVSrunRatiosAndEff.Add(DrawRatio(nameRatio.Data(),titleRatio.Data(),gData,gSim,ratioEffChVsrRunCopy));
//    //-------
//
//    
////    chamberVSrunRatios.Add(CreateRatioGraph(,,*gData,*gSim));
//    
//  }
  
  //Load the mapping for the DE histos
  AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
  AliCDBManager::Instance()->SetRun(0);
  AliMUONCDB::LoadMapping();
  AliMpDEIterator deit;

  // Loop over Chambers
  for (Int_t ich = 0 ; ich < 10 ; ich++)
  {
    // Compute the ratios for DE vs run
    deit.First(ich);
  
//    while ( !deit.IsDone() )
//    {
//      TString currentDEName = Form("EffDE%dVSrun",deit.CurrentDEId());
//      gData = static_cast<TGraphAsymmErrors*>(listDEEffVSrunData->FindObject(currentDEName.Data()));
//      gSim = static_cast<TGraphAsymmErrors*>(listDEEffVSrunSim->FindObject(currentDEName.Data()));
//      
//      TString name =  Form("RatioEffDE%dVsRun",deit.CurrentDEId()); TString title = Form("DE %d data/sim tracking efficiency versus run",deit.CurrentDEId());
//      if (!gData || !gSim )
//      {
//        printf("Error readig from DE efficiency vs run list \n");
//        return;
//      }
//      //----Eff of DEs vs run
//      TGraphAsymmErrors *ratioEffDEvsRun = CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim);
//      deVSrunRatios.Add(ratioEffDEvsRun);
//      
//      TGraphAsymmErrors* ratioEffDEvsRunCopy = static_cast<TGraphAsymmErrors*>(ratioEffDEvsRun->Clone());
//      
//      TString nameRatio =  Form("RatioEffDE%dVsRunAndEff",deit.CurrentDEId()); TString titleRatio = Form("Comparison Data&MC DE%d tracking efficiency versus run",deit.CurrentDEId());
//      deVSrunRatiosAndEff.Add(DrawRatio(nameRatio.Data(),titleRatio.Data(),gData,gSim,ratioEffDEvsRunCopy));
//      //-------
//
////      deVSrunRatios.Add(CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim));
//      
//      deit.Next();
//    }
  
    // Compute the ratios for Ch vs DE
    TString hname3 = integrated ? "integratedEff" : "eff";
    gData = static_cast<TGraphAsymmErrors*>(listChEffVSDEData->FindObject(Form("%sCh%dVsDE",hname3.Data(),ich+1)));
    gSim = static_cast<TGraphAsymmErrors*>(listChEffVSDESim->FindObject(Form("%sCh%dVsDE",hname3.Data(),ich+1)));
    
    if (!gData || !gSim )
    {
      printf("Error reading from Chamber efficiency per DE list \n");
      return;
    }
    TString name =  Form("RatioEffCh%dVsDE",ich+1); TString title = Form("Chamber %d data/sim tracking efficiency versus DE",ich+1);
    //----Eff of CHs vs DE
    TGraphAsymmErrors *ratioEffChvsDE = CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim);
    chamberVSdeRatios.Add(ratioEffChvsDE);
    
    TGraphAsymmErrors* ratioEffChvsDECopy = static_cast<TGraphAsymmErrors*>(ratioEffChvsDE->Clone());
    
    TString nameRatio =  Form("RatioEffCh%dVsDEAndEff",ich+1); TString titleRatio = Form("Comparison Data&MC Ch%d tracking efficiency versus DE",ich+1);
    chamberVSdeRatiosAndEff.Add(DrawRatio(nameRatio.Data(),titleRatio.Data(),gData,gSim,ratioEffChvsDECopy));
    //-------

    
//    chamberVSdeRatios.Add(CreateRatioGraph(name.Data(),title.Data(),*gData,*gSim));
    
  }

  //Beautify graphs
  BeautifyGraphs(globalRatios,"EffData/EffSim");
//  BeautifyGraphs(deVSrunRatios,"EffData/EffSim");
//  BeautifyGraphs(chamberVSrunRatios,"EffData/EffSim");
  BeautifyGraphs(chamberVSdeRatios,"EffData/EffSim");

//  BeautifyGraphs(globalRatiosAndEff,"EffData/EffSim");
//  BeautifyGraphs(deVSrunRatiosAndEff,"EffData/EffSim");
//  BeautifyGraphs(chamberVSrunRatiosAndEff,"EffData/EffSim");
//  BeautifyGraphs(chamberVSdeRatiosAndEff,"EffData/EffSim");

  // set bin labels
//  SetRunLabel(deVSrunRatios,irun,runs);
//  SetRunLabel(chamberVSrunRatios,irun,runs);
//  SetRunLabel(globalRatios,irun,runs,1); //Write it in such a way the number is the position on the list of the graph you want to label
//  
  // save output
  TFile* file = new TFile("EffComparison.root","update");
  
  globalRatios.Write("GlobalEffRatios", TObject::kOverwrite | TObject::kSingleKey);
//  chamberVSrunRatios.Write("ChambersEffVSrunRatios", TObject::kOverwrite | TObject::kSingleKey);
//  deVSrunRatios.Write("DEEffVSrunRatios", TObject::kOverwrite | TObject::kSingleKey);
  chamberVSdeRatios.Write("ChamberEffperDERatios", TObject::kOverwrite | TObject::kSingleKey);
  
  globalRatiosAndEff.Write("GlobalEffRatiosAndEffs", TObject::kOverwrite | TObject::kSingleKey);
//  chamberVSrunRatiosAndEff.Write("ChambersEffVSrunRatiosAndEff", TObject::kOverwrite | TObject::kSingleKey);
//  deVSrunRatiosAndEff.Write("DEEffVSrunRatiosAndEff", TObject::kOverwrite | TObject::kSingleKey);
  chamberVSdeRatiosAndEff.Write("ChamberEffperDERatiosAndEff", TObject::kOverwrite | TObject::kSingleKey);

  
   
  file->Close();
 
  fileData->Close();
  fileSim->Close();
   


}
Example #6
0
int rdMu2bbc(
 TString fullName="ccX",
 int nEve=10000,
 Int_t nFiles  = 4,
 char* file="inp/R5112017.lis", // min-b
 //char* file="inp/R5118053.lis", // prodPP
 char* inDir   = "./",
 char* outDir   = "outBbc/"
){ 
  
  gROOT->LoadMacro("$STAR/StRoot/StMuDSTMaker/COMMON/macros/loadSharedLibraries.C");
  loadSharedLibraries();
  cout << " loading done " << endl;
  gSystem->Load("myTest1");  

  // create chain    
  chain = new StChain("StChain"); 

  printf("adding muDst from '%s' ....\n",file);
  // Now we add Makers to the chain...   
  muMk = new StMuDstMaker(0,0,inDir,file,"MuDst.root",nFiles);
  TChain* tree=muMk->chain(); assert(tree); 
  int nEntries=tree->GetEntries();
  printf("total eve in chain =%d\n",nEntries);

  myMk3=new StBbcVertexMaker("bbcVertex","MuDst");
  TObjArray  HList;
  myMk3->SetHList(&HList);
  myMk3->readCalib("outBbc/bbcEcalib2.dat");
  myMk3->readCalib("outBbc/bbcWcalib2.dat");
  myMk3->setTdcCalib(2.0); // cm/tdc ch

  gMessMgr->SwitchOff("D");
  gMessMgr->SwitchOn("I");
 
  chain->Init();
  chain->ls(3);
  //  return;
  int eventCounter=0;
  int stat=0;
  int t1=time(0);
  //---------------------------------------------------
  while ( stat==0 ) {// loop over events
    if(eventCounter>=nEve) break;
    eventCounter++;
    chain->Clear();
    stat = chain->Make();

    if(eventCounter%1000!=0)continue;

    printf("\n\n ====================%d  processing  ==============\n", eventCounter);

  }
  printf("sorting done, nEve=%d of %d\n",nEve, nEntries);
  int t2=time(0);
  float rate=1.*eventCounter/(t2-t1);
  float nMnts=(t2-t1)/60.;
  printf("sorting done %d of   nEve=%d, CPU rate=%.1f Hz, tot %.1f minutes\n",eventCounter,nEntries,rate,nMnts);

   chain->Finish();
   //   HList.ls();
   fullName+=".hist.root";
   TFile f( outDir+fullName,"recreate");
   assert(f.IsOpen());
   printf("%d histos are written  to '%s' ...\n",HList.GetEntries(),fullName.Data());
   HList.Write();
   f.Close();
   assert(!f.IsOpen());

}
Example #7
0
//_____________________________
void muIDCutsOptim::Loop()
{
  //  In a ROOT session, you can do:
  //      root> .L muIDCutsOptim.C
  //      root> muIDCutsOptim t
  //      root> t.GetEntry(12); // Fill t data members with entry number 12
  //      root> t.Show();       // Show values of entry 12
  //      root> t.Show(16);     // Read and show values of entry 16
  //      root> t.Loop();       // Loop on all entries
  //
  
  //  This is the loop skeleton where:
  //    jentry is the global entry number in the chain
  //    ientry is the entry number in the current Tree
  //  Note that the argument to GetEntry must be:
  //    jentry for TChain::GetEntry
  //    ientry for TTree::GetEntry and TBranch::GetEntry
  //

  if (fChain == 0) return;
  
  
  //===== Definition of file type, particle and if we want the high purity cut included in the soft muon ID cuts
  const char* fileType = "MC";
  const char* particle = "JPsi";
  fIspp = kFALSE;
  fIncludeHighPurity = kFALSE;
  //=====
  
  
  Long64_t nentries(0);
  if ( !strcmp(fileType,"MC") ) nentries = fChain->GetEntries();
  else nentries = 1500000;
  
  std::cout << "# Events = " << nentries << std::endl;
  
  
  //===== Definition of some cuts
  Double_t leMinvSig = 3.0; // Signal range
  Double_t ueMinvSig = 3.2;
  
  Double_t leMinvBkg1 = 2.7; // Bkg 1 range (sideband)
  Double_t ueMinvBkg1 = 2.9;
  
  Double_t leMinvBkg2 = 3.3; // Bkg 1 range (sideband)
  Double_t ueMinvBkg2 = 3.5;

  Double_t Ptmin = 3.0; // Pt cut (6.5) (3.0)
  Double_t Ptmax = 6.5; // (12.0) (6.5)
  
  Double_t Ymin = 2.0; // Y cut (0.0) (2.0)
  Double_t Ymax = 2.4; // (2.4) (2.4)
  //=====
  
  
  //===== Definition of MuID variables and binning
  const int nvar = 19;
  const char* varname[19] = {"isGoodMuon", "highPurity", "TrkMuArb", "TMOneStaTight", "nPixValHits",
    "nMuValHits", "nTrkHits", "normChi2_inner", "normChi2_global", "nPixWMea",
    "nTrkWMea", "StationsMatched", "dxy", "dxyErr", "dz",
    "dzErr", "ptErr_inner", "ptErr_global","VtxProb"};
  const int nbins[19] = {2, 2, 2, 2, 11,
    56, 36, 100, 100, 6,
    19, 7, 100, 100, 100,
    100, 100, 100, 200};
  const double lowedge[19] = {0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0};
  const double hiedge[19] = {2, 2, 2, 2, 11,
    56, 36, 10, 50, 6,
    19, 7, 2, 0.25, 20,
    5, 0.15, 0.15, 1.};
  //=====
  
  
  SelectBranches(nvar,varname); // Activates only desired branches (General and MuID ones in this case)
  
  
  //====== Create histograms and arrays to store them ========
  TObjArray* aDistr = new TObjArray();
  TObjArray* aSig = new TObjArray();
  TObjArray* aBkg = new TObjArray();
  TObjArray* aSigC = new TObjArray();
  TObjArray* aBkgC = new TObjArray();
  TObjArray* aGlob = new TObjArray();
  TObjArray* aMinvCuts = new TObjArray();
  TObjArray* aSigSoftMuCutsButOne = new TObjArray();
  TObjArray* aBkgSoftMuCutsButOne = new TObjArray();
  TObjArray* aSigSoftMuCuts = new TObjArray();
  TObjArray* aBkgSoftMuCuts = new TObjArray();
  
  map<TString, TH1F*> hists_sig, hists_bkg, hists_sig_distr, hists_bkg_distr, hists_distr, hists_sig_distr_CutTest, hists_bkg_distr_CutTest, hists_sig_SofMu, hists_bkg_SofMu;
  
  TString sHPName("");
  if ( fIncludeHighPurity ) sHPName += "highPurity"; // This is for the histograms creation
  
  TObjArray* dummyA(0x0);
  TString partType("");
  for (int i=0; i<nvar; i++)
  {
    // Single cuts histos
    hists_sig[Form("%s",varname[i])] = new TH1F(Form("h%s_sig",varname[i]),Form("Signal di-#mu %s cut distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]);
    hists_bkg[Form("%s",varname[i])] = new TH1F(Form("h%s_bkg",varname[i]),Form("Background di-#mu %s cut distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]);
    
    // Variable distributions histos
    hists_sig_distr[Form("%s",varname[i])] = new TH1F(Form("h%s_sig_distr",varname[i]),Form("Signal single-#mu %s distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]);
    hists_bkg_distr[Form("%s",varname[i])] = new TH1F(Form("h%s_bkg_distr",varname[i]),Form("Background single-#mu %s distribution",varname[i]),nbins[i],lowedge[i],hiedge[i]);
    
    partType.Clear();
    if ( !strcmp(varname[i],"VtxProb") ) partType += "di-#mu";
    else partType += "di-#mu";
    hists_distr[Form("%s",varname[i])] = new TH1F(Form("h%s_distr",varname[i]),Form("Sig+Bkg %s %s distribution",partType.Data(),varname[i]),nbins[i],lowedge[i],hiedge[i]);
    
    dummyA = new TObjArray();
    dummyA->SetName(Form("mInv_%s",varname[i]));
    aMinvCuts->Add(dummyA);
    
    if ( !strcmp(varname[i],"isGoodMuon") || !strcmp(varname[i],sHPName.Data()) || !strcmp(varname[i],"nPixWMea") || !strcmp(varname[i],"nTrkWMea") || !strcmp(varname[i],"dxy") || !strcmp(varname[i],"dz") )
    {
      // Histos for all the soft muon cuts applied but the one on the histo
      hists_sig_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuNoCut_%s_sig",varname[i]),Form("Signal single-#mu %s distribution (w/ rest of soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]);
      hists_bkg_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuNoCut_%s_bkg",varname[i]),Form("Background single-#mu %s distribution (w/ rest of soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]);
      
      hists_sig_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_sig",varname[i]),Form("Signal di-#mu %s cut distribution (w/ all Soft MuID cuts except %s)",varname[i],varname[i]),nbins[i],lowedge[i],hiedge[i]);
      hists_bkg_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_bkg",varname[i]),Form("Background di-#mu %s cut distribution (w/ all Soft MuID cuts except %s)",varname[i],varname[i]),nbins[i],lowedge[i],hiedge[i]);
    }
    else
    {
      // Histos for all the soft muon cuts applied
      hists_sig_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuFull_%s_sig",varname[i]),Form("Signal %s %s distribution (w/ all Soft MuID cuts)",partType.Data(),varname[i]),nbins[i],lowedge[i],hiedge[i]);
      hists_bkg_distr_CutTest[Form("%s",varname[i])] = new TH1F(Form("hSoftMuFull_%s_bkg",varname[i]),Form("Signal %s %s distribution (w/ all Soft MuID cuts)",partType.Data(),varname[i]),nbins[i],lowedge[i],hiedge[i]);
      
      hists_sig_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_sig",varname[i]),Form("Signal di-#mu %s cut distribution (w/ all Soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]);
      hists_bkg_SofMu[Form("%s",varname[i])] = new TH1F(Form("hSoftMuCut_%s_bkg",varname[i]),Form("Background di-#mu %s cut distribution (w/ all Soft MuID cuts)",varname[i]),nbins[i],lowedge[i],hiedge[i]);
    }
  }


  // Histos for global distributions
  TH1* hpt = new TH1D("hPtSig",Form("Dimuon p_{T} distribution (%2.1f < m_{#mu^{+}#mu^{-}} < %2.1f)",leMinvSig,ueMinvSig),300,0.0,15.0);
  TH1* hptw = new TH1D("hPtSigW",Form("Dimuon p_{T} distribution weighted (%2.1f < m_{#mu^{+}#mu^{-}} < %2.1f)",leMinvSig,ueMinvSig),300,0.0,15.0);
  
  TH1* hMinvw = new TH1D("hmInv","Dimuon m_{inv} distribution",600,0.,15.0);
  TH1* hRapw = new TH1D("hRap","Dimuon rapidity distribution",180,-4.5,4.5);
  TH1* hPtw = new TH1D("hPt","Dimuon p_{T} distribution",300,0.0,15.0);
  TH1* hCent = new TH1D("hCent","Centrality distribution",200,0.,100);
  TH1* hCentw = new TH1D("hCentw","Weighted centrality distribution",200,0.,100);
  //======================
  
  
  TLorentzVector *tlvmupl(0x0);
  TLorentzVector *tlvmumi(0x0);
  TLorentzVector *tlvqq(0x0);

  Long64_t nbytes = 0, nb = 0;
  //*************** Event loop
  for (Long64_t jentry=0; jentry<nentries;jentry++)
  {
    Long64_t ientry = LoadTree(jentry);
    if (ientry < 0) break;
    nb = fChain->GetEntry(jentry);   nbytes += nb;
    
    if ( jentry % 1000 == 0 ) std::cout << jentry << "/" << nentries << std::endl;
    
    Double_t weight = fChain->GetWeight()*GetNColl(Centrality); // This is the weight for the Pt and centrality. The weight stored in the chain is filterEficiency/nentries

    //Fill centrality histo
    hCentw->Fill(Centrality/2.,weight);
    hCent->Fill(Centrality/2.);
    
    
    //*************** Loop on reco dimuons
//    for (int i=0; i<Reco_QQ_size; i++)
//    {
    Int_t i(0);
    Bool_t kQQfound(kFALSE);
    while ( i < Reco_QQ_size && !kQQfound ) // This is just to take only the first dimuon passing the basic conditions, to not double count single muons
    {
      if ( !isTriggerSelected(i) || Reco_QQ_sign[i]!=0 )
      {
        i++;
        continue; // Checks if the event is selected by the trigger
      }
      
//      if (Reco_QQ_sign[i]!=0) continue;
      tlvmupl = (TLorentzVector*) Reco_QQ_mupl_4mom->At(i);
      tlvmumi = (TLorentzVector*) Reco_QQ_mumi_4mom->At(i);
      
      if (!IsAccept(tlvmupl->Pt(), tlvmupl->Eta()) || !IsAccept(tlvmumi->Pt(), tlvmumi->Eta()))
      {
        i++;
        continue; // Basic single muon kinematic cuts
      }
      
      tlvqq = (TLorentzVector*) Reco_QQ_4mom->At(i);
      Double_t mass = tlvqq->M();
      Double_t QQPt = tlvqq->Pt();
      Double_t QQY = TMath::Abs(tlvqq->Rapidity());
      
      if ( QQPt < Ptmin || QQPt > Ptmax || QQY < Ymin || QQY > Ymax )
      {
        i++;
        continue; // The simulation is restricted to pt in [Ptmin,Ptmax], so this rejects background dmuons outside the range
      }
      
      bool issig = (mass>leMinvSig && mass<ueMinvSig);
      bool isbkg = ((mass>leMinvBkg1 && mass<ueMinvBkg1) || (mass>leMinvBkg2 && mass<ueMinvBkg2));
      
      if ( !issig && ! isbkg )
      {
        i++;
        continue; // We keep only dimuons in the sidebands and signal ranges
      }
      
      kQQfound = kTRUE; // If at this point the dimuon has passed the basic conditions we keep only this dimuon from the event
      
      const double varValP[19] = {Reco_QQ_mupl_isGoodMuon[i],Reco_QQ_mupl_highPurity[i],Reco_QQ_mupl_TrkMuArb[i],Reco_QQ_mupl_TMOneStaTight[i],Reco_QQ_mupl_nPixValHits[i],Reco_QQ_mupl_nMuValHits[i],Reco_QQ_mupl_nTrkHits[i],Reco_QQ_mupl_normChi2_inner[i],Reco_QQ_mupl_normChi2_global[i],Reco_QQ_mupl_nPixWMea[i],Reco_QQ_mupl_nTrkWMea[i],Reco_QQ_mupl_StationsMatched[i],Reco_QQ_mupl_dxy[i],Reco_QQ_mupl_dxyErr[i],Reco_QQ_mupl_dz[i],Reco_QQ_mupl_dzErr[i],Reco_QQ_mupl_ptErr_inner[i],Reco_QQ_mupl_ptErr_global[i],Reco_QQ_VtxProb[i]};
      const double varValM[19] = {Reco_QQ_mumi_isGoodMuon[i],Reco_QQ_mumi_highPurity[i],Reco_QQ_mumi_TrkMuArb[i],Reco_QQ_mumi_TMOneStaTight[i],Reco_QQ_mumi_nPixValHits[i],Reco_QQ_mumi_nMuValHits[i],Reco_QQ_mumi_nTrkHits[i],Reco_QQ_mumi_normChi2_inner[i],Reco_QQ_mumi_normChi2_global[i],Reco_QQ_mumi_nPixWMea[i],Reco_QQ_mumi_nTrkWMea[i],Reco_QQ_mumi_StationsMatched[i],Reco_QQ_mumi_dxy[i],Reco_QQ_mumi_dxyErr[i],Reco_QQ_mumi_dz[i],Reco_QQ_mumi_dzErr[i],Reco_QQ_mumi_ptErr_inner[i],Reco_QQ_mumi_ptErr_global[i],0.}; //Reco_QQ_VtxProb set to 0. since it is a dimuon variable
      

      //**************************************************
      //*************** Fill histos **********************
      //**************************************************
      
      //===== General distributions
      hMinvw->Fill(mass,weight);
      hRapw->Fill(tlvqq->Rapidity(),weight);
      hPtw->Fill(QQPt,weight);
      
      if (issig)
      {
        hpt->Fill(QQPt);
        hptw->Fill(QQPt,weight);
      }
      //=====
      
      
      //===== MuID distributions
      for (int ihist=0; ihist<nvar; ihist++)
      {
        Bool_t isQQVar = kFALSE;
        if ( !strcmp(varname[ihist],"VtxProb") ) isQQVar = kTRUE; // Just to avoid filling the histos twice if testing a variable corresponding to a dimuon
          
        hists_distr[varname[ihist]]->Fill(varValP[ihist],weight); // Signal+ Background variable distribution
        if ( !isQQVar ) hists_distr[varname[ihist]]->Fill(varValM[ihist],weight);
        
        if (issig)
        {
          hists_sig_distr[varname[ihist]]->Fill(varValP[ihist],weight);  // Signal variable distribution
          if ( !isQQVar ) hists_sig_distr[varname[ihist]]->Fill(varValM[ihist],weight);
        }
        if (isbkg)
        {
          hists_bkg_distr[varname[ihist]]->Fill(varValP[ihist],weight);  // Background variable distribution
          if ( !isQQVar ) hists_bkg_distr[varname[ihist]]->Fill(varValM[ihist],weight);
        }

        
        ////_______ Soft muons cut testing MuID distributions
        Int_t nTest = whichMuIDVar(varname[ihist]); // If the variable is not on the soft muon cuts the full cut is applied
        
        if (isSoftMuon(varValP,nTest))
        {
          if (issig) hists_sig_distr_CutTest[varname[ihist]]->Fill(varValP[ihist],weight); // Variable distribution with the rest of soft MuID cuts applied (all the soft muon cuts if the variable does't belong to the soft cut)
          if (isbkg) hists_bkg_distr_CutTest[varname[ihist]]->Fill(varValP[ihist],weight);
        }
        if ( !isQQVar && isSoftMuon(varValM,nTest) )
        {
          if (issig) hists_sig_distr_CutTest[varname[ihist]]->Fill(varValM[ihist],weight);
          if (isbkg) hists_bkg_distr_CutTest[varname[ihist]]->Fill(varValM[ihist],weight);
        }
        ////_______
        
        
        dummyA = static_cast<TObjArray*>(aMinvCuts->FindObject(Form("mInv_%s",varname[ihist])));
        
        TH1* dummyH(0x0);
        Double_t nBins = hists_sig[varname[ihist]]->GetNbinsX();
        for ( Int_t j=1 ; j<=nBins ; j++)
        {
          //// Cuts on MuID variables
          Double_t cutVal = hists_sig[varname[ihist]]->GetBinLowEdge(j);
          if (Cut(varname[ihist],i,cutVal))
          {
            if (issig) hists_sig[varname[ihist]]->Fill(hists_sig[varname[ihist]]->GetBinCenter(j),weight); // Variable cut distribution
            if (isbkg) hists_bkg[varname[ihist]]->Fill(hists_bkg[varname[ihist]]->GetBinCenter(j),weight);
            
            if ( !(dummyH = static_cast<TH1*>(dummyA->FindObject(Form("mInv_%s_Cut%2.4f",varname[ihist],cutVal)))) ) // Creates the minv histogram and store in array (only once)
            {
              dummyH = new TH1D(Form("mInv_%s_Cut%2.4f",varname[ihist],cutVal),Form("Dimuon m_{inv} distribution (cut on %s: %2.4f)",varname[ihist],cutVal),600,0.,15.0);
              dummyA->Add(dummyH);
            }
            
            dummyH->Fill(mass,weight); // Invariant mass histo for each variable cut
            
            if ( isSoftMuon(varValP,nTest) && isSoftMuon(varValM,nTest) ) // If the variable is not in the soft MuID cut, the full soft cut is applied and the variable cut distribution is filled
            {
              if (issig) hists_sig_SofMu[varname[ihist]]->Fill(hists_sig[varname[ihist]]->GetBinCenter(j),weight);
              if (isbkg) hists_bkg_SofMu[varname[ihist]]->Fill(hists_bkg[varname[ihist]]->GetBinCenter(j),weight);
            }
          }
        }
      }
      //=======
      i++;
    }
  }
  
  //====== Save histos ======
  TFile *f = new TFile(Form("histos_%s_%s_%s_Pt%2.1f_%2.1f_Y%2.1f_%2.1f.root",fileType,particle,fIncludeHighPurity ? "HPincl" : "NoHPincl",Ptmin,Ptmax,Ymin,Ymax),"RECREATE");
  
  for (int i=0; i<nvar; i++)
  {
    aSigC->Add(hists_sig[varname[i]]);
    aBkgC->Add(hists_bkg[varname[i]]);
    
    aSig->Add(hists_sig_distr[varname[i]]);
    aBkg->Add(hists_bkg_distr[varname[i]]);
  
    aDistr->Add(hists_distr[varname[i]]);
    
    aSigSoftMuCutsButOne->Add(hists_sig_distr_CutTest[varname[i]]);
    aBkgSoftMuCutsButOne->Add(hists_bkg_distr_CutTest[varname[i]]);
    
    aSigSoftMuCuts->Add(hists_sig_SofMu[varname[i]]);
    aBkgSoftMuCuts->Add(hists_bkg_SofMu[varname[i]]);
  }
  
  aSigC->Write("SigSingleCut", TObject::kOverwrite | TObject::kSingleKey);
  aBkgC->Write("BkgSingleCut", TObject::kOverwrite | TObject::kSingleKey);
  
  aSig->Write("SigDistr", TObject::kOverwrite | TObject::kSingleKey);
  aBkg->Write("BkgDistr", TObject::kOverwrite | TObject::kSingleKey);
  
  aDistr->Write("Distr", TObject::kOverwrite | TObject::kSingleKey);
  
  aSigSoftMuCutsButOne->Write("SigDistrSoftMuCutButOne", TObject::kOverwrite | TObject::kSingleKey);
  aBkgSoftMuCutsButOne->Write("BkgDistrSoftMuCutButOne", TObject::kOverwrite | TObject::kSingleKey);
  
  aSigSoftMuCuts->Write("SigSoftMuCut", TObject::kOverwrite | TObject::kSingleKey);
  aBkgSoftMuCuts->Write("BkgSoftMuCut", TObject::kOverwrite | TObject::kSingleKey);
  
  
  aGlob->Add(hMinvw);
  aGlob->Add(hRapw);
  aGlob->Add(hPtw);
  aGlob->Add(hpt);
  aGlob->Add(hptw);
  aGlob->Add(hCent);
  aGlob->Add(hCentw);

  aGlob->Write("Global", TObject::kOverwrite | TObject::kSingleKey);
  
  
  aMinvCuts->Write("MinvWCuts", TObject::kOverwrite | TObject::kSingleKey);
  
  f->Close();
  //=========
  
}
Example #8
0
void GeomAcc::Calculate(TString geomTuple, TString saveName){

  TFile* file = new TFile(geomTuple);
  TTree* tree=(TTree*)file->Get("SelectJpsi/JpsiGen"); 

  double JpsiPT, JpsiRap, CosTheta;
  double MuNegDau, MuPosDau;

  tree->SetBranchAddress("JPsi_PT",&JpsiPT);
  tree->SetBranchAddress("JPsi_RAPIDITY",&JpsiRap);
  tree->SetBranchAddress("JPsi_COSTHETA",&CosTheta);
  tree->SetBranchAddress("MuMinus_THETA",&MuNegDau);
  tree->SetBranchAddress("MuPlus_THETA",&MuPosDau);


  int xbin = 20;
  int ybin = 5;

  TH2D *Num = new TH2D("Num","Num",xbin,0.0,10000.0, ybin,2.0,4.2);
  TH2D *Den = new TH2D("Den","Den",xbin,0.0,10000.0, ybin,2.0,4.2);
  
  TH2D *NumLong = new TH2D("NumLong","NumLong",xbin,0.0,10000.0, ybin,2.0,4.2);
  TH2D *DenLong = new TH2D("DenLong","DenLong",xbin,0.0,10000.0, ybin,2.0,4.2);
 
  TH2D *NumTrans = new TH2D("NumTrans","NumTrans",xbin,0.0,10000.0, ybin,2.0,4.2);
  TH2D *DenTrans = new TH2D("DenTrans","DenTrans",xbin,0.0,10000.0, ybin,2.0,4.2);

  for(int i=0; i<tree->GetEntries(); i++)
  {
    tree->GetEntry(i);

    Den->Fill(JpsiPT,JpsiRap);
    DenLong->Fill(JpsiPT,JpsiRap,(1-CosTheta*CosTheta));
    DenTrans->Fill(JpsiPT,JpsiRap,(1+CosTheta*CosTheta));

    //
    //Calculate Daughters in acceptance criteria
    //
    bool inAcc = Cut(MuPosDau, MuNegDau);

    if(inAcc) {
      Num->Fill(JpsiPT,JpsiRap);
      NumLong->Fill(JpsiPT,JpsiRap,(1-CosTheta*CosTheta));
      NumTrans->Fill(JpsiPT,JpsiRap,(1+CosTheta*CosTheta));
    }
  }

  //
  //Calculate efficiency
  //

  TH2D GeoEff =  (Eff(Num, Den, xbin, ybin, "GeoEff"));
  TH2D GeoLongEff =  (Eff(NumLong, DenLong, xbin, ybin,"GeoLongEff"));
  TH2D GeoTransEff =  (Eff(NumTrans, DenTrans, xbin, ybin,"GeoTransEff"));


  TObjArray* histList = new TObjArray(0);
  histList->Add(Num);
  histList->Add(Den);
  histList->Add(&GeoEff);
  histList->Add(NumLong);
  histList->Add(DenLong);
  histList->Add(&GeoLongEff);
  histList->Add(NumTrans);
  histList->Add(DenTrans);
  histList->Add(&GeoTransEff);
  TFile* saveFile = new TFile("Output/"+saveName, "recreate");
  histList->Write();
  saveFile->Close();

  //
  // Save into final usable format in Efficiency folder
  //

  Format(saveName, "NoPol/");
  Format(saveName, "Long/");
  Format(saveName, "Trans/");

  return;
}
Example #9
0
void saveHistRoot(const char *cfile){

  cout<<"File to be saved = "<<cfile<<endl;
  TFile *outputFile = new TFile(cfile,"recreate");   

  hdN_dPhiTrkNJet->Write(), hdN_dPhiTrkAJet->Write();
  hdN_dEtaTrkNJet->Write(), hdN_dEtaTrkAJet->Write();
  hdN_dRTrkNJet->Write(), hdN_dRTrkAJet->Write();

  hdN_dPhiTrkTrk_dPhiTrkJet->Write();
  hdN_dEtaTrkTrk_dEtaTrkJet->Write();
  hdN_dRTrkTrk_dRTrkJet->Write();
  hdN_dPhiTrkTrk_dRTrkJet->Write();

  hdN_dEtadPhiTrkNJet->Write(), hdN_dEtadPhiTrkAJet->Write();

  hdNdPt_NJet->Write(), hdNdPt_AJet->Write();
  
  // dN/dpT nomalization
  /*
  for(int i=0; i<ptBins.size(); i++){
    float dbin = hdNdPt_NJet_vbin->GetBinWidth(i+1);

    float dn_N = hdNdPt_NJet_vbin->GetBinContent(i+1);
    float dn_A = hdNdPt_AJet_vbin->GetBinContent(i+1);
    
    float edn_N = hdNdPt_NJet_vbin->GetBinError(i+1);
    float edn_A = hdNdPt_AJet_vbin->GetBinError(i+1);

    hdNdPt_NJet_vbin->SetBinContent(i+1,dn_N/dbin);
    hdNdPt_AJet_vbin->SetBinContent(i+1,dn_A/dbin);

    hdNdPt_NJet_vbin->SetBinError(i+1,edn_N/dbin);
    hdNdPt_AJet_vbin->SetBinError(i+1,edn_A/dbin);
  }
  */
  hdNdPt_NJet_vbin->Write(), hdNdPt_AJet_vbin->Write();

  hdNdZ_NJet->Write(), hdNdZ_AJet->Write();
  hdNdNR_NJet->Write(), hdNdNR_AJet->Write();
  hdNdNRW_NJet->Write(), hdNdNRW_AJet->Write();

  hdNdJetEt_NJet->Write(),  hdNdJetEt_AJet->Write();
  hdNdTrkSPt_NJet->Write(), hdNdTrkSPt_AJet->Write();

  hdNPtEtRatio_NJet->Write(), hdNPtEtRatio_AJet->Write();
  hdNPtEtAsymm_NJet->Write(), hdNPtEtAsymm_AJet->Write();

  dJetDist = outputFile->mkdir("jetDist"), dJetDist->cd();
  hdEtadPhiJetArray.Write();
  
  dTrkDist = outputFile->mkdir("trkDist"), dTrkDist->cd();
  hdEtadPhiTrkArray.Write();
  
  dTrkWDist = outputFile->mkdir("trkWDist"), dTrkWDist->cd();
  hdEtadPhiTrkWArray.Write();


  dJetTagDist = outputFile->mkdir("jetTagDist"), dJetTagDist->cd();
  hdEtadPhiJetTagArray.Write();

  dTrkTagDist = outputFile->mkdir("trkTagDist"), dTrkTagDist->cd();
  hdEtadPhiTrkTagArray.Write();

  dTrkWTagDist = outputFile->mkdir("trkWTagDist"), dTrkWTagDist->cd();
  hdEtadPhiTrkWTagArray.Write();


  
}