5 #include "CLHEP/Random/RandPoissonQ.h" 6 #include "CLHEP/Random/RandGaussQ.h" 11 : debug_(pset.getUntrackedParameter<
bool>(
"debug",
false)),
12 bxTime_(pset.getParameter<double>(
"bxTime")),
13 testBeamMIPTimeRes_(pset.getParameter<double>(
"TestBeamMIPTimeRes")),
14 ScintillatorRiseTime_(pset.getParameter<double>(
"ScintillatorRiseTime")),
15 ScintillatorDecayTime_(pset.getParameter<double>(
"ScintillatorDecayTime")),
16 ChannelTimeOffset_(pset.getParameter<double>(
"ChannelTimeOffset")),
17 smearChannelTimeOffset_(pset.getParameter<double>(
"smearChannelTimeOffset")),
18 EnergyThreshold_(pset.getParameter<double>(
"EnergyThreshold")),
19 TimeThreshold1_(pset.getParameter<double>(
"TimeThreshold1")),
20 TimeThreshold2_(pset.getParameter<double>(
"TimeThreshold2")),
21 ReferencePulseNpe_(pset.getParameter<double>(
"ReferencePulseNpe")),
22 SinglePhotonTimeResolution_(pset.getParameter<double>(
"SinglePhotonTimeResolution")),
23 DarkCountRate_(pset.getParameter<double>(
"DarkCountRate")),
24 SigmaElectronicNoise_(pset.getParameter<double>(
"SigmaElectronicNoise")),
25 SigmaClock_(pset.getParameter<double>(
"SigmaClock")),
26 Npe_to_pC_(pset.getParameter<double>(
"Npe_to_pC")),
27 Npe_to_V_(pset.getParameter<double>(
"Npe_to_V")),
28 adcNbits_(pset.getParameter<uint32_t>(
"adcNbits")),
29 tdcNbits_(pset.getParameter<uint32_t>(
"tdcNbits")),
30 adcSaturation_MIP_(pset.getParameter<double>(
"adcSaturation_MIP")),
31 adcBitSaturation_(
std::
pow(2, adcNbits_) - 1),
32 adcLSB_MIP_(adcSaturation_MIP_ / adcBitSaturation_),
33 adcThreshold_MIP_(pset.getParameter<double>(
"adcThreshold_MIP")),
34 toaLSB_ns_(pset.getParameter<double>(
"toaLSB_ns")),
35 tdcBitSaturation_(
std::
pow(2, tdcNbits_) - 1),
36 CorrCoeff_(pset.getParameter<double>(
"CorrelationCoefficient")),
37 cosPhi_(0.5 * (
sqrt(1. + CorrCoeff_) +
sqrt(1. - CorrCoeff_))),
38 sinPhi_(0.5 * CorrCoeff_ / cosPhi_),
39 ScintillatorDecayTime2_(ScintillatorDecayTime_ * ScintillatorDecayTime_),
40 SPTR2_(SinglePhotonTimeResolution_ * SinglePhotonTimeResolution_),
41 DCRxRiseTime_(DarkCountRate_ * ScintillatorRiseTime_),
42 SigmaElectronicNoise2_(SigmaElectronicNoise_ * SigmaElectronicNoise_),
43 SigmaClock2_(SigmaClock_ * SigmaClock_) {}
47 CLHEP::HepRandomEngine* hre)
const {
50 for (MTDSimHitDataAccumulator::const_iterator it = input.begin(); it != input.end(); it++) {
54 for (
size_t i = 0;
i < it->second.hit_info[0].size();
i++) {
56 float Npe = CLHEP::RandPoissonQ::shoot(hre, (it->second).hit_info[0][
i]);
70 std::array<float, 3> times =
77 float finalToA2 = finalToA1 + times[1];
78 finalToA1 += times[0];
85 float smearing_stat_thr1 = CLHEP::RandGaussQ::shoot(hre, 0., sigma);
86 float smearing_stat_thr2 = CLHEP::RandGaussQ::shoot(hre, 0., sigma);
88 finalToA1 += smearing_stat_thr1;
89 finalToA2 += smearing_stat_thr2;
94 float smearing_stat_thr1 =
96 float smearing_stat_thr2 = CLHEP::RandGaussQ::shoot(
98 finalToA1 += smearing_stat_thr1;
99 finalToA2 += smearing_stat_thr1 + smearing_stat_thr2;
106 float sigma2_tot_thr1 =
108 float sigma2_tot_thr2 =
112 float smearing_thr1_uncorr = CLHEP::RandGaussQ::shoot(hre, 0.,
sqrt(sigma2_tot_thr1));
113 float smearing_thr2_uncorr = CLHEP::RandGaussQ::shoot(hre, 0.,
sqrt(sigma2_tot_thr2));
115 finalToA1 +=
cosPhi_ * smearing_thr1_uncorr +
sinPhi_ * smearing_thr2_uncorr;
116 finalToA2 +=
sinPhi_ * smearing_thr1_uncorr +
cosPhi_ * smearing_thr2_uncorr;
126 runTrivialShaper(rawDataFrame, chargeColl, toa1, toa2, it->first.row_, it->first.column_);
136 const uint8_t
col)
const {
139 for (
int it = 0; it < (
int)(chargeColl.size()); it++)
140 debug |= (chargeColl[it] > adcThreshold_fC_);
147 for (
int it = 0; it < (
int)(chargeColl.size()); it++) {
149 newSample.
set(
false,
false, 0, 0, 0, row, col);
165 std::ostringstream
msg;
166 dataFrame.
print(msg);
174 bool putInEvent(
false);
175 for (
int it = 0; it <
dfSIZE; ++it) {
176 dataFrame.setSample(it, rawDataFrame[it]);
178 putInEvent = rawDataFrame[it].threshold();
187 float OneOverR = 1. /
R;
188 float OneOverR2 = OneOverR * OneOverR;
191 float sigma2 = Q * OneOverR2 *
192 (1. + 2. * (Q + 1.) * OneOverR + (Q + 1.) * (6. * Q + 11) * OneOverR2 +
193 (Q + 1.) * (Q + 2.) * (2. * Q + 5.) * OneOverR2 * OneOverR);
const float DCRxRiseTime_
const float adcThreshold_MIP_
std::array< MTDSimData_t, nSamples > MTDSimHitData
float sigma2_pe(const float &Q, const float &R) const
void push_back(T const &t)
std::unordered_map< MTDCellId, MTDCellInfo > MTDSimHitDataAccumulator
const float TimeThreshold2_
static std::string const input
void updateOutput(BTLDigiCollection &coll, const BTLDataFrame &rawDataFrame) const
const float ScintillatorDecayTime2_
const BTLPulseShape btlPulseShape_
void resize(size_t s)
allow to set size
void run(const mtd::MTDSimHitDataAccumulator &input, BTLDigiCollection &output, CLHEP::HepRandomEngine *hre) const
const uint32_t adcBitSaturation_
void setSample(int i, const S &sample)
constexpr int adc(sample_type sample)
get the ADC sample (12 bits)
BTLElectronicsSim(const edm::ParameterSet &pset)
const float SigmaElectronicNoise2_
const float EnergyThreshold_
const uint32_t tdcBitSaturation_
std::array< float, 3 > timeAtThr(const float scale, const float threshold1, const float threshold2) const
const float ScintillatorDecayTime_
const float TimeThreshold1_
void set(bool thr, bool mode, uint16_t toa2, uint16_t toa, uint16_t data, uint8_t row, uint8_t col)
const float ChannelTimeOffset_
const float testBeamMIPTimeRes_
void runTrivialShaper(BTLDataFrame &dataFrame, const mtd::MTDSimHitData &chargeColl, const mtd::MTDSimHitData &toa1, const mtd::MTDSimHitData &toa2, const uint8_t row, const uint8_t col) const
const float smearChannelTimeOffset_
void print(std::ostream &out=std::cout)
Power< A, B >::type pow(const A &a, const B &b)
const float ReferencePulseNpe_
const D & id() const
det id