CMS 3D CMS Logo

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

#include <HcalAmplifier.h>

Public Member Functions

virtual void amplify (CaloSamples &linearFrame, CLHEP::HepRandomEngine *) const
 
 HcalAmplifier (const CaloVSimParameterMap *parameters, bool addNoise, bool PreMix1, bool PreMix2)
 
void setDbService (const HcalDbService *service)
 the Producer will probably update this every event More...
 
void setIonFeedbackSim (HPDIonFeedbackSim *feedbackSim)
 
void setNoiseSignalGenerator (const CaloVNoiseSignalGenerator *noiseSignalGenerator)
 
void setStartingCapId (int capId)
 
void setTimeSlew (const HcalTimeSlew *timeSlew)
 
void setTimeSlewSim (HcalTimeSlewSim *timeSlewSim)
 
virtual ~HcalAmplifier ()
 

Public Attributes

const HcalTimeSlewtheTimeSlew = nullptr
 

Private Member Functions

void addPedestals (CaloSamples &frame, CLHEP::HepRandomEngine *) const
 
void applyQIEdelay (CaloSamples &frame, int delayQIE) const
 
void makeNoise (HcalGenericDetId::HcalGenericSubdetector hcalSubDet, const HcalCalibrationWidths &width, int fFrames, double *fGauss, double *fNoise) const
 
void pe2fC (CaloSamples &frame) const
 

Private Attributes

bool addNoise_
 
bool preMixAdd_
 
bool preMixDigi_
 
const HcalDbServicetheDbService
 
HPDIonFeedbackSimtheIonFeedbackSim
 
const CaloVNoiseSignalGeneratortheNoiseSignalGenerator
 
const CaloVSimParameterMaptheParameterMap
 
unsigned theStartingCapId
 
HcalTimeSlewSimtheTimeSlewSim
 

Detailed Description

Definition at line 20 of file HcalAmplifier.h.

Constructor & Destructor Documentation

◆ HcalAmplifier()

HcalAmplifier::HcalAmplifier ( const CaloVSimParameterMap parameters,
bool  addNoise,
bool  PreMix1,
bool  PreMix2 
)

Definition at line 24 of file HcalAmplifier.cc.

25  : theDbService(nullptr),
27  theNoiseSignalGenerator(nullptr),
28  theIonFeedbackSim(nullptr),
29  theTimeSlewSim(nullptr),
31  addNoise_(addNoise),
32  preMixDigi_(PreMix1),
33  preMixAdd_(PreMix2) {}
const CaloVNoiseSignalGenerator * theNoiseSignalGenerator
Definition: HcalAmplifier.h:56
const CaloVSimParameterMap * theParameterMap
Definition: HcalAmplifier.h:55
const HcalDbService * theDbService
Definition: HcalAmplifier.h:54
HcalTimeSlewSim * theTimeSlewSim
Definition: HcalAmplifier.h:58
unsigned theStartingCapId
Definition: HcalAmplifier.h:59
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57

◆ ~HcalAmplifier()

virtual HcalAmplifier::~HcalAmplifier ( )
inlinevirtual

Definition at line 24 of file HcalAmplifier.h.

24 {}

Member Function Documentation

◆ addPedestals()

void HcalAmplifier::addPedestals ( CaloSamples frame,
CLHEP::HepRandomEngine *  engine 
) const
private

Definition at line 95 of file HcalAmplifier.cc.

References addNoise_, cms::cuda::assert(), HcalGenericDetId::genericSubdet(), HcalDbService::getHcalCalibrations(), HcalDbService::getHcalCalibrationWidths(), HcalGenericDetId::HcalGenBarrel, HcalGenericDetId::HcalGenEndcap, HcalGenericDetId::HcalGenForward, HcalGenericDetId::HcalGenOuter, mps_fire::i, makeNoise(), hgchebackDigitizer_cfi::noise, Hcal_Conditions_forGlobalTag_cff::pedestal, HcalCalibrations::pedestal(), preMixDigi_, theDbService, and theStartingCapId.

Referenced by amplify().

