1 | // @(#)root/physics:$Name: not supported by cvs2svn $:$Id: MRolke.cc,v 1.2 2006-10-17 16:32:52 meyer Exp $
|
---|
2 | // Author: Jan Conrad 9/2/2004
|
---|
3 |
|
---|
4 | /*************************************************************************
|
---|
5 | * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers. *
|
---|
6 | * All rights reserved. *
|
---|
7 | * *
|
---|
8 | * For the licensing terms see $ROOTSYS/LICENSE. *
|
---|
9 | * For the list of contributors see $ROOTSYS/README/CREDITS. *
|
---|
10 | *************************************************************************/
|
---|
11 |
|
---|
12 | //////////////////////////////////////////////////////////////////////////////
|
---|
13 | //
|
---|
14 | // MRolke
|
---|
15 | //
|
---|
16 | // This class computes confidence intervals for the rate of a Poisson
|
---|
17 | // in the presence of background and efficiency with a fully frequentist
|
---|
18 | // treatment of the uncertainties in the efficiency and background estimate
|
---|
19 | // using the profile likelihood method.
|
---|
20 | //
|
---|
21 | // The signal is always assumed to be Poisson.
|
---|
22 | //
|
---|
23 | // The method is very similar to the one used in MINUIT (MINOS).
|
---|
24 | //
|
---|
25 | // Two options are offered to deal with cases where the maximum likelihood
|
---|
26 | // estimate (MLE) is not in the physical region. Version "bounded likelihood"
|
---|
27 | // is the one used by MINOS if bounds for the physical region are chosen. Versi// on "unbounded likelihood (the default) allows the MLE to be in the
|
---|
28 | // unphysical region. It has however better coverage.
|
---|
29 | // For more details consult the reference (see below).
|
---|
30 | //
|
---|
31 | //
|
---|
32 | // It allows the following Models:
|
---|
33 | //
|
---|
34 | // 1: Background - Poisson, Efficiency - Binomial (cl,x,y,z,tau,m)
|
---|
35 | // 2: Background - Poisson, Efficiency - Gaussian (cl,xd,y,em,tau,sde)
|
---|
36 | // 3: Background - Gaussian, Efficiency - Gaussian (cl,x,bm,em,sd)
|
---|
37 | // 4: Background - Poisson, Efficiency - known (cl,x,y,tau,e)
|
---|
38 | // 5: Background - Gaussian, Efficiency - known (cl,x,y,z,sdb,e)
|
---|
39 | // 6: Background - known, Efficiency - Binomial (cl,x,z,m,b)
|
---|
40 | // 7: Background - known, Efficiency - Gaussian (cl,x,em,sde,b)
|
---|
41 | //
|
---|
42 | // Parameter definition:
|
---|
43 | //
|
---|
44 | // cl = Confidence level
|
---|
45 | //
|
---|
46 | // x = number of observed events
|
---|
47 | //
|
---|
48 | // y = number of background events
|
---|
49 | //
|
---|
50 | // z = number of simulated signal events
|
---|
51 | //
|
---|
52 | // em = measurement of the efficiency.
|
---|
53 | //
|
---|
54 | // bm = background estimate
|
---|
55 | //
|
---|
56 | // tau = ratio between signal and background region (in case background is
|
---|
57 | // observed) ratio between observed and simulated livetime in case
|
---|
58 | // background is determined from MC.
|
---|
59 | //
|
---|
60 | // sd(x) = sigma of the Gaussian
|
---|
61 | //
|
---|
62 | // e = true efficiency (in case known)
|
---|
63 | //
|
---|
64 | // b = expected background (in case known)
|
---|
65 | //
|
---|
66 | // m = number of MC runs
|
---|
67 | //
|
---|
68 | // mid = ID number of the model ...
|
---|
69 | //
|
---|
70 | // For a description of the method and its properties:
|
---|
71 | //
|
---|
72 | // W.Rolke, A. Lopez, J. Conrad and Fred James
|
---|
73 | // "Limits and Confidence Intervals in presence of nuisance parameters"
|
---|
74 | // http://lanl.arxiv.org/abs/physics/0403059
|
---|
75 | // Nucl.Instrum.Meth.A551:493-503,2005
|
---|
76 | //
|
---|
77 | // Should I use MRolke, TFeldmanCousins, TLimit?
|
---|
78 | // ============================================
|
---|
79 | // 1. I guess MRolke makes TFeldmanCousins obsolete?
|
---|
80 | //
|
---|
81 | // Certainly not. TFeldmanCousins is the fully frequentist construction and
|
---|
82 | // should be used in case of no (or negligible uncertainties). It is however
|
---|
83 | // not capable of treating uncertainties in nuisance parameters.
|
---|
84 | // MRolke is desined for this case and it is shown in the reference above
|
---|
85 | // that it has good coverage properties for most cases, ie it might be
|
---|
86 | // used where FeldmannCousins can't.
|
---|
87 | //
|
---|
88 | // 2. What are the advantages of MRolke over TLimit?
|
---|
89 | //
|
---|
90 | // MRolke is fully frequentist. TLimit treats nuisance parameters Bayesian.
|
---|
91 | // For a coverage study of a Bayesian method refer to
|
---|
92 | // physics/0408039 (Tegenfeldt & J.C). However, this note studies
|
---|
93 | // the coverage of Feldman&Cousins with Bayesian treatment of nuisance
|
---|
94 | // parameters. To make a long story short: using the Bayesian method you
|
---|
95 | // might introduce a small amount of over-coverage (though I haven't shown it
|
---|
96 | // for TLimit). On the other hand, coverage of course is a not so interesting
|
---|
97 | // when you consider yourself a Bayesian.
|
---|
98 | //
|
---|
99 | // Author: Jan Conrad (CERN)
|
---|
100 | //
|
---|
101 | // see example in tutorial Rolke.C
|
---|
102 | //
|
---|
103 | // Copyright CERN 2004 Jan.Conrad@cern.ch
|
---|
104 | //
|
---|
105 | ///////////////////////////////////////////////////////////////////////////
|
---|
106 |
|
---|
107 |
|
---|
108 | #include "MRolke.h"
|
---|
109 | #include "TMath.h"
|
---|
110 | #include "Riostream.h"
|
---|
111 |
|
---|
112 | ClassImp(MRolke)
|
---|
113 |
|
---|
114 | //__________________________________________________________________________
|
---|
115 | MRolke::MRolke(Double_t CL, Option_t * /*option*/)
|
---|
116 | {
|
---|
117 | //constructor
|
---|
118 | fUpperLimit = 0.0;
|
---|
119 | fLowerLimit = 0.0;
|
---|
120 | fCL = CL;
|
---|
121 | fSwitch = 0; // 0: unbounded likelihood
|
---|
122 | // 1: bounded likelihood
|
---|
123 | }
|
---|
124 |
|
---|
125 | //___________________________________________________________________________
|
---|
126 | MRolke::~MRolke()
|
---|
127 | {
|
---|
128 | }
|
---|
129 |
|
---|
130 |
|
---|
131 | //___________________________________________________________________________
|
---|
132 | Double_t MRolke::CalculateInterval(Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em,Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m)
|
---|
133 | {
|
---|
134 | //calculate interval
|
---|
135 | Int_t done = 0;
|
---|
136 | Double_t limit[2];
|
---|
137 |
|
---|
138 | limit[1] = Interval(x,y,z,bm,em,e,mid, sde,sdb,tau,b,m);
|
---|
139 |
|
---|
140 | if (limit[1] > 0) {
|
---|
141 | done = 1;
|
---|
142 | }
|
---|
143 |
|
---|
144 | if (fSwitch == 0) {
|
---|
145 |
|
---|
146 | Int_t trial_x = x;
|
---|
147 |
|
---|
148 | while (done == 0) {
|
---|
149 | trial_x++;
|
---|
150 | limit[1] = Interval(trial_x,y,z,bm,em,e,mid, sde,sdb,tau,b,m);
|
---|
151 | if (limit[1] > 0) done = 1;
|
---|
152 | }
|
---|
153 | }
|
---|
154 |
|
---|
155 | return limit[1];
|
---|
156 | }
|
---|
157 |
|
---|
158 |
|
---|
159 |
|
---|
160 |
|
---|
161 | //_____________________________________________________________________
|
---|
162 | Double_t MRolke::Interval(Int_t x, Int_t y, Int_t z, Double_t bm, Double_t em,Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m)
|
---|
163 | {
|
---|
164 | // Calculates the Confidence Interval
|
---|
165 |
|
---|
166 | //Double_t dchi2 = Chi2Percentile(1,1-fCL);
|
---|
167 | Double_t dchi2 = TMath::ChisquareQuantile(fCL, 1);
|
---|
168 |
|
---|
169 | Double_t tempxy[2],limits[2] = {0,0};
|
---|
170 | Double_t slope,fmid,low,flow,high,fhigh,test,ftest,mu0,maximum,target,l,f0;
|
---|
171 | Double_t med = 0;
|
---|
172 | Double_t maxiter=1000, acc = 0.00001;
|
---|
173 | Int_t i;
|
---|
174 | Int_t bp = 0;
|
---|
175 |
|
---|
176 | if ((mid != 3) && (mid != 5)) bm = (Double_t)y;
|
---|
177 |
|
---|
178 | if ((mid == 3) || (mid == 5)) {
|
---|
179 | if (bm == 0) bm = 0.00001;
|
---|
180 | }
|
---|
181 |
|
---|
182 | if ((mid <= 2) || (mid == 4)) bp = 1;
|
---|
183 |
|
---|
184 |
|
---|
185 | if (bp == 1 && x == 0 && bm > 0 ){
|
---|
186 |
|
---|
187 | for(Int_t i = 0; i < 2; i++) {
|
---|
188 | x++;
|
---|
189 | tempxy[i] = Interval(x,y,z,bm,em,e,mid,sde,sdb,tau,b,m);
|
---|
190 | }
|
---|
191 | slope = tempxy[1] - tempxy[0];
|
---|
192 | limits[1] = tempxy[0] - slope;
|
---|
193 | limits[0] = 0.0;
|
---|
194 | if (limits[1] < 0) limits[1] = 0.0;
|
---|
195 | goto done;
|
---|
196 | }
|
---|
197 |
|
---|
198 | if (bp != 1 && x == 0){
|
---|
199 |
|
---|
200 | for(Int_t i = 0; i < 2; i++) {
|
---|
201 | x++;
|
---|
202 | tempxy[i] = Interval(x,y,z,bm,em,e,mid,sde,sdb,tau,b,m);
|
---|
203 | }
|
---|
204 | slope = tempxy[1] - tempxy[0];
|
---|
205 | limits[1] = tempxy[0] - slope;
|
---|
206 | limits[0] = 0.0;
|
---|
207 | if (limits[1] < 0) limits[1] = 0.0;
|
---|
208 | goto done;
|
---|
209 | }
|
---|
210 |
|
---|
211 | if (bp != 1 && bm == 0){
|
---|
212 | for(Int_t i = 0; i < 2; i++) {
|
---|
213 | bm++;
|
---|
214 | limits[1] = Interval(x,y,z,bm,em,e,mid,sde,sdb,tau,b,m);
|
---|
215 | tempxy[i] = limits[1];
|
---|
216 | }
|
---|
217 | slope = tempxy[1] - tempxy[0];
|
---|
218 | limits[1] = tempxy[0] - slope;
|
---|
219 | if (limits[1] < 0) limits[1] = 0;
|
---|
220 | goto done;
|
---|
221 | }
|
---|
222 |
|
---|
223 |
|
---|
224 | if (x == 0 && bm == 0){
|
---|
225 | x++;
|
---|
226 | bm++;
|
---|
227 |
|
---|
228 | limits[1] = Interval(x,y,z,bm,em,e,mid,sde,sdb,tau,b,m);
|
---|
229 | tempxy[0] = limits[1];
|
---|
230 | x = 1;
|
---|
231 | bm = 2;
|
---|
232 | limits[1] = Interval(x,y,z,bm,em,e,mid,sde,sdb,tau,b,m);
|
---|
233 | tempxy[1] = limits[1];
|
---|
234 | x = 2;
|
---|
235 | bm = 1;
|
---|
236 | limits[1] = Interval(x,y,z,bm,em,e,mid,sde,sdb,tau,b,m);
|
---|
237 | limits[1] = 3*tempxy[0] -tempxy[1] - limits[1];
|
---|
238 | if (limits[1] < 0) limits[1] = 0;
|
---|
239 | goto done;
|
---|
240 | }
|
---|
241 |
|
---|
242 | mu0 = Likelihood(0,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,1);
|
---|
243 |
|
---|
244 | maximum = Likelihood(0,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,2);
|
---|
245 |
|
---|
246 | test = 0;
|
---|
247 |
|
---|
248 | f0 = Likelihood(test,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,3);
|
---|
249 |
|
---|
250 | if ( fSwitch == 1 ) { // do this only for the unbounded likelihood case
|
---|
251 | if ( mu0 < 0 ) maximum = f0;
|
---|
252 | }
|
---|
253 |
|
---|
254 | target = maximum - dchi2;
|
---|
255 |
|
---|
256 | if (f0 > target) {
|
---|
257 | limits[0] = 0;
|
---|
258 | } else {
|
---|
259 | if (mu0 < 0){
|
---|
260 | limits[0] = 0;
|
---|
261 | limits[1] = 0;
|
---|
262 | }
|
---|
263 |
|
---|
264 | low = 0;
|
---|
265 | flow = f0;
|
---|
266 | high = mu0;
|
---|
267 | fhigh = maximum;
|
---|
268 |
|
---|
269 | for(Int_t i = 0; i < maxiter; i++) {
|
---|
270 | l = (target-fhigh)/(flow-fhigh);
|
---|
271 | if (l < 0.2) l = 0.2;
|
---|
272 | if (l > 0.8) l = 0.8;
|
---|
273 |
|
---|
274 | med = l*low + (1-l)*high;
|
---|
275 | if(med < 0.01){
|
---|
276 | limits[1]=0.0;
|
---|
277 | goto done;
|
---|
278 | }
|
---|
279 |
|
---|
280 | fmid = Likelihood(med,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,3);
|
---|
281 |
|
---|
282 | if (fmid > target) {
|
---|
283 | high = med;
|
---|
284 | fhigh = fmid;
|
---|
285 | } else {
|
---|
286 | low = med;
|
---|
287 | flow = fmid;
|
---|
288 | }
|
---|
289 | if ((high-low) < acc*high) break;
|
---|
290 | }
|
---|
291 | limits[0] = med;
|
---|
292 | }
|
---|
293 |
|
---|
294 |
|
---|
295 | if(mu0 > 0) {
|
---|
296 | low = mu0;
|
---|
297 | flow = maximum;
|
---|
298 | } else {
|
---|
299 | low = 0;
|
---|
300 | flow = f0;
|
---|
301 | }
|
---|
302 |
|
---|
303 | test = low +1 ;
|
---|
304 |
|
---|
305 | ftest = Likelihood(test,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,3);
|
---|
306 |
|
---|
307 | if (ftest < target) {
|
---|
308 | high = test;
|
---|
309 | fhigh = ftest;
|
---|
310 | } else {
|
---|
311 | slope = (ftest - flow)/(test - low);
|
---|
312 | high = test + (target -ftest)/slope;
|
---|
313 | fhigh = Likelihood(high,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,3);
|
---|
314 | }
|
---|
315 |
|
---|
316 | for(i = 0; i < maxiter; i++) {
|
---|
317 | l = (target-fhigh)/(flow-fhigh);
|
---|
318 | if (l < 0.2) l = 0.2;
|
---|
319 | if (l > 0.8) l = 0.8;
|
---|
320 | med = l * low + (1.-l)*high;
|
---|
321 | fmid = Likelihood(med,x,y,z,bm,em,e,mid,sde,sdb,tau,b,m,3);
|
---|
322 |
|
---|
323 | if (fmid < target) {
|
---|
324 | high = med;
|
---|
325 | fhigh = fmid;
|
---|
326 | } else {
|
---|
327 | low = med;
|
---|
328 | flow = fmid;
|
---|
329 | }
|
---|
330 | if (high-low < acc*high) break;
|
---|
331 | }
|
---|
332 | limits[1] = med;
|
---|
333 |
|
---|
334 | done:
|
---|
335 |
|
---|
336 | if ( (mid == 4) || (mid==5) ) {
|
---|
337 | limits[0] /= e;
|
---|
338 | limits[1] /= e;
|
---|
339 | }
|
---|
340 |
|
---|
341 |
|
---|
342 | fUpperLimit = limits[1];
|
---|
343 | fLowerLimit = TMath::Max(limits[0],0.0);
|
---|
344 |
|
---|
345 |
|
---|
346 | return limits[1];
|
---|
347 | }
|
---|
348 |
|
---|
349 |
|
---|
350 | //___________________________________________________________________________
|
---|
351 | Double_t MRolke::Likelihood(Double_t mu, Int_t x, Int_t y, Int_t z, Double_t bm,Double_t em, Double_t e, Int_t mid, Double_t sde, Double_t sdb, Double_t tau, Double_t b, Int_t m, Int_t what)
|
---|
352 | {
|
---|
353 | // Chooses between the different profile likelihood functions to use for the
|
---|
354 | // different models.
|
---|
355 | // Returns evaluation of the profile likelihood functions.
|
---|
356 |
|
---|
357 | switch (mid) {
|
---|
358 | case 1: return EvalLikeMod1(mu,x,y,z,e,tau,b,m,what);
|
---|
359 | case 2: return EvalLikeMod2(mu,x,y,em,e,sde,tau,b,what);
|
---|
360 | case 3: return EvalLikeMod3(mu,x,bm,em,e,sde,sdb,b,what);
|
---|
361 | case 4: return EvalLikeMod4(mu,x,y,tau,b,what);
|
---|
362 | case 5: return EvalLikeMod5(mu,x,bm,sdb,b,what);
|
---|
363 | case 6: return EvalLikeMod6(mu,x,z,e,b,m,what);
|
---|
364 | case 7: return EvalLikeMod7(mu,x,em,e,sde,b,what);
|
---|
365 | }
|
---|
366 |
|
---|
367 | return 0;
|
---|
368 | }
|
---|
369 |
|
---|
370 | //_________________________________________________________________________
|
---|
371 | Double_t MRolke::EvalLikeMod1(Double_t mu, Int_t x, Int_t y, Int_t z, Double_t e, Double_t tau, Double_t b, Int_t m, Int_t what)
|
---|
372 | {
|
---|
373 | // Calculates the Profile Likelihood for MODEL 1:
|
---|
374 | // Poisson background/ Binomial Efficiency
|
---|
375 | // what = 1: Maximum likelihood estimate is returned
|
---|
376 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
377 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
378 | // otherwise parameters as described in the beginning of the class)
|
---|
379 |
|
---|
380 | Double_t f = 0;
|
---|
381 | Double_t zm = Double_t(z)/m;
|
---|
382 |
|
---|
383 | if (what == 1) {
|
---|
384 | f = (x-y/tau)/zm;
|
---|
385 | }
|
---|
386 |
|
---|
387 | if (what == 2) {
|
---|
388 | mu = (x-y/tau)/zm;
|
---|
389 | b = y/tau;
|
---|
390 | Double_t e = zm;
|
---|
391 | f = LikeMod1(mu,b,e,x,y,z,tau,m);
|
---|
392 | }
|
---|
393 |
|
---|
394 | if (what == 3) {
|
---|
395 | if (mu == 0){
|
---|
396 | b = (x+y)/(1.0+tau);
|
---|
397 | e = zm;
|
---|
398 | f = LikeMod1(mu,b,e,x,y,z,tau,m);
|
---|
399 | } else {
|
---|
400 | MRolke g;
|
---|
401 | g.ProfLikeMod1(mu,b,e,x,y,z,tau,m);
|
---|
402 | f = LikeMod1(mu,b,e,x,y,z,tau,m);
|
---|
403 | }
|
---|
404 | }
|
---|
405 |
|
---|
406 | return f;
|
---|
407 | }
|
---|
408 |
|
---|
409 | //________________________________________________________________________
|
---|
410 | Double_t MRolke::LikeMod1(Double_t mu,Double_t b, Double_t e, Int_t x, Int_t y, Int_t z, Double_t tau, Int_t m)
|
---|
411 | {
|
---|
412 | // Profile Likelihood function for MODEL 1:
|
---|
413 | // Poisson background/ Binomial Efficiency
|
---|
414 |
|
---|
415 | return 2*(x*TMath::Log(e*mu+b)-(e*mu +b)-LogFactorial(x)+y*TMath::Log(tau*b)-tau*b-LogFactorial(y) + TMath::Log(TMath::Factorial(m)) - TMath::Log(TMath::Factorial(m-z)) - TMath::Log(TMath::Factorial(z))+ z * TMath::Log(e) + (m-z)*TMath::Log(1-e));
|
---|
416 | }
|
---|
417 |
|
---|
418 | //________________________________________________________________________
|
---|
419 | void MRolke::ProfLikeMod1(Double_t mu,Double_t &b,Double_t &e,Int_t x,Int_t y, Int_t z,Double_t tau,Int_t m)
|
---|
420 | {
|
---|
421 | // Void needed to calculate estimates of efficiency and background for model 1
|
---|
422 |
|
---|
423 | Double_t med = 0.0,fmid;
|
---|
424 | Int_t maxiter =1000;
|
---|
425 | Double_t acc = 0.00001;
|
---|
426 | Double_t emin = ((m+mu*tau)-TMath::Sqrt((m+mu*tau)*(m+mu*tau)-4 * mu* tau * z))/2/mu/tau;
|
---|
427 |
|
---|
428 | Double_t low = TMath::Max(1e-10,emin+1e-10);
|
---|
429 | Double_t high = 1 - 1e-10;
|
---|
430 |
|
---|
431 | for(Int_t i = 0; i < maxiter; i++) {
|
---|
432 | med = (low+high)/2.;
|
---|
433 |
|
---|
434 | fmid = LikeGradMod1(med,mu,x,y,z,tau,m);
|
---|
435 |
|
---|
436 | if(high < 0.5) acc = 0.00001*high;
|
---|
437 | else acc = 0.00001*(1-high);
|
---|
438 |
|
---|
439 | if ((high - low) < acc*high) break;
|
---|
440 |
|
---|
441 | if(fmid > 0) low = med;
|
---|
442 | else high = med;
|
---|
443 | }
|
---|
444 |
|
---|
445 | e = med;
|
---|
446 | Double_t eta = Double_t(z)/e -Double_t(m-z)/(1-e);
|
---|
447 |
|
---|
448 | b = Double_t(y)/(tau -eta/mu);
|
---|
449 | }
|
---|
450 |
|
---|
451 | //___________________________________________________________________________
|
---|
452 | Double_t MRolke::LikeGradMod1(Double_t e, Double_t mu, Int_t x,Int_t y,Int_t z,Double_t tau,Int_t m)
|
---|
453 | {
|
---|
454 | //gradient model
|
---|
455 | Double_t eta, etaprime, bprime,f;
|
---|
456 | eta = static_cast<double>(z)/e - static_cast<double>(m-z)/(1.0 - e);
|
---|
457 | etaprime = (-1) * (static_cast<double>(m-z)/((1.0 - e)*(1.0 - e)) + static_cast<double>(z)/(e*e));
|
---|
458 | Double_t b = y/(tau - eta/mu);
|
---|
459 | bprime = (b*b * etaprime)/mu/y;
|
---|
460 | f = (mu + bprime) * (x/(e * mu + b) - 1)+(y/b - tau) * bprime + eta;
|
---|
461 | return f;
|
---|
462 | }
|
---|
463 |
|
---|
464 | //___________________________________________________________________________
|
---|
465 | Double_t MRolke::EvalLikeMod2(Double_t mu, Int_t x, Int_t y, Double_t em, Double_t e,Double_t sde, Double_t tau, Double_t b, Int_t what)
|
---|
466 | {
|
---|
467 | // Calculates the Profile Likelihood for MODEL 2:
|
---|
468 | // Poisson background/ Gauss Efficiency
|
---|
469 | // what = 1: Maximum likelihood estimate is returned
|
---|
470 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
471 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
472 | // otherwise parameters as described in the beginning of the class)
|
---|
473 |
|
---|
474 | Double_t v = sde*sde;
|
---|
475 | Double_t coef[4],roots[3];
|
---|
476 | Double_t f = 0;
|
---|
477 |
|
---|
478 | if (what == 1) {
|
---|
479 | f = (x-y/tau)/em;
|
---|
480 | }
|
---|
481 |
|
---|
482 | if (what == 2) {
|
---|
483 | mu = (x-y/tau)/em;
|
---|
484 | b = y/tau;
|
---|
485 | e = em;
|
---|
486 | f = LikeMod2(mu,b,e,x,y,em,tau,v);
|
---|
487 | }
|
---|
488 |
|
---|
489 | if (what == 3) {
|
---|
490 | if (mu == 0 ) {
|
---|
491 | b = (x+y)/(1+tau);
|
---|
492 | f = LikeMod2(mu,b,e,x,y,em,tau,v);
|
---|
493 | } else {
|
---|
494 | coef[3] = mu;
|
---|
495 | coef[2] = mu*mu*v-2*em*mu-mu*mu*v*tau;
|
---|
496 | coef[1] = ( - x)*mu*v - mu*mu*mu*v*v*tau - mu*mu*v*em + em*mu*mu*v*tau + em*em*mu - y*mu*v;
|
---|
497 | coef[0] = x*mu*mu*v*v*tau + x*em*mu*v - y*mu*mu*v*v + y*em*mu*v;
|
---|
498 |
|
---|
499 | TMath::RootsCubic(coef,roots[0],roots[1],roots[2]);
|
---|
500 |
|
---|
501 | e = roots[1];
|
---|
502 | b = y/(tau + (em - e)/mu/v);
|
---|
503 | f = LikeMod2(mu,b,e,x,y,em,tau,v);
|
---|
504 | }
|
---|
505 | }
|
---|
506 |
|
---|
507 | return f;
|
---|
508 | }
|
---|
509 |
|
---|
510 | //_________________________________________________________________________
|
---|
511 | Double_t MRolke::LikeMod2(Double_t mu, Double_t b, Double_t e,Int_t x,Int_t y,Double_t em,Double_t tau, Double_t v)
|
---|
512 | {
|
---|
513 | // Profile Likelihood function for MODEL 2:
|
---|
514 | // Poisson background/Gauss Efficiency
|
---|
515 |
|
---|
516 | return 2*(x*TMath::Log(e*mu+b)-(e*mu+b)-LogFactorial(x)+y*TMath::Log(tau*b)-tau*b-LogFactorial(y)-0.9189385-TMath::Log(v)/2-(em-e)*(em-e)/v/2);
|
---|
517 | }
|
---|
518 |
|
---|
519 | //_____________________________________________________________________
|
---|
520 |
|
---|
521 | Double_t MRolke::EvalLikeMod3(Double_t mu, Int_t x, Double_t bm, Double_t em, Double_t e, Double_t sde, Double_t sdb, Double_t b, Int_t what)
|
---|
522 | {
|
---|
523 | // Calculates the Profile Likelihood for MODEL 3:
|
---|
524 | // Gauss background/ Gauss Efficiency
|
---|
525 | // what = 1: Maximum likelihood estimate is returned
|
---|
526 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
527 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
528 | // otherwise parameters as described in the beginning of the class)
|
---|
529 |
|
---|
530 | Double_t f = 0.;
|
---|
531 | Double_t v = sde*sde;
|
---|
532 | Double_t u = sdb*sdb;
|
---|
533 |
|
---|
534 | if (what == 1) {
|
---|
535 | f = (x-bm)/em;
|
---|
536 | }
|
---|
537 |
|
---|
538 |
|
---|
539 | if (what == 2) {
|
---|
540 | mu = (x-bm)/em;
|
---|
541 | b = bm;
|
---|
542 | e = em;
|
---|
543 | f = LikeMod3(mu,b,e,x,bm,em,u,v);
|
---|
544 | }
|
---|
545 |
|
---|
546 |
|
---|
547 | if(what == 3) {
|
---|
548 | if(mu == 0.0){
|
---|
549 | b = ((bm-u)+TMath::Sqrt((bm-u)*(bm-u)+4*x*u))/2.;
|
---|
550 | e = em;
|
---|
551 | f = LikeMod3(mu,b,e,x,bm,em,u,v);
|
---|
552 | } else {
|
---|
553 | Double_t temp[3];
|
---|
554 | temp[0] = mu*mu*v+u;
|
---|
555 | temp[1] = mu*mu*mu*v*v+mu*v*u-mu*mu*v*em+mu*v*bm-2*u*em;
|
---|
556 | temp[2] = mu*mu*v*v*bm-mu*v*u*em-mu*v*bm*em+u*em*em-mu*mu*v*v*x;
|
---|
557 | e = (-temp[1]+TMath::Sqrt(temp[1]*temp[1]-4*temp[0]*temp[2]))/2/temp[0];
|
---|
558 | b = bm-(u*(em-e))/v/mu;
|
---|
559 | f = LikeMod3(mu,b,e,x,bm,em,u,v);
|
---|
560 | }
|
---|
561 | }
|
---|
562 |
|
---|
563 | return f;
|
---|
564 | }
|
---|
565 |
|
---|
566 | //____________________________________________________________________
|
---|
567 | Double_t MRolke::LikeMod3(Double_t mu,Double_t b,Double_t e,Int_t x,Double_t bm,Double_t em,Double_t u,Double_t v)
|
---|
568 | {
|
---|
569 | // Profile Likelihood function for MODEL 3:
|
---|
570 | // Gauss background/Gauss Efficiency
|
---|
571 |
|
---|
572 | return 2*(x * TMath::Log(e*mu+b)-(e*mu+b)-LogFactorial(x)-1.837877-TMath::Log(u)/2-(bm-b)*(bm-b)/u/2-TMath::Log(v)/2-(em-e)*(em-e)/v/2);
|
---|
573 | }
|
---|
574 |
|
---|
575 | //____________________________________________________________________
|
---|
576 | Double_t MRolke::EvalLikeMod4(Double_t mu, Int_t x, Int_t y, Double_t tau, Double_t b, Int_t what)
|
---|
577 | {
|
---|
578 | // Calculates the Profile Likelihood for MODEL 4:
|
---|
579 | // Poiss background/Efficiency known
|
---|
580 | // what = 1: Maximum likelihood estimate is returned
|
---|
581 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
582 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
583 | // otherwise parameters as described in the beginning of the class)
|
---|
584 |
|
---|
585 | Double_t f = 0.0;
|
---|
586 |
|
---|
587 | if (what == 1) f = x-y/tau;
|
---|
588 | if (what == 2) {
|
---|
589 | mu = x-y/tau;
|
---|
590 | b = Double_t(y)/tau;
|
---|
591 | f = LikeMod4(mu,b,x,y,tau);
|
---|
592 | }
|
---|
593 | if (what == 3) {
|
---|
594 | if (mu == 0.0) {
|
---|
595 | b = Double_t(x+y)/(1+tau);
|
---|
596 | f = LikeMod4(mu,b,x,y,tau);
|
---|
597 | } else {
|
---|
598 | b = (x+y-(1+tau)*mu+sqrt((x+y-(1+tau)*mu)*(x+y-(1+tau)*mu)+4*(1+tau)*y*mu))/2/(1+tau);
|
---|
599 | f = LikeMod4(mu,b,x,y,tau);
|
---|
600 | }
|
---|
601 | }
|
---|
602 | return f;
|
---|
603 | }
|
---|
604 |
|
---|
605 | //___________________________________________________________________
|
---|
606 | Double_t MRolke::LikeMod4(Double_t mu,Double_t b,Int_t x,Int_t y,Double_t tau)
|
---|
607 | {
|
---|
608 | // Profile Likelihood function for MODEL 4:
|
---|
609 | // Poiss background/Efficiency known
|
---|
610 |
|
---|
611 | return 2*(x*TMath::Log(mu+b)-(mu+b)-LogFactorial(x)+y*TMath::Log(tau*b)-tau*b-LogFactorial(y) );
|
---|
612 | }
|
---|
613 |
|
---|
614 | //___________________________________________________________________
|
---|
615 | Double_t MRolke::EvalLikeMod5(Double_t mu, Int_t x, Double_t bm, Double_t sdb, Double_t b, Int_t what)
|
---|
616 | {
|
---|
617 | // Calculates the Profile Likelihood for MODEL 5:
|
---|
618 | // Gauss background/Efficiency known
|
---|
619 | // what = 1: Maximum likelihood estimate is returned
|
---|
620 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
621 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
622 | // otherwise parameters as described in the beginning of the class)
|
---|
623 |
|
---|
624 | Double_t u=sdb*sdb;
|
---|
625 | Double_t f = 0;
|
---|
626 |
|
---|
627 | if(what == 1) {
|
---|
628 | f = x - bm;
|
---|
629 | }
|
---|
630 | if(what == 2) {
|
---|
631 | mu = x-bm;
|
---|
632 | b = bm;
|
---|
633 | f = LikeMod5(mu,b,x,bm,u);
|
---|
634 | }
|
---|
635 |
|
---|
636 | if (what == 3) {
|
---|
637 | b = ((bm-u-mu)+TMath::Sqrt((bm-u-mu)*(bm-u-mu)-4*(mu*u-mu*bm-u*x)))/2;
|
---|
638 | f = LikeMod5(mu,b,x,bm,u);
|
---|
639 | }
|
---|
640 | return f;
|
---|
641 | }
|
---|
642 |
|
---|
643 | //_______________________________________________________________________
|
---|
644 | Double_t MRolke::LikeMod5(Double_t mu,Double_t b,Int_t x,Double_t bm,Double_t u)
|
---|
645 | {
|
---|
646 | // Profile Likelihood function for MODEL 5:
|
---|
647 | // Gauss background/Efficiency known
|
---|
648 |
|
---|
649 | return 2*(x*TMath::Log(mu+b)-(mu + b)-LogFactorial(x)-0.9189385-TMath::Log(u)/2-((bm-b)*(bm-b))/u/2);
|
---|
650 | }
|
---|
651 |
|
---|
652 | //_______________________________________________________________________
|
---|
653 | Double_t MRolke::EvalLikeMod6(Double_t mu, Int_t x, Int_t z, Double_t e, Double_t b, Int_t m, Int_t what)
|
---|
654 | {
|
---|
655 | // Calculates the Profile Likelihood for MODEL 6:
|
---|
656 | // Gauss known/Efficiency binomial
|
---|
657 | // what = 1: Maximum likelihood estimate is returned
|
---|
658 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
659 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
660 | // otherwise parameters as described in the beginning of the class)
|
---|
661 |
|
---|
662 | Double_t coef[4],roots[3];
|
---|
663 | Double_t f = 0.;
|
---|
664 | Double_t zm = Double_t(z)/m;
|
---|
665 |
|
---|
666 | if(what==1){
|
---|
667 | f = (x-b)/zm;
|
---|
668 | }
|
---|
669 |
|
---|
670 | if(what==2){
|
---|
671 | mu = (x-b)/zm;
|
---|
672 | e = zm;
|
---|
673 | f = LikeMod6(mu,b,e,x,z,m);
|
---|
674 | }
|
---|
675 | if(what == 3){
|
---|
676 | if(mu==0){
|
---|
677 | e = zm;
|
---|
678 | } else {
|
---|
679 | coef[3] = mu*mu;
|
---|
680 | coef[2] = mu * b - mu * x - mu*mu - mu * m;
|
---|
681 | coef[1] = mu * x - mu * b + mu * z - m * b;
|
---|
682 | coef[0] = b * z;
|
---|
683 | TMath::RootsCubic(coef,roots[0],roots[1],roots[2]);
|
---|
684 | e = roots[1];
|
---|
685 | }
|
---|
686 | f =LikeMod6(mu,b,e,x,z,m);
|
---|
687 | }
|
---|
688 | return f;
|
---|
689 | }
|
---|
690 |
|
---|
691 | //_______________________________________________________________________
|
---|
692 | Double_t MRolke::LikeMod6(Double_t mu,Double_t b,Double_t e,Int_t x,Int_t z,Int_t m)
|
---|
693 | {
|
---|
694 | // Profile Likelihood function for MODEL 6:
|
---|
695 | // background known/ Efficiency binomial
|
---|
696 |
|
---|
697 | Double_t f = 0.0;
|
---|
698 |
|
---|
699 | if (z > 100 || m > 100) {
|
---|
700 | f = 2*(x*TMath::Log(e*mu+b)-(e*mu+b)-LogFactorial(x)+(m*TMath::Log(m) - m)-(z*TMath::Log(z) - z) - ((m-z)*TMath::Log(m-z) - m + z)+z*TMath::Log(e)+(m-z)*TMath::Log(1-e));
|
---|
701 | } else {
|
---|
702 | f = 2*(x*TMath::Log(e*mu+b)-(e*mu+b)-LogFactorial(x)+TMath::Log(TMath::Factorial(m))-TMath::Log(TMath::Factorial(z))-TMath::Log(TMath::Factorial(m-z))+z*TMath::Log(e)+(m-z)*TMath::Log(1-e));
|
---|
703 | }
|
---|
704 | return f;
|
---|
705 | }
|
---|
706 |
|
---|
707 |
|
---|
708 | //___________________________________________________________________________
|
---|
709 | Double_t MRolke::EvalLikeMod7(Double_t mu, Int_t x, Double_t em, Double_t e, Double_t sde, Double_t b, Int_t what)
|
---|
710 | {
|
---|
711 | // Calculates the Profile Likelihood for MODEL 7:
|
---|
712 | // background known/Efficiency Gauss
|
---|
713 | // what = 1: Maximum likelihood estimate is returned
|
---|
714 | // what = 2: Profile Likelihood of Maxmimum Likelihood estimate is returned.
|
---|
715 | // what = 3: Profile Likelihood of Test hypothesis is returned
|
---|
716 | // otherwise parameters as described in the beginning of the class)
|
---|
717 |
|
---|
718 | Double_t v=sde*sde;
|
---|
719 | Double_t f = 0.;
|
---|
720 |
|
---|
721 | if(what == 1) {
|
---|
722 | f = (x-b)/em;
|
---|
723 | }
|
---|
724 |
|
---|
725 | if(what == 2) {
|
---|
726 | mu = (x-b)/em;
|
---|
727 | e = em;
|
---|
728 | f = LikeMod7(mu, b, e, x, em, v);
|
---|
729 | }
|
---|
730 |
|
---|
731 | if(what == 3) {
|
---|
732 | if(mu==0) {
|
---|
733 | e = em;
|
---|
734 | } else {
|
---|
735 | e = ( -(mu*em-b-mu*mu*v)-TMath::Sqrt((mu*em-b-mu*mu*v)*(mu*em-b-mu*mu*v)+4*mu*(x*mu*v-mu*b*v + b * em)))/( - mu)/2;
|
---|
736 | }
|
---|
737 | f = LikeMod7(mu, b, e, x, em, v);
|
---|
738 | }
|
---|
739 |
|
---|
740 | return f;
|
---|
741 | }
|
---|
742 |
|
---|
743 | //___________________________________________________________________________
|
---|
744 | Double_t MRolke::LikeMod7(Double_t mu,Double_t b,Double_t e,Int_t x,Double_t em,Double_t v)
|
---|
745 | {
|
---|
746 | // Profile Likelihood function for MODEL 6:
|
---|
747 | // background known/ Efficiency binomial
|
---|
748 |
|
---|
749 | return 2*(x*TMath::Log(e*mu+b)-(e*mu + b)-LogFactorial(x)-0.9189385-TMath::Log(v)/2-(em-e)*(em-e)/v/2);
|
---|
750 | }
|
---|
751 |
|
---|
752 | //______________________________________________________________________
|
---|
753 | Double_t MRolke::EvalPolynomial(Double_t x, const Int_t coef[], Int_t N)
|
---|
754 | {
|
---|
755 | // evaluate polynomial
|
---|
756 |
|
---|
757 | const Int_t *p;
|
---|
758 | p = coef;
|
---|
759 | Double_t ans = *p++;
|
---|
760 | Int_t i = N;
|
---|
761 |
|
---|
762 | do
|
---|
763 | ans = ans * x + *p++;
|
---|
764 | while( --i );
|
---|
765 |
|
---|
766 | return ans;
|
---|
767 | }
|
---|
768 |
|
---|
769 | //______________________________________________________________________
|
---|
770 | Double_t MRolke::EvalMonomial(Double_t x, const Int_t coef[], Int_t N)
|
---|
771 | {
|
---|
772 | // evaluate mononomial
|
---|
773 |
|
---|
774 | Double_t ans;
|
---|
775 | const Int_t *p;
|
---|
776 |
|
---|
777 | p = coef;
|
---|
778 | ans = x + *p++;
|
---|
779 | Int_t i = N-1;
|
---|
780 |
|
---|
781 | do
|
---|
782 | ans = ans * x + *p++;
|
---|
783 | while( --i );
|
---|
784 |
|
---|
785 | return ans;
|
---|
786 | }
|
---|
787 | //--------------------------------------------------------------------------
|
---|
788 | //
|
---|
789 | // Uses Stirling-Wells formula: ln(N!) ~ N*ln(N) - N + 0.5*ln(2piN)
|
---|
790 | // if N exceeds 70, otherwise use the TMath functions
|
---|
791 | //
|
---|
792 | //
|
---|
793 | Double_t MRolke::LogFactorial(Int_t n)
|
---|
794 | {
|
---|
795 | if (n>69)
|
---|
796 | return n*TMath::Log(n)-n + 0.5*TMath::Log(TMath::TwoPi()*n);
|
---|
797 | else
|
---|
798 | return TMath::Log(TMath::Factorial(n));
|
---|
799 | }
|
---|