CMS 3D CMS Logo

HcalSimParameters.cc
Go to the documentation of this file.
9 #include "CLHEP/Random/RandGaussQ.h"
10 using namespace std;
11 
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)
23  0.0,
25  timePhase,
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 
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);
60  theSiPMcharacteristics = service->getHcalSiPMCharacteristics();
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)
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 
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)
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 
154 }
155 
159 }
160 
165 }
166 std::vector<float> HcalSimParameters::sipmNonlinearity(const DetId& detId) const {
170 }
171 
172 unsigned int HcalSimParameters::signalShape(const DetId& detId) const {
175 }
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
int pixels(const DetId &detId) const
float getFCByPE() const
get fcByPE
std::vector< float > getNonLinearities(int type) const
get nonlinearity constants
float getDarkCurrent() const
get dark current
double photoelectronsToAnalog() const
the factor which goes from photoelectrons to whatever gets read by ADCs
Log< level::Error, false > LogError
assert(be >=bs)
virtual double samplingFactor(const DetId &detId) const
uint16_t size_type
Main class for Parameters in different subdetectors.
double sipmCrossTalk(const DetId &detId) const
double simHitToPhotoelectrons() const
const HcalMCParam * getHcalMCParam(const HcalGenericDetId &fId) const
static const double GeV2fC
float getCrossTalk(int type) const
get cross talk
HcalTimeSmearSettings theSmearSettings
double sipmDarkCurrentuA(const DetId &detId) const
unsigned int signalShape(const DetId &detId) const
std::vector< double > theSamplingFactors
unsigned int signalShape() const
Definition: HcalMCParam.h:38
constexpr float gains[NGAINS]
Definition: EcalConstants.h:20
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 timeSmearRMS(double ampl) const
const HcalGain * getGain(const HcalGenericDetId &fId) const
int getPixels(int type) const
get # of pixels
int getType() const
get SiPM type
void setDbService(const HcalDbService *service)
const HcalDbService * theDbService
const HcalSiPMParameter * getHcalSiPMParameter(const HcalGenericDetId &fId) const
double fCtoGeV(const DetId &detId) const
std::vector< float > sipmNonlinearity(const DetId &detId) const