6 #include "CLHEP/Random/RandPoissonQ.h"
7 #include "CLHEP/Random/RandGaussQ.h"
12 :
debug_(pset.getUntrackedParameter<bool>(
"debug",
false)),
13 bxTime_(pset.getParameter<double>(
"bxTime")),
14 testBeamMIPTimeRes_(pset.getParameter<double>(
"TestBeamMIPTimeRes")),
15 ScintillatorRiseTime_(pset.getParameter<double>(
"ScintillatorRiseTime")),
16 ScintillatorDecayTime_(pset.getParameter<double>(
"ScintillatorDecayTime")),
17 ChannelTimeOffset_(pset.getParameter<double>(
"ChannelTimeOffset")),
18 smearChannelTimeOffset_(pset.getParameter<double>(
"smearChannelTimeOffset")),
19 EnergyThreshold_(pset.getParameter<double>(
"EnergyThreshold")),
20 TimeThreshold1_(pset.getParameter<double>(
"TimeThreshold1")),
21 TimeThreshold2_(pset.getParameter<double>(
"TimeThreshold2")),
22 ReferencePulseNpe_(pset.getParameter<double>(
"ReferencePulseNpe")),
23 SinglePhotonTimeResolution_(pset.getParameter<double>(
"SinglePhotonTimeResolution")),
24 DarkCountRate_(pset.getParameter<double>(
"DarkCountRate")),
25 SigmaElectronicNoise_(pset.getParameter<double>(
"SigmaElectronicNoise")),
26 SigmaClock_(pset.getParameter<double>(
"SigmaClock")),
27 smearTimeForOOTtails_(pset.getParameter<bool>(
"SmearTimeForOOTtails")),
28 Npe_to_pC_(pset.getParameter<double>(
"Npe_to_pC")),
29 Npe_to_V_(pset.getParameter<double>(
"Npe_to_V")),
30 adcNbits_(pset.getParameter<uint32_t>(
"adcNbits")),
31 tdcNbits_(pset.getParameter<uint32_t>(
"tdcNbits")),
32 adcSaturation_MIP_(pset.getParameter<double>(
"adcSaturation_MIP")),
33 adcBitSaturation_(std::
pow(2, adcNbits_) - 1),
34 adcLSB_MIP_(adcSaturation_MIP_ / adcBitSaturation_),
35 adcThreshold_MIP_(pset.getParameter<double>(
"adcThreshold_MIP")),
36 toaLSB_ns_(pset.getParameter<double>(
"toaLSB_ns")),
37 tdcBitSaturation_(std::
pow(2, tdcNbits_) - 1),
38 CorrCoeff_(pset.getParameter<double>(
"CorrelationCoefficient")),
39 cosPhi_(0.5 * (
sqrt(1. + CorrCoeff_) +
sqrt(1. - CorrCoeff_))),
40 sinPhi_(0.5 * CorrCoeff_ / cosPhi_),
41 ScintillatorDecayTime2_(ScintillatorDecayTime_ * ScintillatorDecayTime_),
42 ScintillatorDecayTimeInv_(1. / ScintillatorDecayTime_),
43 SPTR2_(SinglePhotonTimeResolution_ * SinglePhotonTimeResolution_),
44 DCRxRiseTime_(DarkCountRate_ * ScintillatorRiseTime_),
45 SigmaElectronicNoise2_(SigmaElectronicNoise_ * SigmaElectronicNoise_),
46 SigmaClock2_(SigmaClock_ * SigmaClock_) {}
50 CLHEP::HepRandomEngine* hre)
const {
53 for (MTDSimHitDataAccumulator::const_iterator it = input.begin(); it != input.end(); it++) {
60 for (
size_t iside = 0; iside < 2; iside++) {
62 float Npe = CLHEP::RandPoissonQ::shoot(hre, (it->second).hit_info[2 * iside][iBX]);
71 finalToA1 += timeSmearing;
76 std::array<float, 3> times =
83 float finalToA2 = finalToA1 + times[1];
84 finalToA1 += times[0];
91 if ((it->second).hit_info[2 * iside][ibx] > 0.) {
92 float hit_time = (it->second).hit_info[1 + 2 * iside][ibx] +
bxTime_ * (ibx - mtd_digitizer::kInTimeBX);
93 float npe_oot = CLHEP::RandPoissonQ::shoot(hre, (it->second).hit_info[2 * iside][ibx]);
100 float smearing_oot = CLHEP::RandGaussQ::shoot(hre, 0., sigma_oot);
101 finalToA1 += smearing_oot;
102 finalToA2 += smearing_oot;
111 float smearing_stat_thr1 = CLHEP::RandGaussQ::shoot(hre, 0., sigma);
112 float smearing_stat_thr2 = CLHEP::RandGaussQ::shoot(hre, 0., sigma);
114 finalToA1 += smearing_stat_thr1;
115 finalToA2 += smearing_stat_thr2;
120 float smearing_stat_thr1 =
122 float smearing_stat_thr2 = CLHEP::RandGaussQ::shoot(
124 finalToA1 += smearing_stat_thr1;
125 finalToA2 += smearing_stat_thr1 + smearing_stat_thr2;
132 float sigma2_tot_thr1 =
134 float sigma2_tot_thr2 =
138 float smearing_thr1_uncorr = CLHEP::RandGaussQ::shoot(hre, 0.,
sqrt(sigma2_tot_thr1));
139 float smearing_thr2_uncorr = CLHEP::RandGaussQ::shoot(hre, 0.,
sqrt(sigma2_tot_thr2));
141 finalToA1 +=
cosPhi_ * smearing_thr1_uncorr +
sinPhi_ * smearing_thr2_uncorr;
142 finalToA2 +=
sinPhi_ * smearing_thr1_uncorr +
cosPhi_ * smearing_thr2_uncorr;
146 toa1[iside] = finalToA1;
147 toa2[iside] = finalToA2;
153 runTrivialShaper(rawDataFrame, chargeColl, toa1, toa2, it->first.row_, it->first.column_);
164 const uint8_t
col)
const {
167 for (
int it = 0; it < (int)(chargeColl.size()); it++)
175 for (
int it = 0; it < (int)(chargeColl.size()); it++) {
177 newSample.
set(
false,
false, 0, 0, 0, row, col);
193 std::ostringstream
msg;
194 dataFrame.
print(msg);
202 bool putInEvent(
false);
203 for (
int it = 0; it <
dfSIZE; ++it) {
204 dataFrame.setSample(it, rawDataFrame[it]);
206 putInEvent = rawDataFrame[it].threshold();
215 float OneOverR = 1. /
R;
216 float OneOverR2 = OneOverR * OneOverR;
219 float sigma2 = Q * OneOverR2 *
220 (1. + 2. * (Q + 1.) * OneOverR + (Q + 1.) * (6. * Q + 11) * OneOverR2 +
221 (Q + 1.) * (Q + 2.) * (2. * Q + 5.) * OneOverR2 * OneOverR);
Log< level::Info, true > LogVerbatim
const float DCRxRiseTime_
const float adcThreshold_MIP_
std::array< MTDSimData_t, nSamples > MTDSimHitData
const bool smearTimeForOOTtails_
float sigma2_pe(const float &Q, const float &R) const
void push_back(T const &t)
std::unordered_map< MTDCellId, MTDCellInfo > MTDSimHitDataAccumulator
const float ScintillatorDecayTimeInv_
Exp< T >::type exp(const T &t)
const float TimeThreshold2_
static constexpr int dfSIZE
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)
const float SigmaElectronicNoise2_
const float EnergyThreshold_
BTLElectronicsSim(const edm::ParameterSet &pset, edm::ConsumesCollector iC)
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 ScintillatorRiseTime_
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)
uint16_t *__restrict__ uint16_t const *__restrict__ adc
const float ReferencePulseNpe_
const D & id() const
det id