CMS 3D CMS Logo

List of all members | Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes
HcalSiPM Class Reference

A general implementation for the response of a SiPM. More...

#include <HcalSiPM.h>

Public Member Functions

double getCrossTalk () const
 
int getNCells () const
 
double getTau () const
 
double getTempDep () const
 
 HcalSiPM (int nCells=1, double tau=15.)
 
virtual double hitCells (CLHEP::HepRandomEngine *, unsigned int pes, double tempDiff=0., double photonTime=0.)
 
void resetSiPM ()
 
void setCrossTalk (double xtalk)
 
void setNCells (int nCells)
 
void setSaturationPars (const std::vector< float > &pars)
 
void setTau (double tau)
 
void setTemperatureDependence (double tempDep)
 
virtual double totalCharge () const
 
virtual double totalCharge (double time) const
 
virtual ~HcalSiPM ()
 

Protected Types

typedef std::unordered_map< unsigned int, cdfpaircdfmap
 
typedef std::pair< unsigned int, std::vector< double > > cdfpair
 

Protected Member Functions

unsigned int addCrossTalkCells (CLHEP::HepRandomEngine *engine, unsigned int in_pes)
 
double Borel (unsigned int n, double lambda, unsigned int k)
 
const cdfpairBorelCDF (unsigned int k)
 
double cellCharge (double deltaTime) const
 

Protected Attributes

cdfmap borelcdfs
 
HcalSiPMnonlinearitynonlin
 
unsigned int theCellCount
 
double theCrossTalk
 
double theLastHitTime
 
std::vector< double > theSiPM
 
double theTau
 
double theTauInv
 
double theTempDep
 

Detailed Description

A general implementation for the response of a SiPM.

Definition at line 22 of file HcalSiPM.h.

Member Typedef Documentation

typedef std::unordered_map< unsigned int, cdfpair > HcalSiPM::cdfmap
protected

Definition at line 50 of file HcalSiPM.h.

typedef std::pair<unsigned int, std::vector<double> > HcalSiPM::cdfpair
protected

Definition at line 49 of file HcalSiPM.h.

Constructor & Destructor Documentation

HcalSiPM::HcalSiPM ( int  nCells = 1,
double  tau = 15. 
)

Definition at line 14 of file HcalSiPM.cc.

References resetSiPM(), setTau(), and theCellCount.

14  :
15  theCellCount(nCells), theSiPM(nCells,1.),
16  theCrossTalk(0.), theTempDep(0.), theLastHitTime(-1.), nonlin(nullptr)
17 {
18  setTau(tau);
19  assert(theCellCount>0);
20  resetSiPM();
21 }
double theTempDep
Definition: HcalSiPM.h:66
void resetSiPM()
Definition: HcalSiPM.h:28
double theCrossTalk
Definition: HcalSiPM.h:65
std::vector< double > theSiPM
Definition: HcalSiPM.h:62
void setTau(double tau)
Definition: HcalSiPM.cc:152
double theLastHitTime
Definition: HcalSiPM.h:67
HcalSiPMnonlinearity * nonlin
Definition: HcalSiPM.h:69
unsigned int theCellCount
Definition: HcalSiPM.h:61
HcalSiPM::~HcalSiPM ( )
virtual

Definition at line 23 of file HcalSiPM.cc.

References nonlin.

23  {
24  if (nonlin) delete nonlin;
25 }
HcalSiPMnonlinearity * nonlin
Definition: HcalSiPM.h:69

Member Function Documentation

unsigned int HcalSiPM::addCrossTalkCells ( CLHEP::HepRandomEngine *  engine,
unsigned int  in_pes 
)
protected

Definition at line 82 of file HcalSiPM.cc.

References BorelCDF(), LogDebug, mitigatedMETSequence_cff::U, and up.

Referenced by hitCells().

83  {
84  const cdfpair& cdf = BorelCDF(in_pes);
85 
86  double U = CLHEP::RandFlat::shoot(engine);
87  std::vector<double>::const_iterator up;
88  up= std::lower_bound (cdf.second.cbegin(), cdf.second.cend(), U);
89 
90  LogDebug("HcalSiPM") << "cdf size = " << cdf.second.size()
91  << ", U = " << U
92  << ", in_pes = " << in_pes
93  << ", 2ndary_pes = " << (up-cdf.second.cbegin()+cdf.first);
94 
95  // returns the number of secondary pes produced
96  return (up - cdf.second.cbegin() + cdf.first);
97 }
#define LogDebug(id)
Definition: BitonicSort.h:8
const cdfpair & BorelCDF(unsigned int k)
Definition: HcalSiPM.cc:47
std::pair< unsigned int, std::vector< double > > cdfpair
Definition: HcalSiPM.h:49
double HcalSiPM::Borel ( unsigned int  n,
double  lambda,
unsigned int  k 
)
protected

