CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HcalSimParameters.cc
Go to the documentation of this file.
9 #include "CLHEP/Random/RandGaussQ.h"
10 using namespace std;
11 
12 HcalSimParameters::HcalSimParameters(double simHitToPhotoelectrons,
13  double samplingFactor,
14  double timePhase,
15  int readoutFrameSize,
16  int binOfMaximum,
17  bool doPhotostatistics,
18  bool syncPhase,
19  int firstRing,
20  const std::vector<double>& samplingFactors,
21  double sipmTau)
22  : CaloSimParameters(simHitToPhotoelectrons,
23  0.0,
24  samplingFactor,
25  timePhase,
26  readoutFrameSize,
27  binOfMaximum,
28  doPhotostatistics,
29  syncPhase),
30  theDbService(nullptr),
31  theSiPMcharacteristics(nullptr),
32  theFirstRing(firstRing),
33  theSamplingFactors(samplingFactors),
34  theSiPMSmearing(false),
35  doTimeSmear_(true),
36  theSiPMTau(sipmTau) {
38 
39  edm::LogInfo("HcalSimParameters:") << " doSiPMsmearing = " << theSiPMSmearing;
40 }
41 
43  : CaloSimParameters(p, true),
44  theDbService(nullptr),
45  theFirstRing(p.getParameter<int>("firstRing")),
46  theSamplingFactors(p.getParameter<std::vector<double> >("samplingFactors")),
47  theSiPMSmearing(p.getParameter<bool>("doSiPMSmearing")),
48  doTimeSmear_(p.getParameter<bool>("timeSmearing")),
49  theSiPMTau(p.getParameter<double>("sipmTau")),
50  threshold_currentTDC_(p.getParameter<double>("threshold_currentTDC")),
51  delayQIE_(p.getParameter<int>("delayQIE")) {
53 
54  edm::LogInfo("HcalSimParameters:") << " doSiPMsmearing = " << theSiPMSmearing;
55 }
56 
58  assert(service);
59  theDbService = service;
62 }
63 
65  // the gain is in units of GeV/fC. We want a constant with pe/dGeV
66  // pe/dGeV = (GeV/dGeV) / (GeV/fC) / (fC/pe)
68  if (HcalGenericDetId(detId).genericSubdet() != HcalGenericDetId::HcalGenForward ||
69  HcalGenericDetId(detId).genericSubdet() != HcalGenericDetId::HcalGenZDC) {
70  result = samplingFactor(detId) / fCtoGeV(detId) / photoelectronsToAnalog(detId);
71  }
72  return result;
73 }
74 
75 double HcalSimParameters::fCtoGeV(const DetId& detId) const {
76  assert(theDbService != nullptr);
77  HcalGenericDetId hcalGenDetId(detId);
78  const HcalGain* gains = theDbService->getGain(hcalGenDetId);
79  const HcalGainWidth* gwidths = theDbService->getGainWidth(hcalGenDetId);
80  double result = 0.0;
81  if (!gains || !gwidths) {
82  edm::LogError("HcalAmplifier") << "Could not fetch HCAL conditions for channel " << hcalGenDetId;
83  } else {
84  // only one gain will be recorded per channel, so just use capID 0 for now
85  result = gains->getValue(0);
86  // if(doNoise_)
88  // result += CLHEP::RandGaussQ::shoot(0., gwidths->getValue(0));
89  // }
90  }
91  return result;
92 }
93 
94 double HcalSimParameters::samplingFactor(const DetId& detId) const {
95  HcalDetId hcalDetId(detId);
96  return theSamplingFactors.at(hcalDetId.ietaAbs() - theFirstRing);
97 }
98 
100  //now always taken from database for HPDs or SiPMs (HB, HE, HO)
102  return theDbService->getHcalSiPMParameter(detId)->getFCByPE();
103 }
104 
105 //static const double GeV2fC = 1.0/0.145;
106 static const double GeV2fC = 1.0 / 0.4;
107 
109  // GeV->ampl (fC), time (ns)
110  theSmearSettings.emplace_back(4.00 * GeV2fC, 4.050);
111  theSmearSettings.emplace_back(20.00 * GeV2fC, 3.300);
112  theSmearSettings.emplace_back(25.00 * GeV2fC, 2.925);
113  theSmearSettings.emplace_back(30.00 * GeV2fC, 2.714);
114  theSmearSettings.emplace_back(37.00 * GeV2fC, 2.496);
115  theSmearSettings.emplace_back(44.50 * GeV2fC, 2.278);
116  theSmearSettings.emplace_back(56.00 * GeV2fC, 2.138);
117  theSmearSettings.emplace_back(63.50 * GeV2fC, 2.022);
118  theSmearSettings.emplace_back(81.00 * GeV2fC, 1.788);
119  theSmearSettings.emplace_back(88.50 * GeV2fC, 1.695);
120  theSmearSettings.emplace_back(114.50 * GeV2fC, 1.716);
121  theSmearSettings.emplace_back(175.50 * GeV2fC, 1.070);
122  theSmearSettings.emplace_back(350.00 * GeV2fC, 1.564);
123  theSmearSettings.emplace_back(99999.00 * GeV2fC, 1.564);
124 }
125 
126 double HcalSimParameters::timeSmearRMS(double ampl) const {
128  double smearsigma = 0;
129 
130  for (i = 0; i < theSmearSettings.size(); i++)
131  if (theSmearSettings[i].first > ampl)
132  break;
133 
134  // Smearing occurs only within the envelope definitions.
135  if (i != 0 && (i < theSmearSettings.size())) {
136  double energy1 = theSmearSettings[i - 1].first;
137  double sigma1 = theSmearSettings[i - 1].second;
138  double energy2 = theSmearSettings[i].first;
139  double sigma2 = theSmearSettings[i].second;
140 
141  if (energy2 != energy1)
142  smearsigma = sigma1 + ((sigma2 - sigma1) * (ampl - energy1) / (energy2 - energy1));
143  else
144  smearsigma = (sigma2 + sigma1) / 2.;
145  }
146 
147  return smearsigma;
148 }
149 
150 int HcalSimParameters::pixels(const DetId& detId) const {
153  return theSiPMcharacteristics->getPixels(type);
154 }
155 
156 double HcalSimParameters::sipmDarkCurrentuA(const DetId& detId) const {
159 }
160 
161 double HcalSimParameters::sipmCrossTalk(const DetId& detId) const {
164  return theSiPMcharacteristics->getCrossTalk(type);
165 }
166 std::vector<float> HcalSimParameters::sipmNonlinearity(const DetId& detId) const {
170 }
171 
172 unsigned int HcalSimParameters::signalShape(const DetId& detId) const {
174  return theDbService->getHcalMCParam(detId)->signalShape();
175 }
std::vector< float > sipmNonlinearity(const DetId &detId) const
const HcalSiPMCharacteristics * theSiPMcharacteristics
const HcalGainWidth * getGainWidth(const HcalGenericDetId &fId) const
constexpr int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
double fCtoGeV(const DetId &detId) const
int getType() const
get SiPM type
int pixels(const DetId &detId) const
Log< level::Error, false > LogError
float getValue(int fCapId) const
get value for capId = 0..3
Definition: HcalGain.h:21
assert(be >=bs)
uint16_t size_type
Main class for Parameters in different subdetectors.
float getCrossTalk(int type) const
get cross talk
tuple result
Definition: mps_fire.py:311
static const double GeV2fC
HcalTimeSmearSettings theSmearSettings
unsigned int signalShape(const DetId &detId) const
double timeSmearRMS(double ampl) const
double simHitToPhotoelectrons() const
const HcalMCParam * getHcalMCParam(const HcalGenericDetId &fId) const
std::vector< double > theSamplingFactors
virtual double samplingFactor(const DetId &detId) const
float getDarkCurrent() const
get dark current
Log< level::Info, false > LogInfo
Definition: DetId.h:17
HcalSimParameters(double simHitToPhotoelectrons, double samplingFactor, double timePhase, int readoutFrameSize, int binOfMaximum, bool doPhotostatistics, bool syncPhase, int firstRing, const std::vector< double > &samplingFactors, double sipmTau)
double sipmDarkCurrentuA(const DetId &detId) const
const HcalGain * getGain(const HcalGenericDetId &fId) const
const HcalSiPMCharacteristics * getHcalSiPMCharacteristics() const
std::vector< float > getNonLinearities(int type) const
get nonlinearity constants
unsigned int signalShape() const
Definition: HcalMCParam.h:38
void setDbService(const HcalDbService *service)
double sipmCrossTalk(const DetId &detId) const
const HcalDbService * theDbService
int getPixels(int type) const
get # of pixels
const HcalSiPMParameter * getHcalSiPMParameter(const HcalGenericDetId &fId) const
float getFCByPE() const
get fcByPE
double photoelectronsToAnalog() const
the factor which goes from photoelectrons to whatever gets read by ADCs