5 #include "CLHEP/Random/RandPoissonQ.h" 6 #include "CLHEP/Random/RandGaussQ.h" 12 debug_( pset.getUntrackedParameter<
bool>(
"debug",
false) ),
13 ScintillatorRiseTime_( pset.getParameter<double>(
"ScintillatorRiseTime") ),
14 ScintillatorDecayTime_( pset.getParameter<double>(
"ScintillatorDecayTime") ),
15 ChannelTimeOffset_( pset.getParameter<double>(
"ChannelTimeOffset") ),
16 smearChannelTimeOffset_( pset.getParameter<double>(
"smearChannelTimeOffset") ),
17 EnergyThreshold_( pset.getParameter<double>(
"EnergyThreshold") ),
18 TimeThreshold1_( pset.getParameter<double>(
"TimeThreshold1") ),
19 TimeThreshold2_( pset.getParameter<double>(
"TimeThreshold2") ),
20 ReferencePulseNpe_( pset.getParameter<double>(
"ReferencePulseNpe") ),
21 SinglePhotonTimeResolution_( pset.getParameter<double>(
"SinglePhotonTimeResolution") ),
22 DarkCountRate_( pset.getParameter<double>(
"DarkCountRate") ),
23 SigmaElectronicNoise_( pset.getParameter<double>(
"SigmaElectronicNoise") ),
24 SigmaClock_( pset.getParameter<double>(
"SigmaClock")),
25 Npe_to_pC_( pset.getParameter<double>(
"Npe_to_pC") ),
26 Npe_to_V_( pset.getParameter<double>(
"Npe_to_V") ),
27 adcNbits_( pset.getParameter<uint32_t>(
"adcNbits") ),
28 tdcNbits_( pset.getParameter<uint32_t>(
"tdcNbits") ),
29 adcSaturation_MIP_( pset.getParameter<double>(
"adcSaturation_MIP") ),
30 adcLSB_MIP_( adcSaturation_MIP_/
std::
pow(2.,adcNbits_) ),
31 adcThreshold_MIP_( pset.getParameter<double>(
"adcThreshold_MIP") ),
32 toaLSB_ns_( pset.getParameter<double>(
"toaLSB_ns") ),
33 ScintillatorDecayTime2_(ScintillatorDecayTime_*ScintillatorDecayTime_),
34 SPTR2_(SinglePhotonTimeResolution_*SinglePhotonTimeResolution_),
35 DCRxRiseTime_(DarkCountRate_*ScintillatorRiseTime_),
36 SigmaElectronicNoise2_(SigmaElectronicNoise_*SigmaElectronicNoise_),
37 SigmaClock2_(SigmaClock_*SigmaClock_) {
43 CLHEP::HepRandomEngine *hre)
const {
47 for(MTDSimHitDataAccumulator::const_iterator it=input.begin();
54 for(
size_t i=0;
i<it->second.hit_info[0].size();
i++) {
57 float Npe = CLHEP::RandPoissonQ::shoot(hre, (it->second).hit_info[0][
i]);
78 if (times[1] == 0.)
continue;
80 float finalToA2 = finalToA1 + times[1];
81 finalToA1 += times[0];
103 finalToA1 += CLHEP::RandGaussQ::shoot(hre, 0.,
sqrt(sigma2_tot_thr1));
104 finalToA2 += CLHEP::RandGaussQ::shoot(hre, 0.,
sqrt(sigma2_tot_thr2));
107 while(finalToA1 < 0.
f) finalToA1 += 25.f;
108 while(finalToA1 > 25.
f) finalToA1 -= 25.f;
111 while(finalToA2 < 0.
f) finalToA2 += 25.f;
112 while(finalToA2 > 25.
f) finalToA2 -= 25.f;
135 for(
int it=0; it<(
int)(chargeColl.size()); it++) debug |= (chargeColl[it]>adcThreshold_fC_);
138 if(debug)
edm::LogVerbatim(
"BTLElectronicsSim") <<
"[runTrivialShaper]" << std::endl;
141 for(
int it=0; it<(
int)(chargeColl.size()); it++) {
143 if ( chargeColl[it] == 0. )
continue;
147 const uint32_t tdc_time1=std::floor( toa1[it] /
toaLSB_ns_ );
148 const uint32_t tdc_time2=std::floor( toa2[it] /
toaLSB_ns_ );
154 << chargeColl[it] <<
"/" 159 std::ostringstream
msg;
160 dataFrame.
print(msg);
168 if(rawDataFrame.
size()<=itIdx+2)
return;
172 bool putInEvent(
false);
173 for(
int it=0;it<
dfSIZE; ++it) {
174 dataFrame.setSample(it, rawDataFrame[itIdx-2+it]);
175 if(it==2) putInEvent = rawDataFrame[itIdx-2+it].threshold();
185 float OneOverR = 1./
R;
186 float OneOverR2 = OneOverR*OneOverR;
189 float sigma2 = Q * OneOverR2 * ( 1. + 2.*(Q+1.)*OneOverR +
190 (Q+1.)*(6.*Q+11)*OneOverR2 +
191 (Q+1.)*(Q+2.)*(2.*Q+5.)*OneOverR2*OneOverR );
int adc(sample_type sample)
get the ADC sample (12 bits)
const float DCRxRiseTime_
const float adcThreshold_MIP_
const float adcSaturation_MIP_
float sigma2_pe(const float &Q, const float &R) const
void print(std::ostream &out=std::cout)
void push_back(T const &t)
const D & id() const
det id
std::array< MTDSimData_t, nSamples > MTDSimHitData
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
void setSample(int i, const S &sample)
BTLElectronicsSim(const edm::ParameterSet &pset)
const float SigmaElectronicNoise2_
void set(bool thr, bool mode, uint16_t toa2, uint16_t toa, uint16_t data)
const float EnergyThreshold_
int size() const
total number of samples in the digi
std::array< float, 3 > timeAtThr(const float scale, const float threshold1, const float threshold2) const
std::unordered_map< uint32_t, MTDCellInfo > MTDSimHitDataAccumulator
const float TimeThreshold1_
const float ChannelTimeOffset_
void runTrivialShaper(BTLDataFrame &dataFrame, const mtd::MTDSimHitData &chargeColl, const mtd::MTDSimHitData &toa1, const mtd::MTDSimHitData &toa2) const
const float smearChannelTimeOffset_
Power< A, B >::type pow(const A &a, const B &b)
const float ReferencePulseNpe_