HerdSoftware  0.1.1
SiPMTool.h
Go to the documentation of this file.
1 /*
2  * SiPMTool.h
3  *
4  * Tool that adds cross-talk and noise from the SiPM and
5  * the efficiency function for detecting photons.
6  *
7  * Created on 03 Mar 2020
8  * Author: Valerio Formato (based on code by Junjing Wang)
9  */
10 
11 #ifndef HERD_SIPMTOOL_H
12 #define HERD_SIPMTOOL_H
13 
14 // HerdSoftware headers
17 
18 // C++ headers
19 #include <map>
20 #include <random>
21 
23 
24 using poiss_param_t = std::poisson_distribution<unsigned int>::param_type;
25 
26 // this in c++17 will become
27 // namespace Herd::FitDigitizationTools {
28 namespace Herd {
29 namespace FitDigitizationTools {
30 
31 class SiPMTool {
32 
33 public:
37  void addNoise(int matID, FitMCDeposits &deposits);
38 
39  //===========================================================================
40  // Return number of direct crosstalk PEs based on signal photons
41  //===========================================================================
42  int generateDirectXTalk(int nPhotons) {
43  m_pois_dist.param(poiss_param_t{m_probDirectXTalk * nPhotons});
44  return m_pois_dist(m_generator);
45  }
46 
47  //===========================================================================
48  // Return number of delayed crosstalk PEs based on signal photons
49  //===========================================================================
50  int generateDelayedXTalk(int nPhotons) {
51  m_pois_dist.param(poiss_param_t{m_probDelayedXTalk * nPhotons});
52  return m_pois_dist(m_generator);
53  }
54 
55  //===========================================================================
56  // Return (additional) time of delayed crosstalk
57  //===========================================================================
59  // return -log(m_rndmFlat())*m_delayedXtalkDecayTime;
60  // return -log(CLHEP::RandFlat::shoot()) * m_delayedXtalkDecayTime;
62  }
63 
64  //===========================================================================
65  // Return PDE for specific wavelength
66  //===========================================================================
67  float photonDetectionEfficiency(double wavelength);
68 
69  //===========================================================================
70  // Return if SiPM is efficient for this wavelength
71  //===========================================================================
72  bool sipmDetectsPhoton(double wavelength);
73 
74  // N.B. this class doesn't own the geoParams. It just needs to read it, provided by the algorithms
75  void SetGeoParams(const FitGeoParams *p_geoParams) {
76  m_geoParams = p_geoParams;
77  for (const auto &dcr : DCR_PE) {
79  }
80  }
81 
82  // return weighted average of noise photoelectrons
83  float GetAvgNumNoisePhotons();
84 
85 private:
86  void addThermalNoise(int matID, FitMCDeposits &depositCont);
87 
88  FitMCDeposits makeNoiseDeposits(const int noiseChannel, int matID, int nPhotons, double time);
89 
92  double m_probDirectXTalk = 0.04; // "Direct cross-talk probability per pe"};
93 
95  double m_probDelayedXTalk = 0.02; //"Delayed cross-talk probability per pe"};
96 
98  double m_delayedXtalkDecayTime = 14 * ns; //"Parameter for the exponential decay of the delayed X-talk"};
99 
100  // Parameters for the thermal noise simulation
102 
103  // from C. Perrina, private communication:
104  // dark count rate for each noise photoelectron value:
105  // 1 p.e. : 60 kHz @ 25C - 6.5V
106  // 2 p.e. : 180 Hz @ 25C - 6.5V
107  // 3 p.e. : 0.6 Hz @ 25C - 6.5V
108  std::map<unsigned int, double> DCR_PE{{1, 60e3 / s}, {2, 180.0 / s}, {3, 0.6 / s}};
109  double sampling_time = 300 * ns; // 300ns
110  double timeOffset = 0 * ns;
111 
112  double p3 = 2.00479e-08;
113  double p2 = -3.86277e-05;
114  double p1 = 0.0234192;
115  double p0 = -4.06522;
116 
117  // Number of noise deposits over total detector, in readout windows for each photoelectron value.
118  std::map<unsigned int, float> m_avgNumThermNoiseChans_PE;
119 
120  std::mt19937 m_generator;
121  std::uniform_real_distribution<double> m_flat_dist;
122  std::poisson_distribution<unsigned int> m_pois_dist;
123 };
124 } // namespace FitDigitizationTools
125 } // namespace Herd
126 #endif // FTSIPMTOOL_H
int NChannelsPerMat() const
Get the number of channels that are in a mat.
Definition: FitGeoParams.h:102
double m_probDirectXTalk
Definition: SiPMTool.h:92
CssGeoParams.h CssGeoParams class declaration.
Definition: CaloPDCalibrationAlgo.h:24
int generateDelayedXTalk(int nPhotons)
Definition: SiPMTool.h:50
constexpr double s
Definition: Units.h:10
double timeOffset
Definition: SiPMTool.h:110
float photonDetectionEfficiency(double wavelength)
Definition: SiPMTool.cpp:75
void addNoise(int matID, FitMCDeposits &deposits)
Definition: SiPMTool.cpp:21
Data structure for single silicon layer geometry parameters.
Definition: FitGeoParams.h:64
std::poisson_distribution< unsigned int >::param_type poiss_param_t
Definition: PhotonTool.cpp:18
std::map< unsigned int, float > m_avgNumThermNoiseChans_PE
Definition: SiPMTool.h:118
void addThermalNoise(int matID, FitMCDeposits &depositCont)
Definition: SiPMTool.cpp:29
double p3
Definition: SiPMTool.h:112
double p0
Definition: SiPMTool.h:115
std::vector< FitMCDeposit > FitMCDeposits
Definition: FitMCDeposit.h:41
std::poisson_distribution< unsigned int >::param_type poiss_param_t
Definition: SiPMTool.h:24
Definition: SiPMTool.h:31
std::uniform_real_distribution< double > m_flat_dist
Definition: SiPMTool.h:121
double p2
Definition: SiPMTool.h:113
float generateDelayedXTalkTime()
Definition: SiPMTool.h:58
double m_probDelayedXTalk
Value for H2017 October batch.
Definition: SiPMTool.h:95
double p1
Definition: SiPMTool.h:114
void SetGeoParams(const FitGeoParams *p_geoParams)
Definition: SiPMTool.h:75
double sampling_time
Definition: SiPMTool.h:109
std::mt19937 m_generator
Definition: SiPMTool.h:120
std::poisson_distribution< unsigned int > m_pois_dist
Definition: SiPMTool.h:122
constexpr double ns
Definition: Units.h:9
const FitGeoParams * m_geoParams
Definition: SiPMTool.h:101
bool sipmDetectsPhoton(double wavelength)
Definition: SiPMTool.cpp:87
std::map< unsigned int, double > DCR_PE
Definition: SiPMTool.h:108
float GetAvgNumNoisePhotons()
Definition: SiPMTool.cpp:94
double m_delayedXtalkDecayTime
Estimated from Fig.6 of LHCb-INT-2017-006.
Definition: SiPMTool.h:98
int generateDirectXTalk(int nPhotons)
Definition: SiPMTool.h:42
FitMCDeposits makeNoiseDeposits(const int noiseChannel, int matID, int nPhotons, double time)
Definition: SiPMTool.cpp:56