Example #1
0
void getLimitCL95(std::string oDir, 
		  double ilum = 195600., 
		  double slum = 558.) {
  //
  // compute limit in a counting experiment
  //

  // read backgrounds etc from target dir
  std::cout << "Backgrounds" << std::endl;
  double bgZjets(0.), err_bgZjets(0.);
  double bgWjets(0.), err_bgWjets(0.);
  double bgQCD(0.), err_bgQCD(0.);

  ifstream file;
  double n, err_n;
  std::string name;

  file.open( (oDir+std::string("/zjets.txt")).c_str() );
  while (file >> name >> n >> err_n) {
    if (name == "Signal") {
      bgZjets = n;
      err_bgZjets = err_n;
    }
  }
  file.close();

  std::cout << "Z+jets  : " << bgZjets << " +/- " << err_bgZjets << std::endl;

  file.open( (oDir+std::string("/wjets.txt")).c_str() );
  while (file >> name >> n >> err_n) {
    if (name == "Signal") {
      bgWjets = n;
      err_bgWjets = err_n;
    }
  }
  file.close();

  std::cout << "W+jets  : " << bgWjets << " +/- " << err_bgWjets << std::endl;

  file.open( (oDir+std::string("/qcd.txt")).c_str() );
  while (file >> name >> n >> err_n) {
    if (name == "Signal") {
      bgQCD = n;
      err_bgQCD = err_n;
    }
  }
  file.close();

  std::cout << "QCD     : " << bgQCD << " +/- " << err_bgQCD << std::endl;

  // total BG
  double bgTot     = bgZjets + bgWjets + bgQCD;
  double err_bgTot = sqrt( pow(err_bgZjets, 2) + pow(err_bgWjets, 2) + pow(err_bgQCD, 2) );

  std::cout << "Total   : " << bgTot << " +/- " << err_bgTot << std::endl;
  std::cout << std::endl;

  // observed
  std::cout << "Observed" << std::endl;
  int nObs = int(bgTot);

//   file.open((oDir+std::string("/obs.txt")).c_str());
//   while (file >> name >> n) {
//     if (name == "Signal") {
//       nObs = n;
//     }
//   }
//   file.close();

  std::cout << "Obs     : " << nObs << std::endl;
  std::cout << std::endl;

  // read signal efficiencies from file
  std::cout << "Signal efficiency" << std::endl;
  std::vector<double> mH, xsH, effSignal, err_effSignal;

  file.open( (oDir+std::string("/signal.txt")).c_str() );
  std::string line;
  getline(file, line);

  int i=0;
  double m, eff, err, a,b,c,d,x;
  while (file >> name >> m >> eff >> err >> a >> b >> c >> d >> x) {
    mH.push_back( m );
    xsH.push_back( x );
    effSignal.push_back( eff );
    err_effSignal.push_back( err );
    std::cout << "Signal " << m << " xs=" << x << " : " << eff << " +/- " << err << std::endl;
  }
  file.close();

  std::cout << std::endl;

  std::cout << "Going to compute limit for mH=" << mH[0] << ".  VBF x-section=" << xsH[0] << std::endl;
  std::cout << std::endl;
  

  // optional: set some parameters
  SetParameter("Optimize", false);
  SetParameter("CorrelatedLumiSyst", false);
  SetParameter("MakePlot", true);
  SetParameter("GaussianStatistics", false);

  SetParameter("NClsSteps", 10);
  SetParameter("NToys", 1000);
  SetParameter("CalculatorType", 0); // 0 for frequentist
  SetParameter("TestStatType", 3); // LHC-style 1-sided profile likelihood
  SetParameter("Verbosity", 3);
  SetParameter("RandomSeed", 0);

  SetParameter("ConfidenceLevel", 0.95);
  SetParameter("NToysRatio", 2.0);

  
  // will work with any method, example shown for Bayesian
  LimitResult expected = GetExpectedLimit(ilum, slum,
					  effSignal[0], err_effSignal[0],
					  bgTot, err_bgTot,
					  100,
					  "bayesian");
    
  std::cout << " expected limit (median) " << expected.GetExpectedLimit() << std::endl;
  std::cout << " expected limit (-1 sig) " << expected.GetOneSigmaLowRange() << std::endl;
  std::cout << " expected limit (+1 sig) " << expected.GetOneSigmaHighRange() << std::endl;
  std::cout << " expected limit (-2 sig) " << expected.GetTwoSigmaLowRange() << std::endl;
  std::cout << " expected limit (+2 sig) " << expected.GetTwoSigmaHighRange() << std::endl;

  // write summary file
  ofstream oFile;
  oFile.open( (oDir+std::string("/RooStatsCL95.txt")).c_str() );

  oFile << "Lumi=" << ilum << " +/- " << slum << std::endl;
  oFile << std::endl;
  oFile << "Backgrounds" << std::endl;
  oFile << "Z+jets       : " << bgZjets << " +/- " << err_bgZjets << std::endl;
  oFile << "W+jets       : " << bgWjets << " +/- " << err_bgWjets << std::endl;
  oFile << "QCD          : " << bgQCD   << " +/- " << err_bgQCD << std::endl;
  oFile << "Total        : " << bgTot << " +/- " << err_bgTot << std::endl;
  oFile << std::endl;
  oFile << "Observed     : " << nObs << std::endl;
  oFile << std::endl;
  oFile << "Signal point" << std::endl;
  oFile << "mH=" << mH[0] << ".  VBF x-section=" << xsH[0] << std::endl;
  oFile << "eff=" << effSignal[0] << " +/- " << err_effSignal[0] << std::endl;
  oFile << "yield (100% inv BF)=" << int(xsH[0]*ilum*effSignal[0]) << std::endl;
  oFile << std::endl;
  oFile << "Results" << std::endl;
  oFile << "  expected limit (median) " << expected.GetExpectedLimit() << std::endl;
  oFile << "  expected limit (-1 sig) " << expected.GetOneSigmaLowRange() << std::endl;
  oFile << "  expected limit (+1 sig) " << expected.GetOneSigmaHighRange() << std::endl;
  oFile << "  expected limit (-2 sig) " << expected.GetTwoSigmaLowRange() << std::endl;
  oFile << "  expected limit (+2 sig) " << expected.GetTwoSigmaHighRange() << std::endl;
  oFile << std::endl;

  oFile.close();

  return;
}
Example #2
0
void limit( std::string method = "bayesian" ){
  //
  // compute limit in a counting experiment
  //

  double ilum = 1.0;
  double slum = 0.0;
  double  eff = 1.0;
  double seff = 0.0;
  double  bkg = 1.44;
  double sbkg = 0.74;

  int    data = 6;

  // optional: set some parameters
  SetParameter("Optimize",           false);
  SetParameter("CorrelatedLumiSyst", false);
  SetParameter("MakePlot",            true);
  SetParameter("GaussianStatistics", false);

  SetParameter("NClsSteps",     10);
  SetParameter("NToys",       1000);
  SetParameter("CalculatorType", 0); // 0 for frequentist
  SetParameter("TestStatType",   3); // LHC-style 1-sided profile likelihood
  SetParameter("Verbosity",      3);
  SetParameter("RandomSeed",     0);

  SetParameter("ConfidenceLevel", 0.95);
  SetParameter("NToysRatio",      2.0);
  SetParameter("MaxPoi",         -1.0); // negative value - will guess automatically
  SetParameter("MaxYield",       -1.0); // negative value - will guess automatically

  // bayesian limit
  if (method.find("bayesian")!=std::string::npos){
    double bayes_limit = GetBayesianLimit(ilum, slum,
					  eff, seff,
					  bkg, sbkg,
					  data);
    
    std::cout << "observed 95% CL bayesian limit = " << bayes_limit << std::endl;


    // expected limit
    // will work with any method, example shown for Bayesian
    LimitResult bayes_expected = GetExpectedLimit(ilum, slum,
						  eff, seff,
						  bkg, sbkg,
						  100,
						  "bayesian");
    
    std::cout << " expected limit (median) " << bayes_expected.GetExpectedLimit() << std::endl;
    std::cout << " expected limit (-1 sig) " << bayes_expected.GetOneSigmaLowRange() << std::endl;
    std::cout << " expected limit (+1 sig) " << bayes_expected.GetOneSigmaHighRange() << std::endl;
    std::cout << " expected limit (-2 sig) " << bayes_expected.GetTwoSigmaLowRange() << std::endl;
    std::cout << " expected limit (+2 sig) " << bayes_expected.GetTwoSigmaHighRange() << std::endl;
  }

  
  // bayesian limit (MCMC)
  if (method.find("mcmc")!=std::string::npos){
    double bayes_limit = GetBayesianLimit(ilum, slum,
					  eff, seff,
					  bkg, sbkg,
					  data,
					  "mcmc");
    
    std::cout << "observed 95% CL bayesian limit = " << bayes_limit << std::endl;
  }

  
  // CLs limit
  if (method.find("cls")!=std::string::npos){
    LimitResult cls_result = GetClsLimit(ilum, slum,
					 eff, seff,
					 bkg, sbkg,
					 data);
    
    double cls_limit = cls_result.GetObservedLimit();
    
    std::cout << "observed 95% CL limit = " << cls_limit << std::endl;
  }



  return;
}