HerdSoftware  0.4.0
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 {
29 
30 class SiPMTool {
31 
32 public:
36  void addNoise(int matID, FitMCDeposits &deposits);
37 
38  //===========================================================================
39  // Return number of direct crosstalk PEs based on signal photons
40  //===========================================================================
41  int generateDirectXTalk(int nPhotons) {
42  m_pois_dist.param(poiss_param_t{m_probDirectXTalk * nPhotons});
43  return m_pois_dist(m_generator);
44  }
45 
46  //===========================================================================
47  // Return number of delayed crosstalk PEs based on signal photons
48  //===========================================================================
49  int generateDelayedXTalk(int nPhotons) {
50  m_pois_dist.param(poiss_param_t{m_probDelayedXTalk * nPhotons});
51  return m_pois_dist(m_generator);
52  }
53 
54  //===========================================================================
55  // Return (additional) time of delayed crosstalk
56  //===========================================================================
58  // return -log(m_rndmFlat())*m_delayedXtalkDecayTime;
59  // return -log(CLHEP::RandFlat::shoot()) * m_delayedXtalkDecayTime;
61  }
62 
63  //===========================================================================
64  // Return PDE for specific wavelength
65  //===========================================================================
66  float photonDetectionEfficiency(double wavelength);
67 
68  //===========================================================================
69  // Return if SiPM is efficient for this wavelength
70  //===========================================================================
71  bool sipmDetectsPhoton(double wavelength);
72 
73  // N.B. this class doesn't own the geoParams. It just needs to read it, provided by the algorithms
74  void SetGeoParams(const FitGeoParams *p_geoParams) {
75  m_geoParams = p_geoParams;
76  for (const auto &dcr : m_DCR_PE) {
78  }
79  }
80 
81  // return weighted average of noise photoelectrons
82  float AvgNumNoisePhotons();
83 
84 private:
85  void addThermalNoise(int matID, FitMCDeposits &depositCont);
86 
87  FitMCDeposits makeNoiseDeposits(const int noiseChannel, int matID, int nPhotons, double time);
88 
91  double m_probDirectXTalk = 0.04; // "Direct cross-talk probability per pe"};
92 
94  double m_probDelayedXTalk = 0.02; //"Delayed cross-talk probability per pe"};
95 
97  double m_delayedXtalkDecayTime = 14 * ns; //"Parameter for the exponential decay of the delayed X-talk"};
98 
99  // Parameters for the thermal noise simulation
101 
102  // from C. Perrina, private communication:
103  // dark count rate for each noise photoelectron value:
104  // 1 p.e. : 60 kHz @ 25C - 6.5V
105  // 2 p.e. : 180 Hz @ 25C - 6.5V
106  // 3 p.e. : 0.6 Hz @ 25C - 6.5V
107  std::map<unsigned int, double> m_DCR_PE{{1, 60e3 / s}, {2, 180.0 / s}, {3, 0.6 / s}};
108  double m_sampling_time = 300 * ns; // 300ns
109  double m_timeOffset = 0 * ns;
110 
111  double m_p3 = 2.00479e-08;
112  double m_p2 = -3.86277e-05;
113  double m_p1 = 0.0234192;
114  double m_p0 = -4.06522;
115 
116  // Number of noise deposits over total detector, in readout windows for each photoelectron value.
117  std::map<unsigned int, float> m_avgNumThermNoiseChans_PE;
118 
119  std::mt19937 m_generator;
120  std::uniform_real_distribution<double> m_flat_dist;
121  std::poisson_distribution<unsigned int> m_pois_dist;
122 };
123 } // namespace Herd::FitDigitizationTools
124 #endif // FTSIPMTOOL_H
Herd::FitDigitizationTools::SiPMTool::m_p2
double m_p2
Definition: SiPMTool.h:112
Herd::FitDigitizationTools::SiPMTool::generateDelayedXTalkTime
float generateDelayedXTalkTime()
Definition: SiPMTool.h:57
FitGeoParams.h
Herd::FitDigitizationTools::SiPMTool::m_probDelayedXTalk
double m_probDelayedXTalk
Value for H2017 October batch.
Definition: SiPMTool.h:94
Herd::FitDigitizationTools::SiPMTool::m_generator
std::mt19937 m_generator
Definition: SiPMTool.h:119
Herd::FitDigitizationTools::SiPMTool::AvgNumNoisePhotons
float AvgNumNoisePhotons()
Definition: SiPMTool.cpp:93
Herd::FitDigitizationTools::SiPMTool::m_DCR_PE
std::map< unsigned int, double > m_DCR_PE
Definition: SiPMTool.h:107
Herd::FitDigitizationTools
Definition: AttenuationTool.h:26
Herd::FitDigitizationTools::SiPMTool::m_geoParams
const FitGeoParams * m_geoParams
Definition: SiPMTool.h:100
Herd::FitGeoParams::NChannelsPerMat
int NChannelsPerMat() const
Get the number of channels that are in a mat.
Definition: FitGeoParams.h:112
Herd::FitDigitizationTools::SiPMTool::m_p0
double m_p0
Definition: SiPMTool.h:114
Herd::FitDigitizationTools::poiss_param_t
std::poisson_distribution< unsigned int >::param_type poiss_param_t
Definition: PhotonTool.cpp:17
Herd::FitDigitizationTools::s
constexpr double s
Definition: Units.h:9
Herd::FitDigitizationTools::SiPMTool::sipmDetectsPhoton
bool sipmDetectsPhoton(double wavelength)
Definition: SiPMTool.cpp:86
Herd::FitDigitizationTools::SiPMTool::SetGeoParams
void SetGeoParams(const FitGeoParams *p_geoParams)
Definition: SiPMTool.h:74
Herd::FitDigitizationTools::FitMCDeposits
std::vector< FitMCDeposit > FitMCDeposits
Definition: FitMCDeposit.h:40
Herd::FitDigitizationTools::SiPMTool::generateDirectXTalk
int generateDirectXTalk(int nPhotons)
Definition: SiPMTool.h:41
Herd::FitDigitizationTools::ns
constexpr double ns
Definition: Units.h:8
Herd::FitDigitizationTools::SiPMTool::photonDetectionEfficiency
float photonDetectionEfficiency(double wavelength)
Definition: SiPMTool.cpp:74
Herd::FitDigitizationTools::SiPMTool::m_delayedXtalkDecayTime
double m_delayedXtalkDecayTime
Estimated from Fig.6 of LHCb-INT-2017-006.
Definition: SiPMTool.h:97
Herd::FitGeoParams
Data structure for single silicon layer geometry parameters.
Definition: FitGeoParams.h:66
Herd::FitDigitizationTools::SiPMTool::m_p3
double m_p3
Definition: SiPMTool.h:111
Herd::FitDigitizationTools::SiPMTool::addNoise
void addNoise(int matID, FitMCDeposits &deposits)
Definition: SiPMTool.cpp:20
Herd::FitDigitizationTools::SiPMTool::makeNoiseDeposits
FitMCDeposits makeNoiseDeposits(const int noiseChannel, int matID, int nPhotons, double time)
Definition: SiPMTool.cpp:55
Herd::FitDigitizationTools::SiPMTool::generateDelayedXTalk
int generateDelayedXTalk(int nPhotons)
Definition: SiPMTool.h:49
Herd::FitDigitizationTools::SiPMTool::m_sampling_time
double m_sampling_time
Definition: SiPMTool.h:108
Herd::FitDigitizationTools::SiPMTool::addThermalNoise
void addThermalNoise(int matID, FitMCDeposits &depositCont)
Definition: SiPMTool.cpp:28
Units.h
Herd::FitDigitizationTools::SiPMTool::m_probDirectXTalk
double m_probDirectXTalk
Definition: SiPMTool.h:91
Herd::FitDigitizationTools::SiPMTool::m_avgNumThermNoiseChans_PE
std::map< unsigned int, float > m_avgNumThermNoiseChans_PE
Definition: SiPMTool.h:117
poiss_param_t
std::poisson_distribution< unsigned int >::param_type poiss_param_t
Definition: SiPMTool.h:24
Herd::FitDigitizationTools::SiPMTool::m_timeOffset
double m_timeOffset
Definition: SiPMTool.h:109
Herd::FitDigitizationTools::SiPMTool::m_flat_dist
std::uniform_real_distribution< double > m_flat_dist
Definition: SiPMTool.h:120
Herd::FitDigitizationTools::SiPMTool
Definition: SiPMTool.h:30
Herd::FitDigitizationTools::SiPMTool::m_p1
double m_p1
Definition: SiPMTool.h:113
FitMCDeposit.h
Herd::FitDigitizationTools::SiPMTool::m_pois_dist
std::poisson_distribution< unsigned int > m_pois_dist
Definition: SiPMTool.h:121