1 | #ifndef MARS_MAvalanchePhotoDiode
|
---|
2 | #define MARS_MAvalanchePhotoDiode
|
---|
3 |
|
---|
4 | #ifndef ROOT_TH2
|
---|
5 | #include <TH2.h>
|
---|
6 | #endif
|
---|
7 |
|
---|
8 | class APD : public TObject // FIXME: Derive from TH2?
|
---|
9 | {
|
---|
10 | private:
|
---|
11 | TH2F fHist;
|
---|
12 |
|
---|
13 | Float_t fCrosstalkProb; // Probability that a converted photon creates another one in a neighboring cell
|
---|
14 | Float_t fDeadTime; // Deadtime of a single cell after a hit
|
---|
15 | Float_t fRecoveryTime; // Recoverytime after Deadtime (1-exp(-t/fRecoveryTime)
|
---|
16 |
|
---|
17 | Float_t fTime; // A user settable time of the system
|
---|
18 |
|
---|
19 | Float_t HitCellImp(Int_t x, Int_t y, Float_t t=0);
|
---|
20 |
|
---|
21 | public:
|
---|
22 | APD(Int_t n, Float_t prob=0, Float_t dt=0, Float_t rt=0);
|
---|
23 |
|
---|
24 | Float_t HitCell(Int_t x, Int_t y, Float_t t=0);
|
---|
25 | Float_t HitRandomCell(Float_t t=0);
|
---|
26 | Float_t HitRandomCellRelative(Float_t t=0) { return HitRandomCell(fTime+t); }
|
---|
27 |
|
---|
28 | void FillEmpty(Float_t t=0);
|
---|
29 | void FillRandom(Float_t rate, Float_t t=0);
|
---|
30 |
|
---|
31 | void Init(Float_t rate) { if (fTime<0) FillRandom(rate); else Relax(rate); }
|
---|
32 |
|
---|
33 | Int_t CountDeadCells(Float_t t=0) const;
|
---|
34 | Int_t CountRecoveringCells(Float_t t=0) const;
|
---|
35 |
|
---|
36 | Float_t GetCellContent(Int_t x, Int_t y) const { return fHist.GetBinContent(x, y); }
|
---|
37 | Int_t GetNumCellsX() const { return fHist.GetNbinsX(); }
|
---|
38 |
|
---|
39 | Float_t GetCrosstalkProb() const { return fCrosstalkProb; }
|
---|
40 | Float_t GetDeadTime() const { return fDeadTime; }
|
---|
41 | Float_t GetRecoveryTime() const { return fRecoveryTime; }
|
---|
42 | Float_t GetTime() const { return fTime; }
|
---|
43 |
|
---|
44 | Float_t GetRelaxationTime(Float_t threshold=0.001) const;
|
---|
45 |
|
---|
46 | Float_t GetLastHit() const { return fHist.GetMaximum(); }
|
---|
47 |
|
---|
48 | void SetTime(Float_t tm) { fTime=tm; }
|
---|
49 | void IncreaseTime(Float_t dt) { fTime += dt; }
|
---|
50 |
|
---|
51 | Float_t Evolve(Double_t freq, Double_t dt);
|
---|
52 | Float_t Relax(Double_t freq, Float_t threshold=0.001) { return Evolve(freq, GetRelaxationTime(threshold)); }
|
---|
53 |
|
---|
54 | void Draw(Option_t *o="") { fHist.Draw(o); }
|
---|
55 | void DrawCopy(Option_t *o="") { fHist.DrawCopy(o); }
|
---|
56 |
|
---|
57 | ClassDef(APD, 1) // An object representing a Geigermode APD
|
---|
58 | };
|
---|
59 |
|
---|
60 | #endif
|
---|