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 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 ( const CaloVSimParameterMap parameters,
bool  addNoise,
bool  PreMix1,
bool  PreMix2 
)

Definition at line 24 of file HcalAmplifier.cc.

24  :
25  theDbService(nullptr),
26  theParameterMap(parameters),
27  theNoiseSignalGenerator(nullptr),
28  theIonFeedbackSim(nullptr),
29  theTimeSlewSim(nullptr),
31  addNoise_(addNoise),
32  preMixDigi_(PreMix1),
33  preMixAdd_(PreMix2)
34 { }
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
virtual HcalAmplifier::~HcalAmplifier ( )
inlinevirtual

Definition at line 24 of file HcalAmplifier.h.

24 {}

Member Function Documentation

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

Definition at line 70 of file HcalAmplifier.cc.

References addNoise_, HcalGenericDetId::genericSubdet(), HcalDbService::getHcalCalibrations(), HcalDbService::getHcalCalibrationWidths(), HcalGenericDetId::HcalGenBarrel, HcalGenericDetId::HcalGenEndcap, HcalGenericDetId::HcalGenForward, HcalGenericDetId::HcalGenOuter, mps_fire::i, CaloSamples::id(), makeNoise(), muonCSCDigis_cfi::pedestal, HcalCalibrations::pedestal(), preMixDigi_, CaloSamples::size(), DetId::subdetId(), theDbService, and theStartingCapId.

Referenced by amplify().

71 {
72  assert(theDbService != nullptr);
73  HcalGenericDetId hcalGenDetId(frame.id());
74  HcalGenericDetId::HcalGenericSubdetector hcalSubDet = hcalGenDetId.genericSubdet();
75 
76  if ( !( (frame.id().subdetId()==HcalGenericDetId::HcalGenBarrel) ||
79  (frame.id().subdetId()==HcalGenericDetId::HcalGenOuter) ) ) return;
80 
81  if(hcalGenDetId.isHcalCastorDetId()) return;
82  if(hcalGenDetId.isHcalZDCDetId()) return;
83 
84  const HcalCalibrationWidths & calibWidths = theDbService->getHcalCalibrationWidths(hcalGenDetId);
85  const HcalCalibrations& calibs = theDbService->getHcalCalibrations(hcalGenDetId);
86 
87  double noise [32] = {0.}; //big enough
88  if(addNoise_)
89  {
90  double gauss [32]; //big enough
91  for (int i = 0; i < frame.size(); i++) gauss[i] = CLHEP::RandGaussQ::shoot(engine, 0., 1.);
92  makeNoise(hcalSubDet, calibWidths, frame.size(), gauss, noise);
93  }
94 
95  if(!preMixDigi_){ // if we are doing initial premix, no pedestals
96  for (int tbin = 0; tbin < frame.size(); ++tbin) {
97  int capId = (theStartingCapId + tbin)%4;
98  double pedestal = calibs.pedestal(capId) + noise[tbin];
99  frame[tbin] += pedestal;
100  }
101  }
102 }
const HcalDbService * theDbService
Definition: HcalAmplifier.h:54
constexpr int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:41
const HcalCalibrationWidths & getHcalCalibrationWidths(const HcalGenericDetId &fId) const
constexpr double pedestal(int fCapId) const
get pedestal for capid=0..3
int size() const
get the size
Definition: CaloSamples.h:24
unsigned theStartingCapId
Definition: HcalAmplifier.h:59
void makeNoise(HcalGenericDetId::HcalGenericSubdetector hcalSubDet, const HcalCalibrationWidths &width, int fFrames, double *fGauss, double *fNoise) const
DetId id() const
get the (generic) id
Definition: CaloSamples.h:21
HcalGenericSubdetector genericSubdet() const
const HcalCalibrations & getHcalCalibrations(const HcalGenericDetId &fId) const
void HcalAmplifier::amplify ( CaloSamples linearFrame,
CLHEP::HepRandomEngine *  engine 
) const
virtual

Definition at line 43 of file HcalAmplifier.cc.

