CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Attributes | Private Member Functions | Private Attributes
BTLElectronicsSim Class Reference

#include <BTLElectronicsSim.h>

Public Member Functions

 BTLElectronicsSim (const edm::ParameterSet &pset)
 
void getEvent (const edm::Event &evt)
 
void getEventSetup (const edm::EventSetup &evt)
 
void run (const mtd::MTDSimHitDataAccumulator &input, BTLDigiCollection &output, CLHEP::HepRandomEngine *hre) const
 
void runTrivialShaper (BTLDataFrame &dataFrame, const mtd::MTDSimHitData &chargeColl, const mtd::MTDSimHitData &toa1, const mtd::MTDSimHitData &toa2) const
 
void updateOutput (BTLDigiCollection &coll, const BTLDataFrame &rawDataFrame) const
 

Static Public Attributes

static int dfSIZE = 5
 

Private Member Functions

float sigma2_pe (const float &Q, const float &R) const
 

Private Attributes

const float adcLSB_MIP_
 
const uint32_t adcNbits_
 
const float adcSaturation_MIP_
 
const float adcThreshold_MIP_
 
const BTLPulseShape btlPulseShape_
 
const float bxTime_
 
const float ChannelTimeOffset_
 
const float CorrCoeff_
 
const float cosPhi_
 
const float DarkCountRate_
 
const float DCRxRiseTime_
 
const bool debug_
 
const float EnergyThreshold_
 
const float Npe_to_pC_
 
const float Npe_to_V_
 
const float ReferencePulseNpe_
 
const float ScintillatorDecayTime2_
 
const float ScintillatorDecayTime_
 
const float ScintillatorRiseTime_
 
const float SigmaClock2_
 
const float SigmaClock_
 
const float SigmaElectronicNoise2_
 
const float SigmaElectronicNoise_
 
const float SinglePhotonTimeResolution_
 
const float sinPhi_
 
const float smearChannelTimeOffset_
 
const float SPTR2_
 
const uint32_t tdcNbits_
 
const float TimeThreshold1_
 
const float TimeThreshold2_
 
const float toaLSB_ns_
 

Detailed Description

Definition at line 21 of file BTLElectronicsSim.h.

Constructor & Destructor Documentation

BTLElectronicsSim::BTLElectronicsSim ( const edm::ParameterSet pset)

Definition at line 11 of file BTLElectronicsSim.cc.

11  :
12  debug_( pset.getUntrackedParameter<bool>("debug",false) ),
13  bxTime_(pset.getParameter<double>("bxTime") ),
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") ),
32  adcThreshold_MIP_( pset.getParameter<double>("adcThreshold_MIP") ),
33  toaLSB_ns_( pset.getParameter<double>("toaLSB_ns") ),
34  CorrCoeff_( pset.getParameter<double>("CorrelationCoefficient") ),
35  cosPhi_( 0.5*(sqrt(1.+CorrCoeff_)+sqrt(1.-CorrCoeff_)) ),
36  sinPhi_( 0.5*CorrCoeff_/cosPhi_ ),
42 }
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
const float Npe_to_pC_
const float DCRxRiseTime_
const float adcThreshold_MIP_
const float adcSaturation_MIP_
const float SigmaClock_
const float DarkCountRate_
const float TimeThreshold2_
const float adcLSB_MIP_
const float ScintillatorDecayTime2_
const float toaLSB_ns_
T sqrt(T t)
Definition: SSEVec.h:18
const float CorrCoeff_
const uint32_t tdcNbits_
const float SigmaElectronicNoise2_
const float SigmaElectronicNoise_
const float EnergyThreshold_
const float SinglePhotonTimeResolution_
const float ScintillatorDecayTime_
const float TimeThreshold1_
const float ChannelTimeOffset_
const float ScintillatorRiseTime_
const float smearChannelTimeOffset_
const float SigmaClock2_
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
const uint32_t adcNbits_
const float ReferencePulseNpe_

Member Function Documentation

void BTLElectronicsSim::getEvent ( const edm::Event evt)
inline

Definition at line 25 of file BTLElectronicsSim.h.

25 { }
void BTLElectronicsSim::getEventSetup ( const edm::EventSetup evt)
inline

Definition at line 27 of file BTLElectronicsSim.h.

References coll, input, convertSQLitetoXML_cfg::output, and findQualityFiles::run.

27 { }
void BTLElectronicsSim::run ( const mtd::MTDSimHitDataAccumulator input,
BTLDigiCollection output,
CLHEP::HepRandomEngine *  hre 
) const

Definition at line 45 of file BTLElectronicsSim.cc.

