| 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
|
|---|