95  {
96  assert(theDbService != nullptr);
97  HcalGenericDetId hcalGenDetId(frame.id());
98  HcalGenericDetId::HcalGenericSubdetector hcalSubDet = hcalGenDetId.genericSubdet();
99 
100  if (!((frame.id().subdetId() == HcalGenericDetId::HcalGenBarrel) ||
101  (frame.id().subdetId() == HcalGenericDetId::HcalGenEndcap) ||
102  (frame.id().subdetId() == HcalGenericDetId::HcalGenForward) ||
103  (frame.id().subdetId() == HcalGenericDetId::HcalGenOuter)))
104  return;
105 
106  if (hcalGenDetId.isHcalCastorDetId())
107  return;
108  if (hcalGenDetId.isHcalZDCDetId())
109  return;
110 
111  const HcalCalibrationWidths& calibWidths = theDbService->getHcalCalibrationWidths(hcalGenDetId);
112  const HcalCalibrations& calibs = theDbService->getHcalCalibrations(hcalGenDetId);
113 
114  double noise[32] = {0.}; //big enough
115  if (addNoise_) {
116  double gauss[32]; //big enough
117  for (int i = 0; i < frame.size(); i++)
118  gauss[i] = CLHEP::RandGaussQ::shoot(engine, 0., 1.);
119  makeNoise(hcalSubDet, calibWidths, frame.size(), gauss, noise);
120  }
121 
122  if (!preMixDigi_) { // if we are doing initial premix, no pedestals
123  for (int tbin = 0; tbin < frame.size(); ++tbin) {
124  int capId = (theStartingCapId + tbin) % 4;
125  double pedestal = calibs.pedestal(capId) + noise[tbin];
126  frame[tbin] += pedestal;
127  }
128  }
129 }
assert(be >=bs)
const HcalCalibrationWidths & getHcalCalibrationWidths(const HcalGenericDetId &fId) const
constexpr double pedestal(int fCapId) const
get pedestal for capid=0..3
const HcalCalibrations & getHcalCalibrations(const HcalGenericDetId &fId) const
const HcalDbService * theDbService
Definition: HcalAmplifier.h:54
void makeNoise(HcalGenericDetId::HcalGenericSubdetector hcalSubDet, const HcalCalibrationWidths &width, int fFrames, double *fGauss, double *fNoise) const
HcalGenericSubdetector genericSubdet() const
unsigned theStartingCapId
Definition: HcalAmplifier.h:59

◆ amplify()

void HcalAmplifier::amplify ( CaloSamples linearFrame,
CLHEP::HepRandomEngine *  engine 
) const
virtual

Definition at line 41 of file HcalAmplifier.cc.

References funct::abs(), addPedestals(), HPDIonFeedbackSim::addThermalNoise(), applyQIEdelay(), CaloVNoiseSignalGenerator::contains(), HcalTimeSlewSim::delay(), amptDefault_cfi::frame, DetId::Hcal, HcalGenericDetId::HcalGenBarrel, HcalGenericDetId::HcalGenEndcap, LogDebug, submitPVValidationJobs::params, pe2fC(), preMixAdd_, CaloVSimParameterMap::simParameters(), theIonFeedbackSim, theNoiseSignalGenerator, theParameterMap, theTimeSlew, and theTimeSlewSim.

Referenced by HcalElectronicsSim::convert().

41  {
42  if (theIonFeedbackSim) {
44  }
45  pe2fC(frame);
46 
47  if (frame.id().det() == DetId::Hcal && ((frame.id().subdetId() == HcalGenericDetId::HcalGenBarrel) ||
48  (frame.id().subdetId() == HcalGenericDetId::HcalGenEndcap))) {
49  const HcalSimParameters& params = static_cast<const HcalSimParameters&>(theParameterMap->simParameters(frame.id()));
50  if (abs(params.delayQIE()) <= 25)
51  applyQIEdelay(frame, params.delayQIE());
52  }
53 
54  // don't bother for blank signals
55  if (theTimeSlewSim && frame.size() > 4 && frame[4] > 1.e-6) {
57  }
58 
59  // if we are combining pre-mixed digis, we need noise and peds
61  addPedestals(frame, engine);
62  }
63  LogDebug("HcalAmplifier") << frame;
64 }
const CaloVNoiseSignalGenerator * theNoiseSignalGenerator
Definition: HcalAmplifier.h:56
const CaloVSimParameterMap * theParameterMap
Definition: HcalAmplifier.h:55
const HcalTimeSlew * theTimeSlew
Definition: HcalAmplifier.h:37
void pe2fC(CaloSamples &frame) const
void addThermalNoise(CaloSamples &samples, CLHEP::HepRandomEngine *)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
virtual const CaloSimParameters & simParameters(const DetId &id) const =0
HcalTimeSlewSim * theTimeSlewSim
Definition: HcalAmplifier.h:58
void applyQIEdelay(CaloSamples &frame, int delayQIE) const
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57
void delay(CaloSamples &samples, CLHEP::HepRandomEngine *, const HcalTimeSlew *hcalTimeSlew_delay) const
bool contains(const DetId &detId) const
#define LogDebug(id)
void addPedestals(CaloSamples &frame, CLHEP::HepRandomEngine *) const

