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