104 Int_t nmc,
bool stat,
117 for (i = 0; i <= data->GetSignal()->GetLast(); i++) {
118 maxbins = (((
TH1 *) (data->GetSignal()->At(i)))->GetNbinsX() + 2) > maxbins ?
119 (((
TH1 *) (data->GetSignal()->At(i)))->GetNbinsX() + 2) : maxbins;
120 nsig += ((
TH1 *) (data->GetSignal()->At(i)))->Integral();
121 nbg += ((
TH1 *) (data->GetBackground()->At(i)))->Integral();
122 ncand += (
Int_t) ((
TH1 *) (data->GetCandidates()->At(i)))->Integral();
128 fgTable->Set(maxbins * (data->GetSignal()->GetLast() + 1));
129 for (
Int_t channel = 0; channel <= data->GetSignal()->GetLast(); channel++)
131 bin <= ((
TH1 *) (data->GetSignal()->At(channel)))->GetNbinsX()+1;
134 Double_t b = (
Double_t) ((
TH1 *) (data->GetBackground()->At(channel)))->GetBinContent(bin);
135 Double_t d = (
Double_t) ((
TH1 *) (data->GetCandidates()->At(channel)))->GetBinContent(bin);
137 if ((b == 0) && (s > 0)) {
138 std::cout <<
"WARNING: Ignoring bin " << bin <<
" of channel "
139 << channel <<
" which has s=" << s <<
" but b=" << b << std::endl;
140 std::cout <<
" Maybe the MC statistic has to be improved..." << std::endl;
142 if ((s > 0) && (b > 0))
143 buffer += LogLikelihood(s, b, b, d);
147 if ((s > 0) && (b > 0))
148 fgTable->AddAt(LogLikelihood(s, b, b, 1), (channel * maxbins) + bin);
149 else if ((s > 0) && (b == 0))
150 fgTable->AddAt(20, (channel * maxbins) + bin);
165 for (i = 0; i < nmc; i++) {
171 TLimitDataSource* fluctuated = Fluctuate(data, tmp_src, !i, myrandom, stat) ? tmp_src : data;
175 TLimitDataSource* fluctuated2 = Fluctuate(data, tmp_src2,
false, myrandom, stat) ? tmp_src2 : data;
177 for (
Int_t channel = 0;
180 bin <=((
TH1 *) (fluctuated->
GetSignal()->
At(channel)))->GetNbinsX()+1;
187 tss[i] += rand * fgTable->At((channel * maxbins) + bin);
192 if ((s > 0) && (b2 > 0))
193 lrs[i] += LogLikelihood(s, b, b2, rand) - s - b + b2;
194 else if ((s > 0) && (b2 == 0))
195 lrs[i] += 20 * rand - s;
198 rand = myrandom->
Poisson(rate);
199 tsb[i] += rand * fgTable->At((channel * maxbins) + bin);
200 if ((s2 > 0) && (b > 0))
201 lrb[i] += LogLikelihood(s2, b2, b, rand) - s2 - b2 + b;
202 else if ((s > 0) && (b == 0))
203 lrb[i] += 20 * rand - s;
207 lrs[i] =
TMath::Exp(lrs[i] < 710 ? lrs[i] : 710);
208 lrb[i] =
TMath::Exp(lrb[i] < 710 ? lrb[i] : 710);
261 for(
int i=1; i<=newsignal->
GetNbinsX(); i++) {
268 for(
int i=1; i<=newbackground->
GetNbinsX(); i++)
284 toss[i] = generator->
Gaus(0, 1);
286 for (
Int_t channel = 0;
299 if ((serrf[channel] < -1.0) || (berrf[channel] < -0.9)) {
314 for(
int i=1; i<=newsignal->
GetNbinsX(); i++)
317 for(
int i=1; i<=newsignal->
GetNbinsX(); i++)
319 newsignal->
Scale(1 + serrf[channel]);
324 for(
int i=1; i<=newbackground->
GetNbinsX(); i++)
327 for(
int i=1; i<=newbackground->
GetNbinsX(); i++)
329 newbackground->
Scale(1 + berrf[channel]);
338 Int_t nmc,
bool stat,
351 Int_t nmc,
bool stat,
369 TH1D* sh =
new TH1D(
"__sh",
"__sh",1,0,2);
371 TH1D* bh =
new TH1D(
"__bh",
"__bh",1,0,2);
373 TH1D* dh =
new TH1D(
"__dh",
"__dh",1,0,2);
392 TH1D* sh =
new TH1D(
"__sh",
"__sh",1,0,2);
394 TH1D* bh =
new TH1D(
"__bh",
"__bh",1,0,2);
396 TH1D* dh =
new TH1D(
"__dh",
"__dh",1,0,2);
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Random number generator class based on M.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Collectable string class.
virtual void SetDirectory(TDirectory *dir)
By default when an histogram is created, it is added to the list of histogram objects in the current ...
Int_t GetLast() const
Return index of last object in array.
virtual Double_t Gaus(Double_t mean=0, Double_t sigma=1)
Samples a random number from the standard Normal (Gaussian) Distribution with the given mean and sigm...
void AddLast(TObject *obj)
Add object at the end of the collection.
void SetLRB(Double_t *in)
static Double_t LogLikelihood(Double_t s, Double_t b, Double_t b2, Double_t d)
static bool Fluctuate(TLimitDataSource *input, TLimitDataSource *output, bool init, TRandom *, bool stat=false)
static TOrdCollection * fgSystNames
virtual Int_t GetNbinsX() const
This class serves as interface to feed data into the TLimit routines.
TIterator * MakeIterator(Bool_t dir=kIterForward) const
Returns an array iterator.
Iterator abstract base class.
Int_t IndexOf(const TObject *obj) const
Return index of object in collection.
void SetStot(Double_t in)
virtual TObject * Clone(const char *newname="") const
Make a clone of an object using the Streamer facility.
void SetLRS(Double_t *in)
virtual TObjArray * GetBackground()
This is the base class for the ROOT Random number generators.
void SetBtot(Double_t in)
Algorithm to compute 95% C.L.
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
static TConfidenceLevel * ComputeLimit(TLimitDataSource *data, Int_t nmc=50000, bool stat=false, TRandom *generator=0)
Class to compute 95% CL limits.
1-D histogram with a double per channel (see TH1 documentation)}
void SetTSS(Double_t *in)
Set the TSS.
void SetTSB(Double_t *in)
Set the TSB.
virtual void SetOwner(bool swtch=kTRUE)
void Sort()
If objects in collection are sortable (i.e.
virtual Int_t GetSize() const
Array of doubles (64 bits per element).
Int_t BinarySearch(TObject *obj)
Find object using a binary search.
virtual TObjArray * GetErrorNames()
virtual TObjArray * GetErrorOnSignal()
virtual TObjArray * GetSignal()
virtual TObject * Next()=0
virtual TObjArray * GetErrorOnBackground()
virtual Int_t Poisson(Double_t mean)
Generates a random integer N according to a Poisson law.
TObject * At(Int_t idx) const
static void output(int code)
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.