Definition at line 29 of file HcalSiPM.cc.

References b, JetChargeProducer_cfi::exp, cmsBatch::log, and funct::pow().

Referenced by BorelCDF().

29  {
30  if(n<k) return 0;
31  double dn = double(n);
32  double dk = double(k);
33  double dnk = dn-dk;
34  double ldn = lambda * dn;
35  double logb = -ldn + dnk*log(ldn) - TMath::LnGamma(dnk+1);
36  double b=0;
37  if (logb >= -20) { // protect against underflow
38  b=(dk/dn);
39  if ((n-k)<100)
40  b *= (exp(-ldn)*pow(ldn,dnk))/TMath::Factorial(n-k);
41  else
42  b *= exp( logb );
43  }
44  return b;
45 }
int k[5][pyjets_maxn]
double b
Definition: hdecay.h:120
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
const HcalSiPM::cdfpair & HcalSiPM::BorelCDF ( unsigned int  k)
protected

Definition at line 47 of file HcalSiPM.cc.

References b, Borel(), borelcdfs, MillePedeFileConverter_cfg::e, kinem::EPSILON, plotBeamSpotDB::first, mps_fire::i, and theCrossTalk.

Referenced by addCrossTalkCells(), and setCrossTalk().

47  {
48  // EPSILON determines the min and max # of xtalk cells that can be
49  // simulated.
50  static const double EPSILON = 1e-6;
51  typename cdfmap::const_iterator it;
52  it = borelcdfs.find(k);
53  if (it == borelcdfs.end()) {
54  vector<double> cdf;
55 
56  // Find the first n=k+i value for which cdf[i] > EPSILON
57  unsigned int i;
58  double b=0., sumb=0.;
59  for (i=0; ; i++) {
60  b = Borel(k+i,theCrossTalk,k);
61  sumb += b;
62  if (sumb >= EPSILON) break;
63  }
64 
65  cdf.push_back(sumb);
66  unsigned int borelstartn = i;
67 
68  // calculate cdf[i]
69  for(++i; ; ++i){
70  b = Borel(k+i,theCrossTalk,k);
71  sumb += b;
72  cdf.push_back(sumb);
73  if (1-sumb < EPSILON) break;
74  }
75 
76  it = (borelcdfs.emplace(k,make_pair(borelstartn, cdf))).first;
77  }
78 
79  return it->second;
80 }
double theCrossTalk
Definition: HcalSiPM.h:65
double Borel(unsigned int n, double lambda, unsigned int k)
Definition: HcalSiPM.cc:29
int k[5][pyjets_maxn]
cdfmap borelcdfs
Definition: HcalSiPM.h:71
const float EPSILON
Definition: AnglesUtil.h:23
double b
Definition: hdecay.h:120
double HcalSiPM::cellCharge ( double  deltaTime) const
protected

Definition at line 183 of file HcalSiPM.cc.

References JetChargeProducer_cfi::exp, mps_fire::result, and theTauInv.

Referenced by hitCells(), and totalCharge().

183  {
184  if (deltaTime <= 0.) return 0.;
185  if (deltaTime*theTauInv > 10.) return 1.;
186  double result(1. - std::exp(-deltaTime*theTauInv));
187  return (result > 0.99) ? 1.0 : result;
188 }
double theTauInv
Definition: HcalSiPM.h:64
double HcalSiPM::getCrossTalk ( ) const
inline

Definition at line 38 of file HcalSiPM.h.

38 { return theCrossTalk; }
double theCrossTalk
Definition: HcalSiPM.h:65
int HcalSiPM::getNCells ( ) const
inline

Definition at line 36 of file HcalSiPM.h.

36 { return theCellCount; }
unsigned int theCellCount
Definition: HcalSiPM.h:61
double HcalSiPM::getTau ( ) const
inline

Definition at line 37 of file HcalSiPM.h.