References addPedestals(), HPDIonFeedbackSim::addThermalNoise(), CaloVNoiseSignalGenerator::contains(), HcalTimeSlewSim::delay(), CaloSamples::id(), LogDebug, pe2fC(), preMixAdd_, CaloSamples::size(), theIonFeedbackSim, theNoiseSignalGenerator, theTimeSlew, and theTimeSlewSim.

Referenced by HcalElectronicsSim::convert().

43  {
45  {
47  }
48  pe2fC(frame);
49  // don't bother for blank signals
50  if(theTimeSlewSim && frame.size()>4 && frame[4] > 1.e-6)
51  {
53  }
54 
55  // if we are combining pre-mixed digis, we need noise and peds
57  {
58  addPedestals(frame, engine);
59  }
60  LogDebug("HcalAmplifier") << frame;
61 }
#define LogDebug(id)
const CaloVNoiseSignalGenerator * theNoiseSignalGenerator
Definition: HcalAmplifier.h:56
const HcalTimeSlew * theTimeSlew
Definition: HcalAmplifier.h:39
void addThermalNoise(CaloSamples &samples, CLHEP::HepRandomEngine *)
bool contains(const DetId &detId) const
void delay(CaloSamples &samples, CLHEP::HepRandomEngine *, const HcalTimeSlew *hcalTimeSlew_delay) const
HcalTimeSlewSim * theTimeSlewSim
Definition: HcalAmplifier.h:58
void addPedestals(CaloSamples &frame, CLHEP::HepRandomEngine *) const
void pe2fC(CaloSamples &frame) const
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57
void HcalAmplifier::makeNoise ( HcalGenericDetId::HcalGenericSubdetector  hcalSubDet,
const HcalCalibrationWidths width,
int  fFrames,
double *  fGauss,
double *  fNoise 
) const
private

Definition at line 104 of file HcalAmplifier.cc.

References corr, HcalGenericDetId::HcalGenForward, mps_fire::i, HcalCalibrationWidths::pedestal(), and mathSSE::sqrt().

Referenced by addPedestals().

105 {
106  // This is a simplified noise generation scheme using only the diagonal elements
107  // (proposed by Salavat Abduline).
108  // This is direct adaptation of the code in HcalPedestalWidth.cc
109 
110  // average over capId's
111  double s_xx_mean = 0.25 * (width.pedestal(0)*width.pedestal(0) +
112  width.pedestal(1)*width.pedestal(1) +
113  width.pedestal(2)*width.pedestal(2) +
114  width.pedestal(3)*width.pedestal(3));
115 
116 
117  // Off-diagonal element approximation
118  // In principle should come from averaging the values of elements (0.1), (1,2), (2,3), (3,0)
119  // For now use the definition below (but keep structure of the code structure for development)
120  double s_xy_mean = -0.5 * s_xx_mean;
121  // Use different parameter for HF to reproduce the noise rate after zero suppression.
122  // Steven Won/Jim Hirschauer/Radek Ofierzynski 18.03.2010
123  if (hcalSubDet == HcalGenericDetId::HcalGenForward) s_xy_mean = 0.08 * s_xx_mean;
124 
125  double term = s_xx_mean*s_xx_mean - 2.*s_xy_mean*s_xy_mean;
126 
127  if (term < 0.) term = 1.e-50 ;
128  double sigma = sqrt (0.5 * (s_xx_mean + sqrt(term)));
129  double corr = sigma == 0. ? 0. : 0.5*s_xy_mean / sigma;
130 
131  for (int i = 0; i < fFrames; i++) {
132  fNoise [i] = fGauss[i]*sigma;
133  if (i > 0) fNoise [i] += fGauss[i-1]*corr;
134  if (i < fFrames-1) fNoise [i] += fGauss[i+1]*corr;
135  }
136 }
double pedestal(int fCapId) const
get pedestal width for capid=0..3
T sqrt(T t)
Definition: SSEVec.h:18
JetCorrectorParameters corr
Definition: classes.h:5
void HcalAmplifier::pe2fC ( CaloSamples frame) const
private

Definition at line 64 of file HcalAmplifier.cc.

