52 ClassImp(TFeldmanCousins);
57 TFeldmanCousins::TFeldmanCousins(Double_t newFC, TString options)
65 if (options.Contains(
"q")) fQUICK = 1;
79 TFeldmanCousins::~TFeldmanCousins()
88 Double_t TFeldmanCousins::CalculateLowerLimit(Double_t Nobserved, Double_t Nbackground)
90 CalculateUpperLimit(Nobserved, Nbackground);
100 Double_t TFeldmanCousins::CalculateUpperLimit(Double_t Nobserved, Double_t Nbackground)
102 fNobserved = Nobserved;
103 fNbackground = Nbackground;
109 Double_t min = -999.0;
114 for(i = 0; i <= fNMuStep; i++) {
115 mu = fMuMin + (Double_t)i*fMuStep;
116 Int_t goodChoice = FindLimitsFromTable( mu );
131 Double_t quickJump = 0.0;
132 if (fQUICK) quickJump = Nobserved-Nbackground-fMuMin;
133 if (quickJump < 0.0) quickJump = 0.0;
135 for(i = iLower+1; i <= fNMuStep; i++) {
136 mu = fMuMin + (Double_t)i*fMuStep + quickJump;
137 Int_t goodChoice = FindLimitsFromTable( mu );
155 Int_t TFeldmanCousins::FindLimitsFromTable( Double_t mu )
157 Double_t *p =
new Double_t[fNMax];
158 Double_t *r =
new Double_t[fNMax];
159 Int_t *rank =
new Int_t[fNMax];
160 Double_t *muBest =
new Double_t[fNMax];
161 Double_t *probMuBest =
new Double_t[fNMax];
165 for(i = 0; i < fNMax; i++) {
166 muBest[i] = (Double_t)(i - fNbackground);
167 if(muBest[i]<0.0) muBest[i] = 0.0;
168 probMuBest[i] = Prob(i, muBest[i], fNbackground);
169 p[i] = Prob(i, mu, fNbackground);
170 if(probMuBest[i] == 0.0) r[i] = 0.0;
171 else r[i] = p[i]/probMuBest[i];
175 TMath::Sort(fNMax, r, rank);
179 Int_t iMax = rank[0];
180 Int_t iMin = rank[0];
181 for(i = 0; i < fNMax; i++) {
183 if(iMax < rank[i]) iMax = rank[i];
184 if(iMin > rank[i]) iMin = rank[i];
185 if(sum >= fCL)
break;
192 delete [] probMuBest;
194 if((fNobserved <= iMax) && (fNobserved >= iMin))
return 1;
201 Double_t TFeldmanCousins::Prob(Int_t N, Double_t mu, Double_t B)
203 return TMath::Poisson( N, mu+B);
209 void TFeldmanCousins::SetMuMax(Double_t newMax)
212 fNMax = (Int_t)newMax;
219 void TFeldmanCousins::SetMuStep(Double_t newMuStep)
221 if(newMuStep == 0.0) {
222 std::cout <<
"TFeldmanCousins::SetMuStep ERROR New step size is zero - unable to change value"<< std::endl;
226 fNMuStep = (Int_t)((fMuMax - fMuMin)/fMuStep);