NCFS-Pack
A generic (astro)particle physics analysis framework
 
Loading...
Searching...
No Matches
NcPsiDistrib.cxx
Go to the documentation of this file.
1
31
33
90
91#include "NcPsiDistrib.h"
92#include "Riostream.h"
93
94ClassImp(NcPsiDistrib); // Class implementation to enable ROOT I/O
95
98{
104
105 fNtrials=10000;
106 fNevents=100;
107 fNoutcomes=100;
108 fProbs=new Double_t[fNoutcomes];
109 fSignal=new Int_t[fNoutcomes];
110 for(Int_t i=0; i<fNoutcomes; i++)
111 {
112 fProbs[i]=1./fNoutcomes;
113 fSignal[i]=0;
114 }
115 fRefPsi=0;
116 fNbelow=0;
117 fNabove=0;
118 fPrintFreq=0;
119
120 fRangeSet=kFALSE;
121 fPsiHisto=new TH1D("psi","psi distribution",100,0,1);
122 fPsiHisto->SetDirectory(0);
123 fPsiHisto->SetXTitle("psi");
124 fPsiHisto->SetFillColor(4);
125
126 fSample=new NcSample();
127// fSample->SetStoreMode(1);
128}
129
131{
137
138 if(fProbs)
139 {
140 delete[] fProbs;
141 fProbs=0;
142 }
143 if(fSignal)
144 {
145 delete[] fSignal;
146 fSignal=0;
147 }
148 if(fPsiHisto)
149 {
150 delete fPsiHisto;
151 fPsiHisto=0;
152 }
153 if(fSample)
154 {
155 delete fSample;
156 fSample=0;
157 }
158}
159
161{
167
168 fNtrials=n;
169}
170
172{
178
179 fNevents=n;
180}
181
182void NcPsiDistrib::SetNoutcomes(Int_t n, Double_t* p)
183{
193
194 fNoutcomes=n;
195 if(fProbs)
196 {
197 delete[] fProbs;
198 }
199 fProbs=new Double_t[fNoutcomes];
200
202
203 if(fSignal)
204 {
205 delete[] fSignal;
206 fSignal=new Int_t[fNoutcomes];
207 for(Int_t i=0; i<fNoutcomes; i++){ fSignal[i]=0; }
208 }
209}
210
212{
220
221 if(p)
222 {
223 Double_t sum=0;
224 for(Int_t i=0; i<fNoutcomes; i++) { sum+=p[i]; }
225 if(sum<=0)
226 {
227 cout << "NcPsiDistrib: Sum of probabilities is not positive" << endl;
228 sum=1;
229 }
230 for(Int_t i=0; i<fNoutcomes; i++) { fProbs[i]=p[i]/sum; }
231 }
232 else
233 {
234 for(Int_t i=0; i<fNoutcomes; i++){ fProbs[i]=1./fNoutcomes; }
235 }
236}
237
239{
247
248 if(s)
249 {
250 for(Int_t i=0; i<fNoutcomes; i++)
251 {
252 fSignal[i]=s[i];
253 }
254 }
255 else
256 {
257 for(Int_t i=0; i<fNoutcomes; i++)
258 {
259 fSignal[i]=0;
260 }
261 }
262}
263
264void NcPsiDistrib::SetPsiRange(Int_t nb, Float_t low, Float_t high)
265{
271
272 fPsiHisto->SetBins(nb,low,high);
273 fRangeSet=kTRUE;
274}
275
277{
283
284 fRefPsi=ref;
285}
286
288{
294
295 fPrintFreq=freq;
296}
297
298void NcPsiDistrib::Distribute(Int_t storemode)
299{
311
312 // Variables we need
313 Int_t* data=new Int_t[fNoutcomes];
314 NcMath math;
315 Double_t psi=0;
316 char title[100];
317
318 // Reference histo with probabilities
319 TH1D ref("ref","ref",fNoutcomes,0,1);
320 for(Int_t i=0; i<fNoutcomes; i++)
321 {
322 ref.SetBinContent(i+1,fProbs[i]);
323 }
324
325 // Make histogram for events
326 TH1D histo("histo","events",fNoutcomes,0,1);
327
328 // Reset stuff
329 fSample->Reset();
330 fSample->SetStoreMode(storemode);
331 fPsiHisto->Reset();
332 sprintf(title,"psi_%d_%d",fNevents,fNoutcomes);
333 fPsiHisto->SetName(title);
334 fNbelow=0;
335 fNabove=0;
336
337 // Set range for psi histogram
338 if(!fRangeSet){
339 fPsiHisto->SetBins(100,0,1.1*FindMaxPsi());
340 }
341
342 // Loop over trials
343 for(Int_t itrial=0; itrial<fNtrials; itrial++){
344 if(fPrintFreq>0 && itrial%fPrintFreq==0) cout << "Trial " << itrial << endl;
345
346 // Fill event histogram
347 histo.Reset();
348 histo.FillRandom(&ref, fNevents);
349
350 // Add signal if prescribed
351 for(Int_t i=0; i<fNoutcomes; i++)
352 {
353 histo.SetBinContent(i+1, histo.GetBinContent(i+1)+fSignal[i]);
354 }
355
356 // Calculate psi
357 for(Int_t i=0; i<fNoutcomes; i++)
358 {
359 data[i]=int(histo.GetBinContent(i+1));
360 }
361 psi=math.PsiValue(fNoutcomes, data, fProbs);
362 fSample->Enter(psi);
363 fPsiHisto->Fill(psi);
364
365 // Keep track of # below/above ref psi
366 if(fRefPsi)
367 {
368 if(psi<fRefPsi) fNbelow++;
369 if(psi>fRefPsi) fNabove++;
370 }
371 }
372
373 delete[] data;
374
375 // Set psi distribution histo name
376 sprintf(title,"psi distribution (%d events, %d time bins): mean %.2f, sigma %.2e",fNevents,fNoutcomes,fSample->GetMean(1),fSample->GetSigma(1));
377 fPsiHisto->SetTitle(title);
378}
379
381{
387
388 return fPsiHisto;
389}
390
392{
398
399 return fSample;
400}
401
403{
409
410 return ((Double_t)fNbelow)/((Double_t)fNtrials);
411}
412
414{
420
421 return ((Double_t)fNabove)/((Double_t)fNtrials);
422}
423
425{
431
432 // Make data array and initialise with signal
433 Int_t* data=new Int_t[fNoutcomes];
434 for(Int_t i=0; i<fNoutcomes; i++)
435 {
436 data[i]=fSignal[i];
437 }
438
439 // Try putting background events in each bin consecutively
440 Float_t maxpsi=0, psi=0;
441 NcMath m;
442 for(Int_t i=0; i<fNoutcomes; i++)
443 {
444 data[i]+=fNevents;
445 psi=m.PsiValue(fNoutcomes, data, fProbs);
446 if(psi>maxpsi) maxpsi=psi;
447 data[i]-=fNevents;
448 }
449
450 // Delete data array
451 delete[] data;
452
453 return maxpsi;
454}
455
ClassImp(NcPsiDistrib)
Various mathematical tools for scientific analysis.
Definition NcMath.h:26
Double_t PsiValue(Int_t m, Int_t *n, Double_t *p=0, Int_t f=0) const
Definition NcMath.cxx:2829
Simple class to simulate Bayesian psi distributions.
void Distribute(Int_t storemode=0)
void SetNevents(Int_t n)
void SetReferencePsi(Double_t ref)
Double_t GetFracBelow()
Bool_t fRangeSet
Double_t fRefPsi
Double_t GetFracAbove()
void SetNtrials(Long_t n)
TH1D * GetPsiHisto()
NcSample * fSample
Int_t * fSignal
void SetPrintFreq(Int_t freq)
virtual ~NcPsiDistrib()
Long_t fNtrials
void SetNoutcomes(Int_t n, Double_t *p=0)
void SetSignal(Int_t *s)
Double_t * fProbs
TH1D * fPsiHisto
void SetProbabilities(Double_t *p)
Float_t FindMaxPsi()
NcSample * GetPsiSample()
void SetPsiRange(Int_t nb, Float_t low, Float_t high)
Sampling and statistics tools for various multi-dimensional data samples.
Definition NcSample.h:28