37 { return theTau; }
double theTau
Definition: HcalSiPM.h:63
double HcalSiPM::getTempDep ( ) const
inline

Definition at line 39 of file HcalSiPM.h.

References metsig::tau.

39 { return theTempDep; }
double theTempDep
Definition: HcalSiPM.h:66
double HcalSiPM::hitCells ( CLHEP::HepRandomEngine *  engine,
unsigned int  pes,
double  tempDiff = 0.,
double  photonTime = 0. 
)
virtual

Definition at line 101 of file HcalSiPM.cc.

References addCrossTalkCells(), cellCharge(), digi_MixPreMix_cfi::pixel, theCellCount, theCrossTalk, theLastHitTime, theSiPM, theTau, and theTempDep.

Referenced by HcalSiPMHitResponse::makeSiPMSignal().

102  {
103  // response to light impulse with pes input photons. The return is the number
104  // of micro-pixels hit. If a fraction other than 0. is supplied then the
105  // micro-pixel doesn't fully discharge. The tempDiff is the temperature
106  // difference from nominal and is used to modify the relative strength of a
107  // hit pixel. Pixels which are fractionally charged return a fractional
108  // number of hit pixels.
109 
110  if ((theCrossTalk > 0.) && (theCrossTalk < 1.))
111  pes += addCrossTalkCells(engine, pes);
112 
113  // Account for saturation - disabled in lieu of recovery model below
114  //pes = nonlin->getPixelsFired(pes);
115 
116  //disable saturation/recovery model for bad tau values
117  if(theTau<=0) return pes;
118 
119  unsigned int pixel;
120  double sum(0.), hit(0.);
121  for (unsigned int pe(0); pe < pes; ++pe) {
122  pixel = CLHEP::RandFlat::shootInt(engine, theCellCount);
123  hit = (theSiPM[pixel] < 0.) ? 1.0 :
124  (cellCharge(photonTime - theSiPM[pixel]));
125  sum += hit*(1 + (tempDiff*theTempDep));
126  theSiPM[pixel] = photonTime;
127  }
128 
129  theLastHitTime = photonTime;
130 
131  return sum;
132 }
double theTempDep
Definition: HcalSiPM.h:66
double cellCharge(double deltaTime) const
Definition: HcalSiPM.cc:183
double theCrossTalk
Definition: HcalSiPM.h:65
std::vector< double > theSiPM
Definition: HcalSiPM.h:62
double theLastHitTime
Definition: HcalSiPM.h:67
unsigned int addCrossTalkCells(CLHEP::HepRandomEngine *engine, unsigned int in_pes)
Definition: HcalSiPM.cc:82
double theTau
Definition: HcalSiPM.h:63
unsigned int theCellCount
Definition: HcalSiPM.h:61
void HcalSiPM::resetSiPM ( )
inline

Definition at line 28 of file HcalSiPM.h.

References lumiContext::fill.

Referenced by HcalSiPM(), and setNCells().

28 { std::fill(theSiPM.begin(), theSiPM.end(), -999.); }
std::vector< double > theSiPM
Definition: HcalSiPM.h:62
void HcalSiPM::setCrossTalk ( double  xtalk)

Definition at line 158 of file HcalSiPM.cc.

References BorelCDF(), borelcdfs, gen::k, theCrossTalk, and hgcalDigitizer_cfi::xTalk.

Referenced by HcalSiPMHitResponse::makeSiPMSignal().

158  {
159  // set the cross-talk probability
160 
161  double oldCrossTalk = theCrossTalk;
162 
163  if((xTalk < 0) || (xTalk >= 1)) {
164  theCrossTalk = 0.;
165  } else {
167  }
168 
169  // Recalculate the crosstalk CDFs
170  if (theCrossTalk != oldCrossTalk) {
171  borelcdfs.clear();
172  if (theCrossTalk > 0)
173  for (int k=1; k<=100; k++)
174  BorelCDF(k);
175  }
176 }
double theCrossTalk
Definition: HcalSiPM.h:65
const cdfpair & BorelCDF(unsigned int k)
Definition: HcalSiPM.cc:47
int k[5][pyjets_maxn]
cdfmap borelcdfs
Definition: HcalSiPM.h:71
void HcalSiPM::setNCells ( int  nCells)

Definition at line 145 of file HcalSiPM.cc.

References resetSiPM(), theCellCount, and theSiPM.

