File indexing completed on 2025-04-01 09:06:28
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef SIPM_SIPMPROPERTIES_H
0015 #define SIPM_SIPMPROPERTIES_H
0016
0017 #include <cmath>
0018 #include <cstdint>
0019 #include <iostream>
0020 #include <map>
0021 #include <sstream>
0022 #include <string>
0023 #include <vector>
0024
0025 namespace sipm {
0026 class SiPMProperties {
0027 public:
0028
0029
0030
0031 enum class PdeType {
0032 kNoPde,
0033 kSimplePde,
0034 kSpectrumPde
0035 };
0036
0037
0038
0039 enum class HitDistribution {
0040 kUniform,
0041 kCircle,
0042 kGaussian
0043 };
0044
0045 SiPMProperties();
0046
0047
0048 static SiPMProperties readSettings(const std::string&);
0049
0050
0051 constexpr uint32_t size() const { return m_Size; }
0052
0053
0054 constexpr uint32_t pitch() const { return m_Pitch; }
0055
0056
0057 constexpr uint32_t nCells() const { return m_Ncells; }
0058
0059
0060 constexpr uint32_t nSideCells() const { return m_SideCells; }
0061
0062
0063 constexpr uint32_t nSignalPoints() const { return m_SignalPoints; }
0064
0065
0066 constexpr HitDistribution hitDistribution() const { return m_HitDistribution; }
0067
0068
0069 constexpr double signalLength() const { return m_SignalLength; }
0070
0071
0072 constexpr double sampling() const { return m_Sampling; }
0073
0074
0075 constexpr double risingTime() const { return m_RiseTime; }
0076
0077
0078 constexpr double fallingTimeFast() const { return m_FallTimeFast; }
0079
0080
0081
0082 constexpr double fallingTimeSlow() const { return m_FallTimeSlow; }
0083
0084
0085
0086 constexpr double slowComponentFraction() const { return m_SlowComponentFraction; }
0087
0088
0089 constexpr double recoveryTime() const { return m_RecoveryTime; }
0090
0091
0092 constexpr double dcr() const { return m_Dcr; }
0093
0094
0095 constexpr double xt() const { return m_Xt; }
0096
0097
0098 constexpr double dxt() const { return m_DXt; }
0099
0100
0101 constexpr double dxtTau() const { return m_DXtTau; }
0102
0103
0104 constexpr double ap() const { return m_Ap; }
0105
0106
0107 constexpr double tauApFast() const { return m_TauApFastComponent; }
0108
0109
0110 constexpr double tauApSlow() const { return m_TauApSlowComponent; }
0111
0112
0113 constexpr double apSlowFraction() const { return m_ApSlowFraction; }
0114
0115
0116 constexpr float ccgv() const { return m_Ccgv; }
0117
0118
0119 constexpr double gain() const { return m_Gain; }
0120
0121
0122 constexpr double snrdB() const { return m_SnrdB; }
0123
0124
0125 constexpr double snrLinear() const { return m_SnrLinear; }
0126
0127
0128 constexpr double pde() const { return m_Pde; }
0129
0130
0131 std::map<double, double> pdeSpectrum() const { return m_PdeSpectrum; }
0132
0133
0134 constexpr PdeType pdeType() { return m_HasPde; }
0135
0136
0137 constexpr bool hasDcr() const { return m_HasDcr; }
0138
0139
0140 constexpr bool hasXt() const { return m_HasXt; }
0141
0142
0143 constexpr bool hasDXt() const { return m_HasDXt; }
0144
0145
0146 constexpr bool hasAp() const { return m_HasAp; }
0147
0148
0149
0150 constexpr bool hasSlowComponent() const { return m_HasSlowComponent; }
0151
0152
0153 void setProperty(const std::string&, const double);
0154
0155
0156
0157 constexpr void setSize(const double x) {
0158 m_Size = x;
0159 m_SideCells = 1000 * m_Size / m_Pitch;
0160 m_Ncells = m_SideCells * m_SideCells;
0161 }
0162
0163
0164
0165 constexpr void setPitch(const double x) {
0166 m_Pitch = x;
0167 m_SideCells = 1000 * m_Size / m_Pitch;
0168 m_Ncells = m_SideCells * m_SideCells;
0169 }
0170
0171
0172 void setSampling(const double x) {
0173 m_Sampling = x;
0174 m_SignalPoints = m_SignalLength / m_Sampling;
0175 }
0176
0177
0178
0179 constexpr void setSignalLength(const double x) {
0180 m_SignalLength = x;
0181 m_SignalPoints = m_SignalLength / m_Sampling;
0182 }
0183
0184
0185
0186 constexpr void setRiseTime(const double x) { m_RiseTime = x; }
0187
0188
0189
0190 constexpr void setFallTimeFast(const double x) { m_FallTimeFast = x; }
0191
0192
0193
0194
0195 constexpr void setFallTimeSlow(const double x) {
0196 m_FallTimeSlow = x;
0197 m_HasSlowComponent = true;
0198 }
0199
0200
0201
0202 constexpr void setSlowComponentFraction(const double x) {
0203 m_SlowComponentFraction = x;
0204 m_HasSlowComponent = true;
0205 }
0206
0207
0208
0209 constexpr void setRecoveryTime(const double x) { m_RecoveryTime = x; }
0210
0211
0212
0213 constexpr void setSnr(const double x) {
0214 m_SnrdB = x;
0215 m_SnrLinear = pow(10, -m_SnrdB / 20);
0216 }
0217
0218
0219
0220 constexpr void setTauApFastComponent(const double x) { m_TauApFastComponent = x; }
0221
0222
0223
0224 constexpr void setTauApSlowComponent(const double x) { m_TauApSlowComponent = x; }
0225
0226
0227
0228 constexpr void setApSlowFraction(const double x) { m_ApSlowFraction = x; }
0229
0230
0231
0232 constexpr void setCcgv(const float x) { m_Ccgv = x; }
0233
0234
0235
0236 constexpr void setPde(const double x) {
0237 m_Pde = x;
0238 m_HasPde = PdeType::kSimplePde;
0239 }
0240
0241
0242
0243 constexpr void setDcr(const double val) {
0244 m_Dcr = val;
0245 m_HasDcr = true;
0246 }
0247
0248
0249
0250 constexpr void setXt(const double val) {
0251 m_Xt = val;
0252 m_HasXt = true;
0253 }
0254
0255
0256
0257 constexpr void setDXt(const double val) {
0258 m_DXt = val;
0259 m_HasDXt = true;
0260 }
0261
0262
0263
0264 constexpr void setDXtTau(const double val) { m_DXtTau = val; }
0265
0266
0267
0268 constexpr void setAp(const double val) {
0269 m_Ap = val;
0270 m_HasAp = true;
0271 }
0272
0273
0274 constexpr void setDcrOff() { m_HasDcr = false; }
0275
0276 constexpr void setXtOff() { m_HasXt = false; }
0277
0278 constexpr void setDXtOff() { m_HasXt = false; }
0279
0280 constexpr void setApOff() { m_HasAp = false; }
0281
0282 constexpr void setSlowComponentOff() { m_HasSlowComponent = false; }
0283
0284 constexpr void setDcrOn() { m_HasDcr = true; }
0285
0286 constexpr void setXtOn() { m_HasXt = true; }
0287
0288 constexpr void setDXtOn() { m_HasDXt = true; }
0289
0290 constexpr void setApOn() { m_HasAp = true; }
0291
0292 constexpr void setSlowComponentOn() { m_HasSlowComponent = true; }
0293
0294 constexpr void setPdeType(PdeType val) { m_HasPde = val; }
0295
0296
0297 void setPdeSpectrum(const std::vector<double>&, const std::vector<double>&);
0298
0299
0300 constexpr void setHitDistribution(const HitDistribution val) { m_HitDistribution = val; }
0301
0302 friend std::ostream& operator<<(std::ostream&, const SiPMProperties&);
0303 std::string toString() const {
0304 std::stringstream ss;
0305 ss << *this;
0306 return ss.str();
0307 }
0308
0309 private:
0310 double m_Size = 1;
0311 double m_Pitch = 25;
0312 uint32_t m_Ncells;
0313 uint32_t m_SideCells;
0314 HitDistribution m_HitDistribution = HitDistribution::kUniform;
0315
0316 double m_Sampling = 1;
0317 double m_SignalLength = 500;
0318 uint32_t m_SignalPoints = 0;
0319 double m_RiseTime = 1;
0320 double m_FallTimeFast = 50;
0321 double m_FallTimeSlow = 100;
0322 double m_SlowComponentFraction = 0.2;
0323 double m_RecoveryTime = 50;
0324
0325 double m_Dcr = 200e3;
0326 double m_Xt = 0.05;
0327 double m_DXt = 0.05;
0328 double m_DXtTau = 15;
0329 double m_Ap = 0.03;
0330 double m_TauApFastComponent = 10;
0331 double m_TauApSlowComponent = 80;
0332 double m_ApSlowFraction = 0.5;
0333 float m_Ccgv = 0.05;
0334 double m_SnrdB = 30;
0335 float m_Gain = 1.0;
0336 double m_SnrLinear;
0337
0338 double m_Pde = 1;
0339 std::map<double, double> m_PdeSpectrum;
0340 PdeType m_HasPde = PdeType::kNoPde;
0341
0342 bool m_HasDcr = true;
0343 bool m_HasXt = true;
0344 bool m_HasDXt = false;
0345 bool m_HasAp = true;
0346 bool m_HasSlowComponent = false;
0347 };
0348 }
0349 #endif