source: trunk/MagicSoft/Mars/mcalib/MHCalibrationBlindPixel.h@ 2993

Last change on this file since 2993 was 2972, checked in by gaug, 21 years ago
*** empty log message ***
File size: 15.1 KB
Line 
1#ifndef MARS_MHCalibrationBlindPixel
2#define MARS_MHCalibrationBlindPixel
3
4#ifndef MARS_MH
5#include "MH.h"
6#endif
7
8class TH1F;
9class TH1I;
10class TF1;
11class TPaveText;
12
13class TMath;
14class MParList;
15class MHCalibrationBlindPixel : public MH
16{
17private:
18
19 const Int_t fBlindPixelChargeNbins;
20 const Int_t fBlindPixelTimeNbins;
21 const Int_t fBlindPixelChargevsNbins;
22 const Axis_t fBlindPixelTimeFirst;
23 const Axis_t fBlindPixelTimeLast;
24
25 TH1F* fHBlindPixelCharge; // Histogram with the single Phe spectrum
26 TH1F* fHBlindPixelTime; // Variance of summed FADC slices
27 TH1I* fHBlindPixelChargevsN; // Summed Charge vs. Event Nr.
28 TH1F* fHBlindPixelPSD; // Power spectrum density of fHBlindPixelChargevsN
29
30 TF1 *fSinglePheFit;
31 TF1 *fTimeGausFit;
32 TF1 *fSinglePhePedFit;
33
34 Axis_t fBlindPixelChargefirst;
35 Axis_t fBlindPixelChargelast;
36
37 void DrawLegend();
38
39 TPaveText *fFitLegend;
40 Bool_t fFitOK;
41
42 Double_t fLambda;
43 Double_t fMu0;
44 Double_t fMu1;
45 Double_t fSigma0;
46 Double_t fSigma1;
47
48 Double_t fLambdaErr;
49 Double_t fMu0Err;
50 Double_t fMu1Err;
51 Double_t fSigma0Err;
52 Double_t fSigma1Err;
53
54 Double_t fChisquare;
55 Double_t fProb;
56 Int_t fNdf;
57
58 Double_t fMeanTime;
59 Double_t fMeanTimeErr;
60 Double_t fSigmaTime;
61 Double_t fSigmaTimeErr;
62
63 Double_t fLambdaCheck;
64 Double_t fLambdaCheckErr;
65
66 Double_t fMeanPedestal;
67 Double_t fMeanPedestalErr;
68 Double_t fSigmaPedestal;
69 Double_t fSigmaPedestalErr;
70
71public:
72
73 MHCalibrationBlindPixel(const char *name=NULL, const char *title=NULL);
74 ~MHCalibrationBlindPixel();
75
76 void Clear(Option_t *o="");
77 void Reset();
78
79 Bool_t FillBlindPixelCharge(Float_t q);
80 Bool_t FillBlindPixelTime(Float_t t);
81 Bool_t FillBlindPixelChargevsN(Stat_t rq, Int_t t);
82
83 // Setters
84 void SetMeanPedestal(const Float_t f) { fMeanPedestal = f; }
85 void SetMeanPedestalErr(const Float_t f) { fMeanPedestalErr = f; }
86 void SetSigmaPedestal(const Float_t f) { fSigmaPedestal = f; }
87 void SetSigmaPedestalErr(const Float_t f) { fSigmaPedestalErr = f; }
88
89 // Getters
90 const Double_t GetLambda() const { return fLambda; }
91 const Double_t GetLambdaCheck() const { return fLambdaCheck; }
92 const Double_t GetMu0() const { return fMu0; }
93 const Double_t GetMu1() const { return fMu1; }
94 const Double_t GetSigma0() const { return fSigma0; }
95 const Double_t GetSigma1() const { return fSigma1; }
96
97 const Double_t GetLambdaErr() const { return fLambdaErr; }
98 const Double_t GetLambdaCheckErr() const { return fLambdaCheckErr; }
99 const Double_t GetMu0Err() const { return fMu0Err; }
100 const Double_t GetMu1Err() const { return fMu1Err; }
101 const Double_t GetSigma0Err() const { return fSigma0Err; }
102 const Double_t GetSigma1Err() const { return fSigma1Err; }
103
104 const Double_t GetChiSquare() const { return fChisquare; }
105 const Double_t GetProb() const { return fProb; }
106 const Int_t GetNdf() const { return fNdf; }
107
108 const Double_t GetMeanTime() const { return fMeanTime; }
109 const Double_t GetMeanTimeErr() const { return fMeanTimeErr; }
110 const Double_t GetSigmaTime() const { return fSigmaTime; }
111 const Double_t GetSigmaTimeErr() const { return fSigmaTimeErr; }
112
113 const Bool_t IsFitOK() const { return fFitOK; }
114
115 const TH1I *GetHBlindPixelChargevsN() const { return fHBlindPixelChargevsN; }
116 const TH1F *GetHBlindPixelPSD() const { return fHBlindPixelPSD; }
117
118 // Draws
119 TObject *DrawClone(Option_t *option="") const;
120 void Draw(Option_t *option="");
121
122 // Fits
123 enum FitFunc_t { kEPoisson4, kEPoisson5, kEPoisson6, kEPoisson7, kEPolya, kEMichele };
124
125private:
126 FitFunc_t fFitFunc;
127
128public:
129 Bool_t FitSinglePhe(Axis_t rmin=0, Axis_t rmax=0, Option_t *opt="RL0+Q");
130 Bool_t FitTime(Axis_t rmin=0., Axis_t rmax=0.,Option_t *opt="R0+Q");
131 void ChangeFitFunc(FitFunc_t func) { fFitFunc = func; }
132
133 // Simulation
134 Bool_t SimulateSinglePhe(Double_t lambda,
135 Double_t mu0,Double_t mu1,
136 Double_t sigma0,Double_t sigma1);
137
138 // Others
139 void CutAllEdges();
140
141private:
142
143 const static Double_t fNoWay = 10000000000.0;
144
145 Bool_t InitFit(Axis_t min, Axis_t max);
146 void ExitFit(TF1 *f);
147
148 inline static Double_t fFitFuncMichele(Double_t *x, Double_t *par)
149 {
150
151 Double_t lambda1cat = par[0];
152 Double_t lambda1dyn = par[1];
153 Double_t mu0 = par[2];
154 Double_t mu1cat = par[3];
155 Double_t mu1dyn = par[4];
156 Double_t sigma0 = par[5];
157 Double_t sigma1cat = par[6];
158 Double_t sigma1dyn = par[7];
159
160 Double_t sumcat = 0.;
161 Double_t sumdyn = 0.;
162 Double_t arg = 0.;
163
164 if (mu1cat < mu0)
165 return fNoWay;
166
167 if (sigma1cat < sigma0)
168 return fNoWay;
169
170 // if (sigma1cat < sigma1dyn)
171 // return NoWay;
172
173 //if (mu1cat < mu1dyn)
174 // return NoWay;
175
176 // if (lambda1cat < lambda1dyn)
177 // return NoWay;
178
179 Double_t mu2cat = (2.*mu1cat)-mu0;
180 Double_t mu2dyn = (2.*mu1dyn)-mu0;
181 Double_t mu3cat = (3.*mu1cat)-(2.*mu0);
182 Double_t mu3dyn = (3.*mu1dyn)-(2.*mu0);
183
184 Double_t sigma2cat = TMath::Sqrt((2.*sigma1cat*sigma1cat) - (sigma0*sigma0));
185 Double_t sigma2dyn = TMath::Sqrt((2.*sigma1dyn*sigma1dyn) - (sigma0*sigma0));
186 Double_t sigma3cat = TMath::Sqrt((3.*sigma1cat*sigma1cat) - (2.*sigma0*sigma0));
187 Double_t sigma3dyn = TMath::Sqrt((3.*sigma1dyn*sigma1dyn) - (2.*sigma0*sigma0));
188
189 Double_t lambda2cat = lambda1cat*lambda1cat;
190 Double_t lambda2dyn = lambda1dyn*lambda1dyn;
191 Double_t lambda3cat = lambda2cat*lambda1cat;
192 Double_t lambda3dyn = lambda2dyn*lambda1dyn;
193
194 // k=0:
195 arg = (x[0] - mu0)/sigma0;
196 sumcat = TMath::Exp(-0.5*arg*arg)/sigma0;
197 sumdyn =sumcat;
198
199 // k=1cat:
200 arg = (x[0] - mu1cat)/sigma1cat;
201 sumcat += lambda1cat*TMath::Exp(-0.5*arg*arg)/sigma1cat;
202 // k=1dyn:
203 arg = (x[0] - mu1dyn)/sigma1dyn;
204 sumdyn += lambda1dyn*TMath::Exp(-0.5*arg*arg)/sigma1dyn;
205
206 // k=2cat:
207 arg = (x[0] - mu2cat)/sigma2cat;
208 sumcat += 0.5*lambda2cat*TMath::Exp(-0.5*arg*arg)/sigma2cat;
209 // k=2dyn:
210 arg = (x[0] - mu2dyn)/sigma2dyn;
211 sumdyn += 0.5*lambda2dyn*TMath::Exp(-0.5*arg*arg)/sigma2dyn;
212
213
214 // k=3cat:
215 arg = (x[0] - mu3cat)/sigma3cat;
216 sumcat += 0.1666666667*lambda3cat*TMath::Exp(-0.5*arg*arg)/sigma3cat;
217 // k=3dyn:
218 arg = (x[0] - mu3dyn)/sigma3dyn;
219 sumdyn += 0.1666666667*lambda3dyn*TMath::Exp(-0.5*arg*arg)/sigma3dyn;
220
221 sumcat = TMath::Exp(-1.*lambda1cat)*sumcat;
222 sumdyn = TMath::Exp(-1.*lambda1dyn)*sumdyn;
223
224 return par[8]*(sumcat+sumdyn)/2.;
225
226 }
227
228 inline static Double_t fPoissonKto4(Double_t *x, Double_t *par)
229 {
230
231 Double_t lambda = par[0];
232
233 Double_t sum = 0.;
234 Double_t arg = 0.;
235
236 Double_t mu0 = par[1];
237 Double_t mu1 = par[2];
238
239 if (mu1 < mu0)
240 return fNoWay;
241
242 Double_t sigma0 = par[3];
243 Double_t sigma1 = par[4];
244
245 if (sigma1 < sigma0)
246 return fNoWay;
247
248 Double_t mu2 = (2.*mu1)-mu0;
249 Double_t mu3 = (3.*mu1)-(2.*mu0);
250 Double_t mu4 = (4.*mu1)-(3.*mu0);
251
252 Double_t sigma2 = TMath::Sqrt((2.*sigma1*sigma1) - (sigma0*sigma0));
253 Double_t sigma3 = TMath::Sqrt((3.*sigma1*sigma1) - (2.*sigma0*sigma0));
254 Double_t sigma4 = TMath::Sqrt((4.*sigma1*sigma1) - (3.*sigma0*sigma0));
255
256 Double_t lambda2 = lambda*lambda;
257 Double_t lambda3 = lambda2*lambda;
258 Double_t lambda4 = lambda3*lambda;
259
260 // k=0:
261 arg = (x[0] - mu0)/sigma0;
262 sum = TMath::Exp(-0.5*arg*arg)/sigma0;
263
264 // k=1:
265 arg = (x[0] - mu1)/sigma1;
266 sum += lambda*TMath::Exp(-0.5*arg*arg)/sigma1;
267
268 // k=2:
269 arg = (x[0] - mu2)/sigma2;
270 sum += 0.5*lambda2*TMath::Exp(-0.5*arg*arg)/sigma2;
271
272 // k=3:
273 arg = (x[0] - mu3)/sigma3;
274 sum += 0.1666666667*lambda3*TMath::Exp(-0.5*arg*arg)/sigma3;
275
276 // k=4:
277 arg = (x[0] - mu4)/sigma4;
278 sum += 0.041666666666667*lambda4*TMath::Exp(-0.5*arg*arg)/sigma4;
279
280 return TMath::Exp(-1.*lambda)*par[5]*sum;
281
282 }
283
284
285 inline static Double_t fPoissonKto5(Double_t *x, Double_t *par)
286 {
287
288 Double_t lambda = par[0];
289
290 Double_t sum = 0.;
291 Double_t arg = 0.;
292
293 Double_t mu0 = par[1];
294 Double_t mu1 = par[2];
295
296 if (mu1 < mu0)
297 return fNoWay;
298
299 Double_t sigma0 = par[3];
300 Double_t sigma1 = par[4];
301
302 if (sigma1 < sigma0)
303 return fNoWay;
304
305
306 Double_t mu2 = (2.*mu1)-mu0;
307 Double_t mu3 = (3.*mu1)-(2.*mu0);
308 Double_t mu4 = (4.*mu1)-(3.*mu0);
309 Double_t mu5 = (5.*mu1)-(4.*mu0);
310
311 Double_t sigma2 = TMath::Sqrt((2.*sigma1*sigma1) - (sigma0*sigma0));
312 Double_t sigma3 = TMath::Sqrt((3.*sigma1*sigma1) - (2.*sigma0*sigma0));
313 Double_t sigma4 = TMath::Sqrt((4.*sigma1*sigma1) - (3.*sigma0*sigma0));
314 Double_t sigma5 = TMath::Sqrt((5.*sigma1*sigma1) - (4.*sigma0*sigma0));
315
316 Double_t lambda2 = lambda*lambda;
317 Double_t lambda3 = lambda2*lambda;
318 Double_t lambda4 = lambda3*lambda;
319 Double_t lambda5 = lambda4*lambda;
320
321 // k=0:
322 arg = (x[0] - mu0)/sigma0;
323 sum = TMath::Exp(-0.5*arg*arg)/sigma0;
324
325 // k=1:
326 arg = (x[0] - mu1)/sigma1;
327 sum += lambda*TMath::Exp(-0.5*arg*arg)/sigma1;
328
329 // k=2:
330 arg = (x[0] - mu2)/sigma2;
331 sum += 0.5*lambda2*TMath::Exp(-0.5*arg*arg)/sigma2;
332
333 // k=3:
334 arg = (x[0] - mu3)/sigma3;
335 sum += 0.1666666667*lambda3*TMath::Exp(-0.5*arg*arg)/sigma3;
336
337 // k=4:
338 arg = (x[0] - mu4)/sigma4;
339 sum += 0.041666666666667*lambda4*TMath::Exp(-0.5*arg*arg)/sigma4;
340
341 // k=5:
342 arg = (x[0] - mu5)/sigma5;
343 sum += 0.008333333333333*lambda5*TMath::Exp(-0.5*arg*arg)/sigma5;
344
345 return TMath::Exp(-1.*lambda)*par[5]*sum;
346
347 }
348
349
350 inline static Double_t fPoissonKto6(Double_t *x, Double_t *par)
351 {
352
353 Double_t lambda = par[0];
354
355 Double_t sum = 0.;
356 Double_t arg = 0.;
357
358 Double_t mu0 = par[1];
359 Double_t mu1 = par[2];
360
361 if (mu1 < mu0)
362 return fNoWay;
363
364 Double_t sigma0 = par[3];
365 Double_t sigma1 = par[4];
366
367 if (sigma1 < sigma0)
368 return fNoWay;
369
370
371 Double_t mu2 = (2.*mu1)-mu0;
372 Double_t mu3 = (3.*mu1)-(2.*mu0);
373 Double_t mu4 = (4.*mu1)-(3.*mu0);
374 Double_t mu5 = (5.*mu1)-(4.*mu0);
375 Double_t mu6 = (6.*mu1)-(5.*mu0);
376
377 Double_t sigma2 = TMath::Sqrt((2.*sigma1*sigma1) - (sigma0*sigma0));
378 Double_t sigma3 = TMath::Sqrt((3.*sigma1*sigma1) - (2.*sigma0*sigma0));
379 Double_t sigma4 = TMath::Sqrt((4.*sigma1*sigma1) - (3.*sigma0*sigma0));
380 Double_t sigma5 = TMath::Sqrt((5.*sigma1*sigma1) - (4.*sigma0*sigma0));
381 Double_t sigma6 = TMath::Sqrt((6.*sigma1*sigma1) - (5.*sigma0*sigma0));
382
383 Double_t lambda2 = lambda*lambda;
384 Double_t lambda3 = lambda2*lambda;
385 Double_t lambda4 = lambda3*lambda;
386 Double_t lambda5 = lambda4*lambda;
387 Double_t lambda6 = lambda5*lambda;
388
389 // k=0:
390 arg = (x[0] - mu0)/sigma0;
391 sum = TMath::Exp(-0.5*arg*arg)/sigma0;
392
393 // k=1:
394 arg = (x[0] - mu1)/sigma1;
395 sum += lambda*TMath::Exp(-0.5*arg*arg)/sigma1;
396
397 // k=2:
398 arg = (x[0] - mu2)/sigma2;
399 sum += 0.5*lambda2*TMath::Exp(-0.5*arg*arg)/sigma2;
400
401 // k=3:
402 arg = (x[0] - mu3)/sigma3;
403 sum += 0.1666666667*lambda3*TMath::Exp(-0.5*arg*arg)/sigma3;
404
405 // k=4:
406 arg = (x[0] - mu4)/sigma4;
407 sum += 0.041666666666667*lambda4*TMath::Exp(-0.5*arg*arg)/sigma4;
408
409 // k=5:
410 arg = (x[0] - mu5)/sigma5;
411 sum += 0.008333333333333*lambda5*TMath::Exp(-0.5*arg*arg)/sigma5;
412
413 // k=6:
414 arg = (x[0] - mu6)/sigma6;
415 sum += 0.001388888888889*lambda6*TMath::Exp(-0.5*arg*arg)/sigma6;
416
417 return TMath::Exp(-1.*lambda)*par[5]*sum;
418
419 }
420
421 inline static Double_t fPolya(Double_t *x, Double_t *par)
422 {
423
424 const Double_t QEcat = 0.247; // mean quantum efficiency
425 const Double_t sqrt2 = 1.4142135623731;
426 const Double_t sqrt3 = 1.7320508075689;
427 const Double_t sqrt4 = 2.;
428
429 const Double_t lambda = par[0]; // mean number of photons
430
431 const Double_t excessPoisson = par[1]; // non-Poissonic noise contribution
432 const Double_t delta1 = par[2]; // amplification first dynode
433 const Double_t delta2 = par[3]; // amplification subsequent dynodes
434
435 const Double_t electronicAmpl = par[4]; // electronic amplification and conversion to FADC charges
436
437 const Double_t pmtAmpl = delta1*delta2*delta2*delta2*delta2*delta2; // total PMT gain
438 const Double_t A = 1. + excessPoisson - QEcat
439 + 1./delta1
440 + 1./delta1/delta2
441 + 1./delta1/delta2/delta2; // variance contributions from PMT and QE
442
443 const Double_t totAmpl = QEcat*pmtAmpl*electronicAmpl; // Total gain and conversion
444
445 const Double_t mu0 = par[7]; // pedestal
446 const Double_t mu1 = totAmpl; // single phe position
447 const Double_t mu2 = 2*totAmpl; // double phe position
448 const Double_t mu3 = 3*totAmpl; // triple phe position
449 const Double_t mu4 = 4*totAmpl; // quadruple phe position
450
451 const Double_t sigma0 = par[5];
452 const Double_t sigma1 = electronicAmpl*pmtAmpl*TMath::Sqrt(QEcat*A);
453 const Double_t sigma2 = sqrt2*sigma1;
454 const Double_t sigma3 = sqrt3*sigma1;
455 const Double_t sigma4 = sqrt4*sigma1;
456
457 const Double_t lambda2 = lambda*lambda;
458 const Double_t lambda3 = lambda2*lambda;
459 const Double_t lambda4 = lambda3*lambda;
460
461 //-- calculate the area----
462 Double_t arg = (x[0] - mu0)/sigma0;
463 Double_t sum = TMath::Exp(-0.5*arg*arg)/sigma0;
464
465 // k=1:
466 arg = (x[0] - mu1)/sigma1;
467 sum += lambda*TMath::Exp(-0.5*arg*arg)/sigma1;
468
469 // k=2:
470 arg = (x[0] - mu2)/sigma2;
471 sum += 0.5*lambda2*TMath::Exp(-0.5*arg*arg)/sigma2;
472
473 // k=3:
474 arg = (x[0] - mu3)/sigma3;
475 sum += 0.1666666667*lambda3*TMath::Exp(-0.5*arg*arg)/sigma3;
476
477 // k=4:
478 arg = (x[0] - mu4)/sigma4;
479 sum += 0.041666666666667*lambda4*TMath::Exp(-0.5*arg*arg)/sigma4;
480
481 return TMath::Exp(-1.*lambda)*par[6]*sum;
482 }
483
484
485
486 ClassDef(MHCalibrationBlindPixel, 1) // Histograms from the Calibration Blind Pixel
487};
488
489#endif /* MARS_MHCalibrationBlindPixel */
Note: See TracBrowser for help on using the repository browser.