References CaloSamples::id(), CaloSimParameters::photoelectronsToAnalog(), CaloVSimParameterMap::simParameters(), and theParameterMap.

Referenced by amplify().

65 {
67  frame *= parameters.photoelectronsToAnalog(frame.id());
68 }
const CaloVSimParameterMap * theParameterMap
Definition: HcalAmplifier.h:55
Main class for Parameters in different subdetectors.
virtual const CaloSimParameters & simParameters(const DetId &id) const =0
DetId id() const
get the (generic) id
Definition: CaloSamples.h:21
double photoelectronsToAnalog() const
the factor which goes from photoelectrons to whatever gets read by ADCs
void HcalAmplifier::setDbService ( const HcalDbService service)

the Producer will probably update this every event

Definition at line 37 of file HcalAmplifier.cc.

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

Referenced by HcalTBDigiProducer::initializeEvent().

37  {
38  theDbService = service;
40 }
const HcalDbService * theDbService
Definition: HcalAmplifier.h:54
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57
void setDbService(const HcalDbService *service)
void HcalAmplifier::setIonFeedbackSim ( HPDIonFeedbackSim feedbackSim)
inline

Definition at line 28 of file HcalAmplifier.h.

28 {theIonFeedbackSim = feedbackSim;}
HPDIonFeedbackSim * theIonFeedbackSim
Definition: HcalAmplifier.h:57
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.

32  {
33  theNoiseSignalGenerator = noiseSignalGenerator;
34  }
const CaloVNoiseSignalGenerator * theNoiseSignalGenerator
Definition: HcalAmplifier.h:56
void HcalAmplifier::setStartingCapId ( int  capId)
inline

Definition at line 46 of file HcalAmplifier.h.

References ApeEstimator_cff::width.

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

46 {theStartingCapId = capId;}
unsigned theStartingCapId
Definition: HcalAmplifier.h:59
void HcalAmplifier::setTimeSlew ( const HcalTimeSlew timeSlew)
inline

Definition at line 40 of file HcalAmplifier.h.

Referenced by HcalTBDigiProducer::initializeEvent().

40  {
41  theTimeSlew = timeSlew;
42  }
const HcalTimeSlew * theTimeSlew
Definition: HcalAmplifier.h:39
void HcalAmplifier::setTimeSlewSim ( HcalTimeSlewSim timeSlewSim)
inline

Definition at line 35 of file HcalAmplifier.h.

Referenced by HcalTBDigiProducer::HcalTBDigiProducer().

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

Member Data Documentation

bool HcalAmplifier::addNoise_
private

Definition at line 60 of file HcalAmplifier.h.

Referenced by addPedestals().

bool HcalAmplifier::preMixAdd_
private

Definition at line 62 of file HcalAmplifier.h.

Referenced by amplify().

bool HcalAmplifier::preMixDigi_
private

Definition at line 61 of file HcalAmplifier.h.

Referenced by addPedestals().

const HcalDbService* HcalAmplifier::theDbService
private

Definition at line 54 of file HcalAmplifier.h.

Referenced by addPedestals(), and setDbService().

HPDIonFeedbackSim* HcalAmplifier::theIonFeedbackSim
private

Definition at line 57 of file HcalAmplifier.h.

Referenced by amplify(), and setDbService().

const CaloVNoiseSignalGenerator* HcalAmplifier::theNoiseSignalGenerator
private

Definition at line 56 of file HcalAmplifier.h.

Referenced by amplify().

const CaloVSimParameterMap* HcalAmplifier::theParameterMap
private

Definition at line 55 of file HcalAmplifier.h.

Referenced by pe2fC().

unsigned HcalAmplifier::theStartingCapId
private

Definition at line 59 of file HcalAmplifier.h.

Referenced by addPedestals().

const HcalTimeSlew* HcalAmplifier::theTimeSlew = nullptr

Definition at line 39 of file HcalAmplifier.h.

Referenced by amplify().

HcalTimeSlewSim* HcalAmplifier::theTimeSlewSim
private

Definition at line 58 of file HcalAmplifier.h.

Referenced by amplify().