Referenced by HcalSiPMHitResponse::makeSiPMSignal().

145  {
146  assert(nCells>0);
147  theCellCount = nCells;
148  theSiPM.resize(nCells);
149  resetSiPM();
150 }
void resetSiPM()
Definition: HcalSiPM.h:28
std::vector< double > theSiPM
Definition: HcalSiPM.h:62
unsigned int theCellCount
Definition: HcalSiPM.h:61
void HcalSiPM::setSaturationPars ( const std::vector< float > &  pars)

Definition at line 190 of file HcalSiPM.cc.

References nonlin.

Referenced by HcalSiPMHitResponse::makeSiPMSignal().

191 {
192  if (nonlin)
193  delete nonlin;
194 
195  nonlin = new HcalSiPMnonlinearity(pars);
196 }
HcalSiPMnonlinearity * nonlin
Definition: HcalSiPM.h:69
void HcalSiPM::setTau ( double  tau)

Definition at line 152 of file HcalSiPM.cc.

References metsig::tau, theTau, and theTauInv.

Referenced by HcalSiPM(), and HcalSiPMHitResponse::makeSiPMSignal().

152  {
153  theTau = tau;
154  if(theTau > 0) theTauInv = 1./theTau;
155  else theTauInv = 0;
156 }
double theTauInv
Definition: HcalSiPM.h:64
double theTau
Definition: HcalSiPM.h:63
void HcalSiPM::setTemperatureDependence ( double  tempDep)

Definition at line 178 of file HcalSiPM.cc.

References theTempDep.

178  {
179  // set the temperature dependence
180  theTempDep = dTemp;
181 }
double theTempDep
Definition: HcalSiPM.h:66
virtual double HcalSiPM::totalCharge ( ) const
inlinevirtual

Definition at line 33 of file HcalSiPM.h.

References ntuplemaker::time, and totalCharge().

Referenced by totalCharge().

33 { return totalCharge(theLastHitTime); }
virtual double totalCharge() const
Definition: HcalSiPM.h:33
double theLastHitTime
Definition: HcalSiPM.h:67
double HcalSiPM::totalCharge ( double  time) const
virtual

Definition at line 134 of file HcalSiPM.cc.

References cellCharge(), mps_fire::i, theCellCount, and theSiPM.

134  {
135  // sum of the micro-pixels. NP is a fully charged device.
136  // 0 is a fullly depleted device.
137  double tot(0.), hit(0.);
138  for(unsigned int i=0; i<theCellCount; ++i) {
139  hit = (theSiPM[i] < 0.) ? 1. : cellCharge(time - theSiPM[i]);
140  tot += hit;
141  }
142  return tot;
143 }
double cellCharge(double deltaTime) const
Definition: HcalSiPM.cc:183
std::vector< double > theSiPM
Definition: HcalSiPM.h:62
unsigned int theCellCount
Definition: HcalSiPM.h:61

Member Data Documentation

cdfmap HcalSiPM::borelcdfs
protected

Definition at line 71 of file HcalSiPM.h.

Referenced by BorelCDF(), and setCrossTalk().

HcalSiPMnonlinearity* HcalSiPM::nonlin
protected

Definition at line 69 of file HcalSiPM.h.

Referenced by setSaturationPars(), and ~HcalSiPM().

unsigned int HcalSiPM::theCellCount
protected

Definition at line 61 of file HcalSiPM.h.

Referenced by HcalSiPM(), hitCells(), setNCells(), and totalCharge().

double HcalSiPM::theCrossTalk
protected

Definition at line 65 of file HcalSiPM.h.

Referenced by BorelCDF(), hitCells(), and setCrossTalk().

double HcalSiPM::theLastHitTime
protected

Definition at line 67 of file HcalSiPM.h.

Referenced by hitCells().

std::vector< double > HcalSiPM::theSiPM
protected

Definition at line 62 of file HcalSiPM.h.

Referenced by hitCells(), setNCells(), and totalCharge().

double HcalSiPM::theTau
protected

Definition at line 63 of file HcalSiPM.h.

Referenced by hitCells(), and setTau().

double HcalSiPM::theTauInv
protected

Definition at line 64 of file HcalSiPM.h.

Referenced by cellCharge(), and setTau().

double HcalSiPM::theTempDep
protected

Definition at line 66 of file HcalSiPM.h.

Referenced by hitCells(), and setTemperatureDependence().