References btlPulseShape_, bxTime_, ChannelTimeOffset_, cosPhi_, DCRxRiseTime_, EnergyThreshold_, f, mps_fire::i, Npe_to_pC_, Npe_to_V_, ReferencePulseNpe_, runTrivialShaper(), ScintillatorDecayTime2_, ScintillatorDecayTime_, sigma2_pe(), SigmaClock2_, SigmaElectronicNoise2_, sinPhi_, smearChannelTimeOffset_, SPTR2_, mathSSE::sqrt(), MTDShapeBase::timeAtThr(), create_public_lumi_plots::times, hcalSimParameters_cfi::timeSmearing, TimeThreshold1_, TimeThreshold2_, and updateOutput().

47  {
48 
49  MTDSimHitData chargeColl, toa1, toa2;
50 
51  for(MTDSimHitDataAccumulator::const_iterator it=input.begin();
52  it!=input.end();
53  it++) {
54 
55  chargeColl.fill(0.f);
56  toa1.fill(0.f);
57  toa2.fill(0.f);
58  for(size_t i=0; i<it->second.hit_info[0].size(); i++) {
59 
60  // --- Fluctuate the total number of photo-electrons
61  float Npe = CLHEP::RandPoissonQ::shoot(hre, (it->second).hit_info[0][i]);
62  if ( Npe < EnergyThreshold_ ) continue;
63 
64 
65  // --- Get the time of arrival and add a channel time offset
66  float finalToA1 = (it->second).hit_info[1][i] + ChannelTimeOffset_;
67 
68  if ( smearChannelTimeOffset_ > 0. ){
69  float timeSmearing = CLHEP::RandGaussQ::shoot(hre, 0., smearChannelTimeOffset_);
70  finalToA1 += timeSmearing;
71  }
72 
73 
74  // --- Calculate and add the time walk: the time of arrival is read in correspondence
75  // with two thresholds on the signal pulse
76  std::array<float, 3> times = btlPulseShape_.timeAtThr(Npe/ReferencePulseNpe_,
78  TimeThreshold2_*Npe_to_V_);
79 
80 
81  // --- If the pulse amplitude is smaller than TimeThreshold2, the trigger does not fire
82  if (times[1] == 0.) continue;
83 
84  float finalToA2 = finalToA1 + times[1];
85  finalToA1 += times[0];
86 
87 
88  // --- Uncertainty due to the fluctuations of the n-th photon arrival time:
89  // the fluctuations due to the first TimeThreshold1_ p.e. are common to both times
90  float smearing_stat_thr1 = CLHEP::RandGaussQ::shoot(hre, 0.,
92  float smearing_stat_thr2 = CLHEP::RandGaussQ::shoot(hre, 0.,
94  finalToA1 += smearing_stat_thr1;
95  finalToA2 += smearing_stat_thr1 + smearing_stat_thr2;
96 
97 
98  // --- Add in quadrature the uncertainties due to the SiPM timing resolution, the SiPM DCR,
99  // the electronic noise and the clock distribution:
100  float slew2 = ScintillatorDecayTime2_/Npe/Npe;
101 
102  float sigma2_tot_thr1 = SPTR2_/TimeThreshold1_ + (DCRxRiseTime_ + SigmaElectronicNoise2_)*slew2 + SigmaClock2_;
103  float sigma2_tot_thr2 = SPTR2_/TimeThreshold2_ + (DCRxRiseTime_ + SigmaElectronicNoise2_)*slew2 + SigmaClock2_;
104 
105 
106  // --- Smear the arrival times using the correlated uncertainties:
107  float smearing_thr1_uncorr = CLHEP::RandGaussQ::shoot(hre, 0., sqrt(sigma2_tot_thr1));
108  float smearing_thr2_uncorr = CLHEP::RandGaussQ::shoot(hre, 0., sqrt(sigma2_tot_thr2));
109 
110  finalToA1 += cosPhi_*smearing_thr1_uncorr + sinPhi_*smearing_thr2_uncorr;
111  finalToA2 += sinPhi_*smearing_thr1_uncorr + cosPhi_*smearing_thr2_uncorr;
112 
113 
114  // --- Fill the time and charge arrays
115  const unsigned int ibucket = std::floor( finalToA1/bxTime_ );
116  if ( (i+ibucket) >= chargeColl.size() ) continue;
117 
118  chargeColl[i+ibucket] = Npe*Npe_to_pC_; // the p.e. number is here converted to pC
119 
120  if ( toa1[i+ibucket] == 0. || (finalToA1-ibucket*bxTime_) < toa1[i+ibucket] ){
121  toa1[i+ibucket] = finalToA1 - ibucket*bxTime_;
122  toa2[i+ibucket] = finalToA2 - ibucket*bxTime_;
123  }
124 
125  }
126 
127  //run the shaper to create a new data frame
128  BTLDataFrame rawDataFrame( it->first );
129  runTrivialShaper(rawDataFrame,chargeColl,toa1,toa2);
130  updateOutput(output,rawDataFrame);
131 
132  }
133 
134 }
const float Npe_to_pC_
const float DCRxRiseTime_
float sigma2_pe(const float &Q, const float &R) const
std::array< MTDSimData_t, nSamples > MTDSimHitData
const float TimeThreshold2_
static std::string const input
Definition: EdmProvDump.cc:45
void updateOutput(BTLDigiCollection &coll, const BTLDataFrame &rawDataFrame) const
const float ScintillatorDecayTime2_
const BTLPulseShape btlPulseShape_
T sqrt(T t)
Definition: SSEVec.h:18
double f[11][100]
const float SigmaElectronicNoise2_
const float EnergyThreshold_
std::array< float, 3 > timeAtThr(const float scale, const float threshold1, const float threshold2) const
Definition: MTDShapeBase.cc:15
const float ScintillatorDecayTime_
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_
const float SigmaClock2_
const float ReferencePulseNpe_
void BTLElectronicsSim::runTrivialShaper ( BTLDataFrame dataFrame,
const mtd::MTDSimHitData chargeColl,
const mtd::MTDSimHitData toa1,
const mtd::MTDSimHitData toa2 
) const

Definition at line 137 of file BTLElectronicsSim.cc.

References ecalMGPA::adc(), adcLSB_MIP_, adcSaturation_MIP_, adcThreshold_MIP_, debug, debug_, createfilelist::int, min(), mps_check::msg, FTLDataFrameT< D, S >::print(), BTLSample::set(), FTLDataFrameT< D, S >::setSample(), and toaLSB_ns_.

Referenced by run().

140  {
141  bool debug = debug_;
142 #ifdef EDM_ML_DEBUG
143  for(int it=0; it<(int)(chargeColl.size()); it++) debug |= (chargeColl[it]>adcThreshold_fC_);
144 #endif
145 
146  if(debug) edm::LogVerbatim("BTLElectronicsSim") << "[runTrivialShaper]" << std::endl;
147 
148  //set new ADCs
149  for(int it=0; it<(int)(chargeColl.size()); it++) {
150 
151  if ( chargeColl[it] == 0. ) continue;
152 
153  //brute force saturation, maybe could to better with an exponential like saturation
154  const uint32_t adc=std::floor( std::min(chargeColl[it],adcSaturation_MIP_) / adcLSB_MIP_ );
155  const uint32_t tdc_time1=std::floor( toa1[it] / toaLSB_ns_ );
156  const uint32_t tdc_time2=std::floor( toa2[it] / toaLSB_ns_ );
157  BTLSample newSample;
158  newSample.set(chargeColl[it] > adcThreshold_MIP_,false,tdc_time2,tdc_time1,adc);
159  dataFrame.setSample(it,newSample);
160 
161  if(debug) edm::LogVerbatim("BTLElectronicsSim") << adc << " ("
162  << chargeColl[it] << "/"
163  << adcLSB_MIP_ << ") ";
164  }
165 
166  if(debug) {
167  std::ostringstream msg;
168  dataFrame.print(msg);
169  edm::LogVerbatim("BTLElectronicsSim") << msg.str() << std::endl;
170  }
171 }
int adc(sample_type sample)
get the ADC sample (12 bits)
const float adcThreshold_MIP_
const float adcSaturation_MIP_
void print(std::ostream &out=std::cout)
Definition: FTLDataFrameT.h:50
wrapper for a data word
Definition: BTLSample.h:13
const float adcLSB_MIP_
const float toaLSB_ns_
void setSample(int i, const S &sample)
Definition: FTLDataFrameT.h:49
T min(T a, T b)
Definition: MathUtil.h:58
void set(bool thr, bool mode, uint16_t toa2, uint16_t toa, uint16_t data)
Definition: BTLSample.h:38
#define debug
Definition: HDRShower.cc:19
tuple msg
Definition: mps_check.py:278
float BTLElectronicsSim::sigma2_pe ( const float &  Q,
const float &  R 
) const
private

Definition at line 191 of file BTLElectronicsSim.cc.

References dttmaxenums::R.

Referenced by run().

191  {
192 
193  float OneOverR = 1./R;
194  float OneOverR2 = OneOverR*OneOverR;
195 
196  // --- This is Eq. (17) from Nucl. Instr. Meth. A 564 (2006) 185
197  float sigma2 = Q * OneOverR2 * ( 1. + 2.*(Q+1.)*OneOverR +
198  (Q+1.)*(6.*Q+11)*OneOverR2 +
199  (Q+1.)*(Q+2.)*(2.*Q+5.)*OneOverR2*OneOverR );
200 
201  return sigma2;
202 
203 }
void BTLElectronicsSim::updateOutput ( BTLDigiCollection coll,
const BTLDataFrame rawDataFrame 
) const

Definition at line 173 of file BTLElectronicsSim.cc.

References dfSIZE, FTLDataFrameT< D, S >::id(), edm::SortedCollection< T, SORT >::push_back(), FTLDataFrameT< D, S >::resize(), and FTLDataFrameT< D, S >::size().

Referenced by run().

174  {
175  int itIdx(9);
176  if(rawDataFrame.size()<=itIdx+2) return;
177 
178  BTLDataFrame dataFrame( rawDataFrame.id() );
179  dataFrame.resize(dfSIZE);
180  bool putInEvent(false);
181  for(int it=0;it<dfSIZE; ++it) {
182  dataFrame.setSample(it, rawDataFrame[itIdx-2+it]);
183  if(it==2) putInEvent = rawDataFrame[itIdx-2+it].threshold();
184  }
185 
186  if(putInEvent) {
187  coll.push_back(dataFrame);
188  }
189 }
void push_back(T const &t)
const D & id() const
det id
Definition: FTLDataFrameT.h:32
void resize(size_t s)
allow to set size
Definition: FTLDataFrameT.h:42
int size() const
total number of samples in the digi
Definition: FTLDataFrameT.h:37

Member Data Documentation

const float BTLElectronicsSim::adcLSB_MIP_
private

Definition at line 75 of file BTLElectronicsSim.h.

Referenced by runTrivialShaper().

const uint32_t BTLElectronicsSim::adcNbits_
private

Definition at line 71 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::adcSaturation_MIP_
private

Definition at line 74 of file BTLElectronicsSim.h.

Referenced by runTrivialShaper().

const float BTLElectronicsSim::adcThreshold_MIP_
private

Definition at line 76 of file BTLElectronicsSim.h.

Referenced by runTrivialShaper().

const BTLPulseShape BTLElectronicsSim::btlPulseShape_
private

Definition at line 89 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::bxTime_
private

Definition at line 51 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::ChannelTimeOffset_
private

Definition at line 54 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::CorrCoeff_
private

Definition at line 79 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::cosPhi_
private

Definition at line 80 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::DarkCountRate_
private

Definition at line 63 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::DCRxRiseTime_
private

Definition at line 85 of file BTLElectronicsSim.h.

Referenced by run().

const bool BTLElectronicsSim::debug_
private

Definition at line 49 of file BTLElectronicsSim.h.

Referenced by runTrivialShaper().

int BTLElectronicsSim::dfSIZE = 5
static

Definition at line 42 of file BTLElectronicsSim.h.

Referenced by updateOutput().

const float BTLElectronicsSim::EnergyThreshold_
private

Definition at line 57 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::Npe_to_pC_
private

Definition at line 67 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::Npe_to_V_
private

Definition at line 68 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::ReferencePulseNpe_
private

Definition at line 60 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::ScintillatorDecayTime2_
private

Definition at line 83 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::ScintillatorDecayTime_
private

Definition at line 53 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::ScintillatorRiseTime_
private

Definition at line 52 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::SigmaClock2_
private

Definition at line 87 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::SigmaClock_
private

Definition at line 65 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::SigmaElectronicNoise2_
private

Definition at line 86 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::SigmaElectronicNoise_
private

Definition at line 64 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::SinglePhotonTimeResolution_
private

Definition at line 62 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::sinPhi_
private

Definition at line 81 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::smearChannelTimeOffset_
private

Definition at line 55 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::SPTR2_
private

Definition at line 84 of file BTLElectronicsSim.h.

Referenced by run().

const uint32_t BTLElectronicsSim::tdcNbits_
private

Definition at line 71 of file BTLElectronicsSim.h.

const float BTLElectronicsSim::TimeThreshold1_
private

Definition at line 58 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::TimeThreshold2_
private

Definition at line 59 of file BTLElectronicsSim.h.

Referenced by run().

const float BTLElectronicsSim::toaLSB_ns_
private

Definition at line 77 of file BTLElectronicsSim.h.

Referenced by runTrivialShaper().