1 | #ifndef MARS_MHFindSignificanceONOFF
|
---|
2 | #define MARS_MHFindSignificanceONOFF
|
---|
3 |
|
---|
4 | #ifndef MARS_MH
|
---|
5 | #include "MH.h"
|
---|
6 | #endif
|
---|
7 |
|
---|
8 | #ifndef ROOT_TArrayD
|
---|
9 | #include <TArrayD.h>
|
---|
10 | #endif
|
---|
11 |
|
---|
12 | #ifndef ROOT_TPostScript
|
---|
13 | #include <TPostScript.h>
|
---|
14 | #endif
|
---|
15 |
|
---|
16 |
|
---|
17 | class TF1;
|
---|
18 | class TH1;
|
---|
19 | class TCanvas;
|
---|
20 |
|
---|
21 | class MHFindSignificanceONOFF : public MH
|
---|
22 | {
|
---|
23 | private:
|
---|
24 |
|
---|
25 | TH1 *fHistOrig; // original plot of |alpha| (0.0 to 90.0 degrees)
|
---|
26 | TH1 *fHist; // copy of fHistOrig or rebinned histogram
|
---|
27 |
|
---|
28 |
|
---|
29 |
|
---|
30 | TH1 *fHistOrigOFF; // original plot of |alpha| (0.0 to 90.0 degrees)
|
---|
31 | TH1 *fHistOFF; // copy of fHistOrig or rebinned histogram
|
---|
32 | TH1 *fHistOFFNormalized; // fHistOFF normalized (contents and errors) with
|
---|
33 | // with fNormFactor; useful when plotting OFF
|
---|
34 | // Data together with ON data
|
---|
35 |
|
---|
36 |
|
---|
37 | // Postscript file where, for each theta bin,
|
---|
38 | // alpha ON and OFF distributions
|
---|
39 | // after cuts (and hence, Nex and SigmaLiMa computations) will be stored
|
---|
40 | // This TPostScript object has to be initialized and closed finally
|
---|
41 | // outside this class.
|
---|
42 |
|
---|
43 | // NOT WORKING WELL !!!
|
---|
44 |
|
---|
45 | TPostScript* fPsFilename;
|
---|
46 |
|
---|
47 |
|
---|
48 | TString fPsFilenameString; // Name of the file where plots will be stored while the
|
---|
49 | // TPostScript option is not working
|
---|
50 |
|
---|
51 |
|
---|
52 |
|
---|
53 | Double_t fAlphamin; // requested lower limit of fit range
|
---|
54 | Double_t fAlphammm; // center of fit range
|
---|
55 | Double_t fAlphamax; // requested lower limit of fit range
|
---|
56 |
|
---|
57 | Double_t fAlphaminOFF; // requested lower limit of fit range for OFF data
|
---|
58 | Double_t fAlphamaxOFF; // requested lower limit of fit range for OFF data
|
---|
59 |
|
---|
60 |
|
---|
61 | Double_t fAlphami; // actual lower limit of fit range
|
---|
62 | Double_t fAlphamm; // actual center of fit range
|
---|
63 | Double_t fAlphama; // actual upper limit of fit range
|
---|
64 |
|
---|
65 | Double_t fAlphasig; // requested signal range
|
---|
66 | Double_t fAlphasi; // actual signal range
|
---|
67 | Double_t fAlphasiOFF; // actual signal range for OFF data
|
---|
68 |
|
---|
69 |
|
---|
70 | Double_t fAlphalow; // requested lower edge of signal range
|
---|
71 | Double_t fAlphalo; // actual lower edge of signal range
|
---|
72 |
|
---|
73 | Double_t fAlphahig; // requested upper edge of background range
|
---|
74 | Double_t fAlphahi; // actual upper edge of background range
|
---|
75 |
|
---|
76 | // number of events in signal region
|
---|
77 | Double_t fNon; // total number of events in signal region
|
---|
78 | Double_t fNbg; // number of background events in signal region
|
---|
79 | Double_t fNex; // number of excess events in signal region
|
---|
80 |
|
---|
81 | Double_t fdNon;
|
---|
82 | Double_t fdNbg;
|
---|
83 | Double_t fdNex;
|
---|
84 |
|
---|
85 | // number of events in background region
|
---|
86 | Double_t fNbgtot; // total number of events in background region
|
---|
87 | Double_t fNbgtotFitted; // fitted total no. of events in background region
|
---|
88 | Double_t fdNbgtotFitted; // fitted error of this number
|
---|
89 |
|
---|
90 | // Variables related to OFF data.
|
---|
91 | // Many variables are defined for similarity with
|
---|
92 | // existing program. Many of them might be removed in future...
|
---|
93 |
|
---|
94 |
|
---|
95 | Double_t fNexONOFF; // number of excess events (ON-OFF)
|
---|
96 | // in signal region
|
---|
97 | Double_t fNexONOFFFitted; // number of excess events (ON-OFF fitted)
|
---|
98 | // in signal region
|
---|
99 |
|
---|
100 | Double_t fdNexONOFF; // error in number of excess events (ON-OFF)
|
---|
101 | // in signal region
|
---|
102 | Double_t fdNexONOFFFitted; // error in number of excess events (ON-OFF fitted)
|
---|
103 | // in signal region
|
---|
104 |
|
---|
105 |
|
---|
106 |
|
---|
107 | Double_t fNoffTot; // Total number of OFF events
|
---|
108 | Double_t fNoffSig; // Number of OFF events in "signal" region
|
---|
109 | Double_t fNoffBg; // Number of OFF events in "background" region
|
---|
110 |
|
---|
111 | // errors for previous quantities
|
---|
112 |
|
---|
113 | Double_t fdNoffTot;
|
---|
114 | Double_t fdNoffSig;
|
---|
115 | Double_t fdNoffBg;
|
---|
116 |
|
---|
117 | // Fitted quantities for OFF alpha distribution
|
---|
118 |
|
---|
119 | Double_t fNoffTotFitted; // Total number of OFF events
|
---|
120 | Double_t fNoffSigFitted; // Number of OFF events in "signal" region
|
---|
121 | Double_t fNoffBgFitted; // Number of OFF events in "background" region
|
---|
122 |
|
---|
123 | // errors for previous quantities
|
---|
124 |
|
---|
125 | Double_t fdNoffTotFitted;
|
---|
126 | Double_t fdNoffSigFitted;
|
---|
127 | Double_t fdNoffBgFitted;
|
---|
128 |
|
---|
129 |
|
---|
130 | // Boolean variable used to disable the usage ("serious" usage) of the
|
---|
131 | // quantities computed from fits. This will be useful in those cases
|
---|
132 | // where there is too few events to perform a decent fit to the
|
---|
133 | // alpha histograms.
|
---|
134 |
|
---|
135 | Bool_t fUseFittedQuantities;
|
---|
136 |
|
---|
137 |
|
---|
138 |
|
---|
139 | // Bool variable used to decide wether to print or not the results
|
---|
140 | // of the fit, significance, Nex... onto the final alpha plot.
|
---|
141 | // for the time being, this variable is set in the constructor.
|
---|
142 | // At some point, I might make it such it can be set externally...
|
---|
143 |
|
---|
144 | Bool_t fPrintResultsOntoAlphaPlot;
|
---|
145 |
|
---|
146 |
|
---|
147 | // effective number of background events
|
---|
148 | Double_t fNoff; // fNoff = fNoffSig * fNormFactor
|
---|
149 | Double_t fGamma; //
|
---|
150 | Double_t fNormFactor; // = TotalNon/TotalNoff)
|
---|
151 |
|
---|
152 | Double_t fSigLiMa; // significance of gamma signal according to Li & Ma
|
---|
153 | // Computed using quantities fGama and Noff
|
---|
154 | // and formula (17)
|
---|
155 |
|
---|
156 |
|
---|
157 | Double_t fSigLiMa2; // significance of gamma signal according to Li & Ma
|
---|
158 | // Computed using quantities fNormFactor and fNoffSig
|
---|
159 | // and formula (17)
|
---|
160 |
|
---|
161 | Double_t fSigLiMa3; // significance of gamma signal according to Li & Ma
|
---|
162 | // Computed using quantities fNormFactor and fNoffSig
|
---|
163 | // and formula (5)
|
---|
164 |
|
---|
165 |
|
---|
166 |
|
---|
167 |
|
---|
168 | const static Double_t fEps = 1.e-4; // tolerance for floating point comparisons
|
---|
169 |
|
---|
170 | Bool_t fDraw; // if true : draw plots
|
---|
171 | Bool_t fSavePlots; // if true : Save plots in Psfile
|
---|
172 | Bool_t fFitGauss; // if true : do the (polynomial+Gauss fit)
|
---|
173 | Bool_t fRebin; // if true : allow rebinning of the alpha plot
|
---|
174 | Bool_t fReduceDegree; // if true : allow reducing of the order of the polynomial
|
---|
175 |
|
---|
176 | Bool_t fConstantBackg; // if set true if background fit is not possible
|
---|
177 | // due to low statistics
|
---|
178 |
|
---|
179 | TCanvas *fCanvas;
|
---|
180 |
|
---|
181 | Double_t fNexGauss; // total number of excess events
|
---|
182 | // (from fitted Gauss function)
|
---|
183 | Double_t fdNexGauss; // error of the total number of excess events
|
---|
184 |
|
---|
185 | Double_t fSigmaGauss; // sigma of fitted Gauss function
|
---|
186 | Double_t fdSigmaGauss; // error of this sigma
|
---|
187 |
|
---|
188 | //--------------------
|
---|
189 | TF1 *fPoly; // polynomial function
|
---|
190 | Int_t fFitBad; // if != 0 fit failed
|
---|
191 | Int_t fDegree; // degree of polynomial to be fitted to the background
|
---|
192 | Int_t fNdf; // number of degrees of freedom of polynomial fit
|
---|
193 | Double_t fChisq; // chi squared of polynomial fit
|
---|
194 | Double_t fProb; // chi squared probability ofg polynomial fit
|
---|
195 |
|
---|
196 | TArrayD fValues;
|
---|
197 | TArrayD fErrors;
|
---|
198 |
|
---|
199 | const static Int_t fNdim = 6;
|
---|
200 | Double_t fEmat[fNdim][fNdim];
|
---|
201 | Double_t fEma [fNdim][fNdim];
|
---|
202 | Double_t fCorr[fNdim][fNdim];
|
---|
203 |
|
---|
204 | Int_t fMbins; // number of bins in the fit range
|
---|
205 | Int_t fMlow; // number of bins in the fit range with too few entries
|
---|
206 | Int_t fNzero; // number of bins in the fit range with zero entry
|
---|
207 | Int_t fIstat;
|
---|
208 |
|
---|
209 | //--------------------
|
---|
210 |
|
---|
211 | // Fit to OFF data
|
---|
212 |
|
---|
213 |
|
---|
214 | TF1 *fPolyOFF; // polynomial function for OFF data
|
---|
215 |
|
---|
216 | TF1 *fPolyOFFNormalized; // polynomial function for OFF data normalized with fNormFactor*(BinWidthON/BinWidthOFF)
|
---|
217 |
|
---|
218 | Int_t fFitBadOFF; // if != 0 fit failed
|
---|
219 | Int_t fDegreeOFF; // degree of polynomial to be fitted to the background
|
---|
220 | Int_t fNdfOFF; // number of degrees of freedom of polynomial fit
|
---|
221 | Double_t fChisqOFF; // chi squared of polynomial fit
|
---|
222 | Double_t fProbOFF; // chi squared probability ofg polynomial fit
|
---|
223 |
|
---|
224 | TArrayD fValuesOFF;
|
---|
225 | TArrayD fErrorsOFF;
|
---|
226 | TArrayD fValuesOFFNormalized;
|
---|
227 | TArrayD fErrorsOFFNormalized;
|
---|
228 |
|
---|
229 | const static Int_t fNdimOFF = 6;
|
---|
230 | Double_t fEmatOFF[fNdim][fNdim];
|
---|
231 | Double_t fEmaOFF [fNdim][fNdim];
|
---|
232 | Double_t fCorrOFF[fNdim][fNdim];
|
---|
233 |
|
---|
234 | Int_t fMbinsOFF; // number of bins in the fit range
|
---|
235 | Int_t fMlowOFF; // number of bins in the fit range with too few entries
|
---|
236 | Int_t fNzeroOFF; // number of bins in the fit range with zero entry
|
---|
237 | Int_t fIstatOFF;
|
---|
238 |
|
---|
239 |
|
---|
240 | //--------------------
|
---|
241 | TF1 *fGPoly; // (Gauss+polynomial) function
|
---|
242 | TF1 *fGBackg; // polynomial part of (Gauss+polynomial) function
|
---|
243 | Int_t fGFitBad; // if != 0 fit failed
|
---|
244 | Int_t fGDegree; // degree of polynomial to be fitted to the background
|
---|
245 | Int_t fGNdf; // number of degrees of freedom of polynomial fit
|
---|
246 | Double_t fGChisq; // chi squared of polynomial fit
|
---|
247 | Double_t fGProb; // chi squared probability ofg polynomial fit
|
---|
248 |
|
---|
249 | TArrayD fGValues;
|
---|
250 | TArrayD fGErrors;
|
---|
251 |
|
---|
252 | const static Int_t fGNdim = 9;
|
---|
253 | Double_t fGEmat[fGNdim][fGNdim];
|
---|
254 | Double_t fGEma[fGNdim][fGNdim];
|
---|
255 | Double_t fGCorr[fGNdim][fGNdim];
|
---|
256 |
|
---|
257 | Int_t fGMbins; // number of bins in the fit range
|
---|
258 | Int_t fGNzero; // numnber of bins in the fit range with zero entry
|
---|
259 | Int_t fGIstat;
|
---|
260 |
|
---|
261 | //--------------------
|
---|
262 |
|
---|
263 | static const TString gsDefName; //! Default Name
|
---|
264 | static const TString gsDefTitle; //! Default Title
|
---|
265 |
|
---|
266 | Bool_t DetExcess();
|
---|
267 | Bool_t DetExcessONOFF();
|
---|
268 | Bool_t FitPolynomial();
|
---|
269 | Bool_t FitPolynomialOFF();
|
---|
270 | Bool_t FitGaussPoly();
|
---|
271 | //Bool_t FitGaussPolyONOFF();
|
---|
272 | Bool_t RebinHistogram(Double_t x0, Int_t nrebin);
|
---|
273 | Bool_t RebinHistogramOFF(Double_t x0, Int_t nrebin);
|
---|
274 |
|
---|
275 | public:
|
---|
276 | MHFindSignificanceONOFF(const char *name=NULL, const char *title=NULL);
|
---|
277 | ~MHFindSignificanceONOFF();
|
---|
278 |
|
---|
279 |
|
---|
280 | // fhistOFF is the alpha distribution of OFF data (after cuts),
|
---|
281 | // BUT NOT normalized. Normalization factor is also one of the
|
---|
282 | // arguments. Off alpha distribution will be normalized
|
---|
283 | // at the beginning of the function FindSigmaONOFF.
|
---|
284 |
|
---|
285 | Bool_t FindSigmaONOFF(TH1 *fhistON, TH1 *fhistOFF,
|
---|
286 | Double_t NormFactor,
|
---|
287 | Double_t alphamin, Double_t alphamax,
|
---|
288 | Int_t degreeON, Int_t degreeOFF,
|
---|
289 | Double_t alphasig,
|
---|
290 | Bool_t drawpoly,
|
---|
291 | Bool_t fitgauss,
|
---|
292 | Bool_t print, Bool_t saveplots,
|
---|
293 | //TPostScript* PsFile
|
---|
294 | const TString psfilename);
|
---|
295 |
|
---|
296 | // Set limits for the polynomial fit of the OFF data
|
---|
297 | // It will give the user the possibility of using,
|
---|
298 | // for the OFF data substraction, a fit in the region
|
---|
299 | // of interest. Might be useful in case of "pathological"
|
---|
300 | // alpha distribution for the OFF data.
|
---|
301 |
|
---|
302 | void SetLimitsForOFFDataFit(Double_t Low, Double_t Up)
|
---|
303 | { fAlphaminOFF = Low; fAlphamaxOFF = Up; }
|
---|
304 |
|
---|
305 | void SetAlphaSig (Double_t alphasig)
|
---|
306 | { fAlphasig = alphasig; }
|
---|
307 |
|
---|
308 |
|
---|
309 | void SetUseFittedQuantities (Bool_t b)
|
---|
310 | {fUseFittedQuantities = b;}
|
---|
311 |
|
---|
312 |
|
---|
313 | Bool_t SigmaLiMa(Double_t non, Double_t noff, Double_t gamma,
|
---|
314 | Double_t *siglima);
|
---|
315 |
|
---|
316 | Bool_t SigmaLiMaForm5(Double_t non, Double_t noff, Double_t gamma,
|
---|
317 | Double_t *siglima);
|
---|
318 |
|
---|
319 |
|
---|
320 | Bool_t SigmaVsAlphaONOFF(TH1 *fhistON, TH1 *fhistOFF,
|
---|
321 | Double_t alphamin, Double_t alphamax,
|
---|
322 | Int_t degree, Bool_t print);
|
---|
323 |
|
---|
324 |
|
---|
325 |
|
---|
326 | // Function that returns one of the 3 LiMa sigmas.
|
---|
327 | // The returned value is the one used in the optimization
|
---|
328 | // and final alpha plots.
|
---|
329 |
|
---|
330 |
|
---|
331 | Double_t GetSignificance();// { return fSigLiMa; }
|
---|
332 |
|
---|
333 | Bool_t GetUseFittedQuantities() {return fUseFittedQuantities;}
|
---|
334 |
|
---|
335 |
|
---|
336 |
|
---|
337 | // Following function computes a clone of fHistOFF and normalizes
|
---|
338 | // contents, errors and fPolyOFF (if exists) with the fNormFactor.
|
---|
339 | // This normalized OFF hist will be used when plotting OFF data
|
---|
340 | // together with ON data.
|
---|
341 |
|
---|
342 | Bool_t ComputeHistOFFNormalized();
|
---|
343 |
|
---|
344 |
|
---|
345 | Bool_t DrawFit(Option_t *opt=NULL);
|
---|
346 |
|
---|
347 | Bool_t DrawHistOFF();
|
---|
348 | Bool_t DrawHistOFFNormalized();
|
---|
349 |
|
---|
350 | Float_t GetDegree() const { return fDegree; }
|
---|
351 | Float_t GetProb() const { return fProb; }
|
---|
352 | Float_t GetNdf() const { return fNdf; }
|
---|
353 | Float_t GetGamma() const { return fGamma; }
|
---|
354 | Float_t GetNon() const { return fNon; }
|
---|
355 | Float_t GetNex() const { return fNex; }
|
---|
356 | Float_t GetNbg() const { return fNbg; }
|
---|
357 | Float_t GetSigLiMa1() const { return fSigLiMa; }
|
---|
358 | Float_t GetSigLiMa2() const { return fSigLiMa2; }
|
---|
359 | Float_t GetSigLiMa3() const { return fSigLiMa3; }
|
---|
360 |
|
---|
361 | Float_t GetMbins() const { return fMbins; }
|
---|
362 | Float_t GetAlphasi() const { return fAlphasi; }
|
---|
363 | Float_t GetNexONOFF() const {return fNexONOFF;}
|
---|
364 | Float_t GetNexONOFFFitted() const {return fNexONOFFFitted;}
|
---|
365 |
|
---|
366 |
|
---|
367 |
|
---|
368 | void SetRebin(Bool_t b=kTRUE);
|
---|
369 | void SetReduceDegree(Bool_t b=kTRUE);
|
---|
370 |
|
---|
371 | void SetPsFilename (TPostScript* PsFile) {fPsFilename = PsFile;}
|
---|
372 |
|
---|
373 | void PrintPoly(Option_t *opt=NULL);
|
---|
374 | void PrintPolyOFF(Option_t *opt=NULL);
|
---|
375 | void PrintPolyGauss(Option_t *opt=NULL);
|
---|
376 |
|
---|
377 | ClassDef(MHFindSignificanceONOFF, 1) // Determine significance from alpha plot
|
---|
378 | };
|
---|
379 |
|
---|
380 | #endif
|
---|
381 |
|
---|
382 |
|
---|
383 |
|
---|
384 |
|
---|
385 |
|
---|
386 |
|
---|
387 |
|
---|
388 |
|
---|
389 |
|
---|
390 |
|
---|
391 |
|
---|
392 |
|
---|
393 |
|
---|
394 |
|
---|
395 |
|
---|
396 |
|
---|
397 |
|
---|
398 |
|
---|
399 |
|
---|
400 |
|
---|