CMS 3D CMS Logo

HcalAmplifier.cc
Go to the documentation of this file.
15 
17 
18 #include "CLHEP/Random/RandGaussQ.h"
19 #include "CLHEP/Random/RandFlat.h"
20 
21 #include <cmath>
22 #include <cmath>
23 
24 HcalAmplifier::HcalAmplifier(const CaloVSimParameterMap* parameters, bool addNoise, bool PreMix1, bool PreMix2)
25  : theDbService(nullptr),
26  theParameterMap(parameters),
27  theNoiseSignalGenerator(nullptr),
28  theIonFeedbackSim(nullptr),
29  theTimeSlewSim(nullptr),
30  theStartingCapId(0),
31  addNoise_(addNoise),
32  preMixDigi_(PreMix1),
33  preMixAdd_(PreMix2) {}
34 
39 }
40 
41 void HcalAmplifier::amplify(CaloSamples& frame, CLHEP::HepRandomEngine* engine) const {
42  if (theIonFeedbackSim) {
44  }
45  pe2fC(frame);
46  // don't bother for blank signals
47  if (theTimeSlewSim && frame.size() > 4 && frame[4] > 1.e-6) {
49  }
50 
51  // if we are combining pre-mixed digis, we need noise and peds
53  addPedestals(frame, engine);
54  }
55  LogDebug("HcalAmplifier") << frame;
56 }
57 
60  frame *= parameters.photoelectronsToAnalog(frame.id());
61 }
62 
63 void HcalAmplifier::addPedestals(CaloSamples& frame, CLHEP::HepRandomEngine* engine) const {
64  assert(theDbService != nullptr);
65  HcalGenericDetId hcalGenDetId(frame.id());
66  HcalGenericDetId::HcalGenericSubdetector hcalSubDet = hcalGenDetId.genericSubdet();
67 
68  if (!((frame.id().subdetId() == HcalGenericDetId::HcalGenBarrel) ||
69  (frame.id().subdetId() == HcalGenericDetId::HcalGenEndcap) ||
70  (frame.id().subdetId() == HcalGenericDetId::HcalGenForward) ||
71  (frame.id().subdetId() == HcalGenericDetId::HcalGenOuter)))
72  return;
73 
74  if (hcalGenDetId.isHcalCastorDetId())
75  return;
76  if (hcalGenDetId.isHcalZDCDetId())
77  return;
78 
79  const HcalCalibrationWidths& calibWidths = theDbService->getHcalCalibrationWidths(hcalGenDetId);
80  const HcalCalibrations& calibs = theDbService->getHcalCalibrations(hcalGenDetId);
81 
82  double noise[32] = {0.}; //big enough
83  if (addNoise_) {
84  double gauss[32]; //big enough
85  for (int i = 0; i < frame.size(); i++)
86  gauss[i] = CLHEP::RandGaussQ::shoot(engine, 0., 1.);
87  makeNoise(hcalSubDet, calibWidths, frame.size(), gauss, noise);
88  }
89 
90  if (!preMixDigi_) { // if we are doing initial premix, no pedestals
91  for (int tbin = 0; tbin < frame.size(); ++tbin) {
92  int capId = (theStartingCapId + tbin) % 4;
93  double pedestal = calibs.pedestal(capId) + noise[tbin];
94  frame[tbin] += pedestal;
95  }
96  }
97 }
98 
101  int fFrames,
102  double* fGauss,
103  double* fNoise) const {
104  // This is a simplified noise generation scheme using only the diagonal elements
105  // (proposed by Salavat Abduline).
106  // This is direct adaptation of the code in HcalPedestalWidth.cc
107 
108  // average over capId's
109  double s_xx_mean = 0.25 * (width.pedestal(0) * width.pedestal(0) + width.pedestal(1) * width.pedestal(1) +
110  width.pedestal(2) * width.pedestal(2) + width.pedestal(3) * width.pedestal(3));
111 
112  // Off-diagonal element approximation
113  // In principle should come from averaging the values of elements (0.1), (1,2), (2,3), (3,0)
114  // For now use the definition below (but keep structure of the code structure for development)
115  double s_xy_mean = -0.5 * s_xx_mean;
116  // Use different parameter for HF to reproduce the noise rate after zero suppression.
117  // Steven Won/Jim Hirschauer/Radek Ofierzynski 18.03.2010
118  if (hcalSubDet == HcalGenericDetId::HcalGenForward)
119  s_xy_mean = 0.08 * s_xx_mean;
120 
121  double term = s_xx_mean * s_xx_mean - 2. * s_xy_mean * s_xy_mean;
122 
123  if (term < 0.)
124  term = 1.e-50;
125  double sigma = sqrt(0.5 * (s_xx_mean + sqrt(term)));
126  double corr = sigma == 0. ? 0. : 0.5 * s_xy_mean / sigma;
127 
128  for (int i = 0; i < fFrames; i++) {
129  fNoise[i] = fGauss[i] * sigma;
130  if (i > 0)
131  fNoise[i] += fGauss[i - 1] * corr;
132  if (i < fFrames - 1)
133  fNoise[i] += fGauss[i + 1] * corr;
134  }
135 }
HcalAmplifier::pe2fC
void pe2fC(CaloSamples &frame) const
Definition: HcalAmplifier.cc:58
HcalPedestal.h
service
Definition: service.py:1
ApeEstimator_cff.width
width
Definition: ApeEstimator_cff.py:24
HcalCalibrations.h
mps_fire.i
i
Definition: mps_fire.py:355
HcalSimParameters.h
HcalDbService::getHcalCalibrationWidths
const HcalCalibrationWidths & getHcalCalibrationWidths(const HcalGenericDetId &fId) const
Definition: HcalDbService.cc:70
HcalAmplifier::amplify
virtual void amplify(CaloSamples &linearFrame, CLHEP::HepRandomEngine *) const
Definition: HcalAmplifier.cc:41
MessageLogger.h
CaloVSimParameterMap
Definition: CaloVSimParameterMap.h:7
HcalGenericDetId
Definition: HcalGenericDetId.h:15
CaloSamples.h
HcalTimeSlewSim::delay
void delay(CaloSamples &samples, CLHEP::HepRandomEngine *, const HcalTimeSlew *hcalTimeSlew_delay) const
Definition: HcalTimeSlewSim.cc:28
HcalAmplifier::theTimeSlew
const HcalTimeSlew * theTimeSlew
Definition: HcalAmplifier.h:37
cms::cuda::assert
assert(be >=bs)
HcalGenericDetId::HcalGenEndcap
Definition: HcalGenericDetId.h:20
HcalAmplifier::HcalAmplifier
HcalAmplifier(const CaloVSimParameterMap *parameters, bool addNoise, bool PreMix1, bool PreMix2)
Definition: HcalAmplifier.cc:24
HPDIonFeedbackSim::addThermalNoise
void addThermalNoise(CaloSamples &samples, CLHEP::HepRandomEngine *)
Definition: HPDIonFeedbackSim.cc:96
HcalDbService::getHcalCalibrations
const HcalCalibrations & getHcalCalibrations(const HcalGenericDetId &fId) const
Definition: HcalDbService.cc:65
parameters
parameters
Definition: BeamSpot_PayloadInspector.cc:14
CaloVNoiseSignalGenerator.h
HcalAmplifier::theParameterMap
const CaloVSimParameterMap * theParameterMap
Definition: HcalAmplifier.h:54
HcalGain.h
alignCSCRings.corr
dictionary corr
Definition: alignCSCRings.py:124
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
CaloSimParameters
Main class for Parameters in different subdetectors.
Definition: CaloSimParameters.h:14
CaloVSimParameterMap::simParameters
virtual const CaloSimParameters & simParameters(const DetId &id) const =0
HcalCalibrations
Definition: HcalCalibrations.h:9
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
HcalGenericDetId::HcalGenericSubdetector
HcalGenericSubdetector
Definition: HcalGenericDetId.h:17
HcalDetId.h
hgcalDigitizer_cfi.noise
noise
Definition: hgcalDigitizer_cfi.py:150
HcalAmplifier::theDbService
const HcalDbService * theDbService
Definition: HcalAmplifier.h:53
HcalAmplifier::preMixDigi_
bool preMixDigi_
Definition: HcalAmplifier.h:60
CaloVSimParameterMap.h
HcalGenericDetId::HcalGenBarrel
Definition: HcalGenericDetId.h:19
EcalCondDBWriter_cfi.pedestal
pedestal
Definition: EcalCondDBWriter_cfi.py:49
CaloSamples
Definition: CaloSamples.h:14
HPDIonFeedbackSim.h
HcalAmplifier::addNoise_
bool addNoise_
Definition: HcalAmplifier.h:59
HcalAmplifier::theTimeSlewSim
HcalTimeSlewSim * theTimeSlewSim
Definition: HcalAmplifier.h:57
HcalDbService
Definition: HcalDbService.h:26
HcalAmplifier::theIonFeedbackSim
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:56
HcalCalibrations::pedestal
constexpr double pedestal(int fCapId) const
get pedestal for capid=0..3
Definition: HcalCalibrations.h:46
HcalPedestalWidth.h
HcalGenericDetId::genericSubdet
HcalGenericSubdetector genericSubdet() const
Definition: HcalGenericDetId.cc:21
amptDefault_cfi.frame
frame
Definition: amptDefault_cfi.py:12
HcalAmplifier::preMixAdd_
bool preMixAdd_
Definition: HcalAmplifier.h:61
HcalAmplifier::makeNoise
void makeNoise(HcalGenericDetId::HcalGenericSubdetector hcalSubDet, const HcalCalibrationWidths &width, int fFrames, double *fGauss, double *fNoise) const
Definition: HcalAmplifier.cc:99
HcalAmplifier::addPedestals
void addPedestals(CaloSamples &frame, CLHEP::HepRandomEngine *) const
Definition: HcalAmplifier.cc:63
HcalDbService.h
HcalGenericDetId::HcalGenOuter
Definition: HcalGenericDetId.h:21
HcalGainWidth.h
HcalAmplifier.h
HcalAmplifier::theNoiseSignalGenerator
const CaloVNoiseSignalGenerator * theNoiseSignalGenerator
Definition: HcalAmplifier.h:55
HcalCalibrationWidths
Definition: HcalCalibrationWidths.h:9
HcalGenericDetId::HcalGenForward
Definition: HcalGenericDetId.h:22
HPDIonFeedbackSim::setDbService
void setDbService(const HcalDbService *service)
Definition: HPDIonFeedbackSim.h:34
CaloVNoiseSignalGenerator::contains
bool contains(const DetId &detId) const
Definition: CaloVNoiseSignalGenerator.cc:23
HcalTimeSlewSim.h
HcalAmplifier::setDbService
void setDbService(const HcalDbService *service)
the Producer will probably update this every event
Definition: HcalAmplifier.cc:35
HcalAmplifier::theStartingCapId
unsigned theStartingCapId
Definition: HcalAmplifier.h:58