BmnRoot
Loading...
Searching...
No Matches
BmnFHCalDigitizer.h
Go to the documentation of this file.
1#ifndef BMNFHCALDIGITIZER_H
2#define BMNFHCALDIGITIZER_H
3
4#include "BmnFHCalDigit.h"
5#include "BmnFHCalPoint.h"
6#include "FairLogger.h"
7#include "FairTask.h"
8#include "TClonesArray.h"
9
10#include <TRandom3.h>
11#include <iostream>
12#include <unordered_map>
13#include <vector>
14
15class BmnFHCalDigitizer : public FairTask
16{
17 public:
18 struct SiPM
19 {
20 int Npixels; // Total number of pixels in SiPM (for saturation)
21 int pixPerMIP; // MIP to N SiPM pixels with PDE taken into account
22 double noiseMIP; // MIP noise level
23 double gevPerMIP; // MIP to GeV conversion factor
24
25 SiPM() = default;
26
27 SiPM(int Npixels_, int pixPerMIP_, double noiseMIP_, double gevPerMIP_)
28 : Npixels(Npixels_)
29 , pixPerMIP(pixPerMIP_)
30 , noiseMIP(noiseMIP_)
31 , gevPerMIP(gevPerMIP_)
32 {}
33
34 ~SiPM() = default;
35
36 ULong64_t ModelNpixels(double meanPixels) { return gRandom->Poisson(meanPixels); }
37
38 ULong64_t ModelSaturation(ULong64_t firedPixels)
39 {
40 return static_cast<ULong64_t>(
41 std::round(Npixels * (1.0 - std::exp(-static_cast<double>(firedPixels) / Npixels))));
42 }
43
44 double ModelNoise(double meanMIP) { return gRandom->Gaus(meanMIP, noiseMIP); }
45
46 double ModelResponse(double pfELoss)
47 {
48 auto meanPixels = (pfELoss / gevPerMIP) * pixPerMIP;
49 auto firedPixels = ModelNpixels(meanPixels);
50 firedPixels = ModelSaturation(firedPixels);
51 return gevPerMIP * ModelNoise(static_cast<double>(firedPixels) / pixPerMIP);
52 }
53 };
54
55 // Constructor and Destructor
56 BmnFHCalDigitizer(const int period);
57 BmnFHCalDigitizer(const char* config = nullptr);
59
60 // Overridden FairTask methods
61 virtual InitStatus Init();
62 virtual void Exec(Option_t* opt);
63 virtual void Finish();
64
65 // Setter methods
66 InitStatus LoadConfig(const char* config);
67 void SetScale(double scale) { fScale = scale; }
68 void SetThreshold(double setValue) { fThreshold = setValue; }
69 void SetTimeCut(double setValue) { fTimeCut = setValue; }
70 void SetSiPM(int Npixels, int pixPerMIP, double noiseMIP, double gevPerMIP)
71 {
72 fSiPM.Npixels = Npixels;
73 fSiPM.pixPerMIP = pixPerMIP;
74 fSiPM.noiseMIP = noiseMIP;
75 fSiPM.gevPerMIP = gevPerMIP;
76 }
77
78 private:
79 double fScale; // Scale factor
80 double fThreshold; // Noise threshold level
81 double fTimeCut; // Cut times above this
82 SiPM fSiPM; // SiPM properties and methods
83
84 TClonesArray* fPointArray; // Input array of BmnFHCalPoints
85 TClonesArray* fDigiArray; // Output array of BmnFHCalDigits
86
87 std::unordered_map<uint32_t, std::vector<BmnFHCalPoint*>>
88 fuoHitMap; // Physical address (w/o scint) to point vector map
89 void FillHitMap();
90
91 float fworkTime; // Accumulated work time for the digitizer
92 ClassDef(BmnFHCalDigitizer, 3);
93};
94
95#endif // BMNFHCALDIGITIZER_H
void SetThreshold(double setValue)
InitStatus LoadConfig(const char *config)
void SetSiPM(int Npixels, int pixPerMIP, double noiseMIP, double gevPerMIP)
BmnFHCalDigitizer(const char *config=nullptr)
virtual void Finish()
virtual InitStatus Init()
BmnFHCalDigitizer(const int period)
void SetTimeCut(double setValue)
void SetScale(double scale)
virtual void Exec(Option_t *opt)
virtual ~BmnFHCalDigitizer()
SiPM(int Npixels_, int pixPerMIP_, double noiseMIP_, double gevPerMIP_)
double ModelNoise(double meanMIP)
ULong64_t ModelNpixels(double meanPixels)
double ModelResponse(double pfELoss)
ULong64_t ModelSaturation(ULong64_t firedPixels)