◆ applyQIEdelay()

void HcalAmplifier::applyQIEdelay ( CaloSamples frame,
int  delayQIE 
) const
private

Definition at line 71 of file HcalAmplifier.cc.

References callgraph::cs, data, hcalSimParameters_cfi::delayQIE, hcalRecHitTable_cff::detId, mps_fire::i, createfilelist::int, and dqmiolumiharvest::j.

Referenced by amplify().

71  {
72  DetId detId(cs.id());
73  int maxbin = cs.size();
74  int precisebin = cs.preciseSize();
75  CaloSamples data(detId, maxbin, precisebin); // make a temporary copy
76  data = cs;
77  data.setBlank();
78  data.resetPrecise();
79 
80  for (int i = 0; i < precisebin; i++) {
81  int j = i + 2 * delayQIE;
82  data.preciseAtMod(i) +=
83  // value positive (signal moves earlier in time)
84  delayQIE > 0 ? (j < precisebin ? cs.preciseAt(j) : 0.) :
85  // value = 0 or negative (signal gets delayed)
86  (j < 0 ? 0. : cs.preciseAt(j));
87 
88  int samplebin = (int)i * maxbin / precisebin;
89  data[samplebin] += data.preciseAt(i);
90  }
91 
92  cs = data; // update the sample
93 }
Definition: DetId.h:17
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:80

◆ makeNoise()

void HcalAmplifier::makeNoise ( HcalGenericDetId::HcalGenericSubdetector  hcalSubDet,
const HcalCalibrationWidths width,
int  fFrames,
double *  fGauss,
double *  fNoise 
) const
private

Definition at line 131 of file HcalAmplifier.cc.

References alignCSCRings::corr, HcalGenericDetId::HcalGenForward, mps_fire::i, mathSSE::sqrt(), and ApeEstimator_cff::width.

Referenced by addPedestals().

135  {
136  // This is a simplified noise generation scheme using only the diagonal elements
137  // (proposed by Salavat Abduline).
138  // This is direct adaptation of the code in HcalPedestalWidth.cc
139 
140  // average over capId's
141  double s_xx_mean = 0.25 * (width.pedestal(0) * width.pedestal(0) + width.pedestal(1) * width.pedestal(1) +
142  width.pedestal(2) * width.pedestal(2) + width.pedestal(3) * width.pedestal(3));
143 
144  // Off-diagonal element approximation
145  // In principle should come from averaging the values of elements (0.1), (1,2), (2,3), (3,0)
146  // For now use the definition below (but keep structure of the code structure for development)
147  double s_xy_mean = -0.5 * s_xx_mean;
148  // Use different parameter for HF to reproduce the noise rate after zero suppression.
149  // Steven Won/Jim Hirschauer/Radek Ofierzynski 18.03.2010
150  if (hcalSubDet == HcalGenericDetId::HcalGenForward)
151  s_xy_mean = 0.08 * s_xx_mean;
152 
153  double term = s_xx_mean * s_xx_mean - 2. * s_xy_mean * s_xy_mean;
154 
155  if (term < 0.)
156  term = 1.e-50;
157  double sigma = sqrt(0.5 * (s_xx_mean + sqrt(term)));
158  double corr = sigma == 0. ? 0. : 0.5 * s_xy_mean / sigma;
159 
160  for (int i = 0; i < fFrames; i++) {
161  fNoise[i] = fGauss[i] * sigma;
162  if (i > 0)
163  fNoise[i] += fGauss[i - 1] * corr;
164  if (i < fFrames - 1)
165  fNoise[i] += fGauss[i + 1] * corr;
166  }
167 }
dictionary corr
T sqrt(T t)
Definition: SSEVec.h:23

◆ pe2fC()

void HcalAmplifier::pe2fC ( CaloSamples frame) const
private

Definition at line 66 of file HcalAmplifier.cc.

References CaloVSimParameterMap::simParameters(), and theParameterMap.

Referenced by amplify().

66  {
68  frame *= parameters.photoelectronsToAnalog(frame.id());
69 }
const CaloVSimParameterMap * theParameterMap
Definition: HcalAmplifier.h:55
Main class for Parameters in different subdetectors.
virtual const CaloSimParameters & simParameters(const DetId &id) const =0

◆ setDbService()

void HcalAmplifier::setDbService ( const HcalDbService service)

the Producer will probably update this every event

