示例#1
0
double countingExperiment95CLUpperLimit (int nObserved, double bkgMean, double bkgSigma, int nToys=500) {
  // expect nothing beyond 5 sigma
  double bkgMaxExpected = bkgMean+5*bkgSigma; // 5 sigma
  double signalMaxExpected = nObserved+5*sqrt(double(nObserved))-bkgMean+5*bkgSigma;
  // variables
  RooRealVar signal ("signal", "signal", 0, 0, signalMaxExpected);
  RooRealVar bkg ("bkg", "bkg", bkgMean, 0, bkgMaxExpected);
  RooRealVar flatUnit ("flatUnit","flatUnit",0.,1.);
  // sets
  RooArgSet nuisPar (bkg);
  RooArgSet poi (signal);
  // constants
  RooRealVar bkgMeanVar ("bkgMean", "bkgMean", bkgMean);
  RooRealVar bkgSigmaVar ("bkgSigma", "bkgSigma", bkgSigma);
  // PDFs
  RooUniform signalPdf ("signalPdf","signalPdf",flatUnit);
  RooUniform backgroundPdf ("backgroundPdf","backgroundPdf",flatUnit);
  RooAddPdf modelPdf ("model","model",RooArgList(signalPdf,backgroundPdf),RooArgList(signal,bkg));
  RooExtendPdf modelBkgPdf ("modelBkg","modelBkg",backgroundPdf,bkg);
  RooGaussian priorBkgPdf ("priorBkg","priorBkg",bkg,bkgMeanVar,bkgSigmaVar);
  
  RooDataSet* data =  modelPdf.generate(flatUnit, nObserved);
  
  HybridCalculator hc(*data, modelPdf, modelBkgPdf, &nuisPar, &priorBkgPdf);
  hc.SetTestStatistic(2); // # of events
  hc.SetNumberOfToys(nToys);
  hc.UseNuisance(true);                            
  HypoTestInverter myInverter(hc,signal);
  double targetP = 0.05; // 95% C.L.
  myInverter.RunAutoScan(0, signalMaxExpected, targetP, 0.1*targetP);  
  HypoTestInverterResult* results = myInverter.GetInterval();
  results->SetConfidenceLevel (1-2.*targetP);
  double upperLimit = results->UpperLimit();
  delete data;
  // delete results;
  return upperLimit;
}