Definition at line 35 of file HcalAmplifier.cc.

References HPDIonFeedbackSim::setDbService(), theDbService, and theIonFeedbackSim.

Referenced by HcalTBDigiProducer::initializeEvent().

35  {
39 }
const HcalDbService * theDbService
Definition: HcalAmplifier.h:54
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57
void setDbService(const HcalDbService *service)

◆ setIonFeedbackSim()

void HcalAmplifier::setIonFeedbackSim ( HPDIonFeedbackSim feedbackSim)
inline

Definition at line 28 of file HcalAmplifier.h.

References theIonFeedbackSim.

28 { theIonFeedbackSim = feedbackSim; }
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57

◆ setNoiseSignalGenerator()

void HcalAmplifier::setNoiseSignalGenerator ( const CaloVNoiseSignalGenerator noiseSignalGenerator)
inline

if it's set, the amplifier will only use it to check if it has already added noise

Definition at line 32 of file HcalAmplifier.h.

References theNoiseSignalGenerator.

32  {
33  theNoiseSignalGenerator = noiseSignalGenerator;
34  }
const CaloVNoiseSignalGenerator * theNoiseSignalGenerator
Definition: HcalAmplifier.h:56

◆ setStartingCapId()

void HcalAmplifier::setStartingCapId ( int  capId)
inline

Definition at line 42 of file HcalAmplifier.h.

References theStartingCapId.

Referenced by HcalElectronicsSim::newEvent(), and HcalElectronicsSim::setStartingCapId().

42 { theStartingCapId = capId; }
unsigned theStartingCapId
Definition: HcalAmplifier.h:59

◆ setTimeSlew()

void HcalAmplifier::setTimeSlew ( const HcalTimeSlew timeSlew)
inline

Definition at line 38 of file HcalAmplifier.h.

References theTimeSlew.

Referenced by HcalTBDigiProducer::initializeEvent().

38 { theTimeSlew = timeSlew; }
const HcalTimeSlew * theTimeSlew
Definition: HcalAmplifier.h:37

◆ setTimeSlewSim()

void HcalAmplifier::setTimeSlewSim ( HcalTimeSlewSim timeSlewSim)
inline

Definition at line 35 of file HcalAmplifier.h.

References theTimeSlewSim.

Referenced by HcalTBDigiProducer::HcalTBDigiProducer().

35 { theTimeSlewSim = timeSlewSim; }
HcalTimeSlewSim * theTimeSlewSim
Definition: HcalAmplifier.h:58

Member Data Documentation

◆ addNoise_

bool HcalAmplifier::addNoise_
private

Definition at line 60 of file HcalAmplifier.h.

Referenced by addPedestals().

◆ preMixAdd_

bool HcalAmplifier::preMixAdd_
private

Definition at line 62 of file HcalAmplifier.h.

Referenced by amplify().

◆ preMixDigi_

bool HcalAmplifier::preMixDigi_
private

Definition at line 61 of file HcalAmplifier.h.

Referenced by addPedestals().

◆ theDbService

const HcalDbService* HcalAmplifier::theDbService
private

Definition at line 54 of file HcalAmplifier.h.

Referenced by addPedestals(), and setDbService().

◆ theIonFeedbackSim

HPDIonFeedbackSim* HcalAmplifier::theIonFeedbackSim
private

Definition at line 57 of file HcalAmplifier.h.

Referenced by amplify(), setDbService(), and setIonFeedbackSim().

◆ theNoiseSignalGenerator

const CaloVNoiseSignalGenerator* HcalAmplifier::theNoiseSignalGenerator
private

Definition at line 56 of file HcalAmplifier.h.

Referenced by amplify(), and setNoiseSignalGenerator().

◆ theParameterMap

const CaloVSimParameterMap* HcalAmplifier::theParameterMap
private

Definition at line 55 of file HcalAmplifier.h.

Referenced by amplify(), and pe2fC().

◆ theStartingCapId

unsigned HcalAmplifier::theStartingCapId
private

Definition at line 59 of file HcalAmplifier.h.

Referenced by addPedestals(), and setStartingCapId().

◆ theTimeSlew

const HcalTimeSlew* HcalAmplifier::theTimeSlew = nullptr

Definition at line 37 of file HcalAmplifier.h.

Referenced by amplify(), and setTimeSlew().

◆ theTimeSlewSim

HcalTimeSlewSim* HcalAmplifier::theTimeSlewSim
private

Definition at line 58 of file HcalAmplifier.h.

Referenced by amplify(), and setTimeSlewSim().