CMS 3D CMS Logo

List of all members | Public Member Functions | Static Public Attributes | Private Types | Private Attributes | Static Private Attributes
HcaluLUTTPGCoder Class Reference

#include <HcaluLUTTPGCoder.h>

Inheritance diagram for HcaluLUTTPGCoder:
HcalTPGCoder

Public Member Functions

void adc2Linear (const HBHEDataFrame &df, IntegerCaloSamples &ics) const override
 
void adc2Linear (const HFDataFrame &df, IntegerCaloSamples &ics) const override
 
void adc2Linear (const QIE10DataFrame &df, IntegerCaloSamples &ics) const override
 
void adc2Linear (const QIE11DataFrame &df, IntegerCaloSamples &ics) const override
 
unsigned short adc2Linear (HcalQIESample sample, HcalDetId id) const override
 
void compress (const IntegerCaloSamples &ics, const std::vector< bool > &featureBits, HcalTriggerPrimitiveDigi &tp) const override
 
std::vector< unsigned short > getLinearizationLUT (HcalDetId id) const override
 Get the full linearization LUT (128 elements). Default implementation just uses adc2Linear to get all values. More...
 
float getLUTGain (HcalDetId id) const override
 
int getLUTId (HcalSubdetector id, int ieta, int iphi, int depth) const
 
int getLUTId (uint32_t rawid) const
 
int getLUTId (const HcalDetId &detid) const
 
float getLUTPedestal (HcalDetId id) const override
 
bool getMSB (const HcalDetId &id, int adc) const
 
 HcaluLUTTPGCoder (const HcalTopology *topo)
 
void lookupMSB (const HBHEDataFrame &df, std::vector< bool > &msb) const
 
void lookupMSB (const QIE10DataFrame &df, std::vector< bool > &msb) const
 
void lookupMSB (const QIE11DataFrame &df, std::vector< std::bitset< 2 >> &msb) const
 
void setFGHFthreshold (unsigned int fgthreshold)
 
void setLUTGenerationMode (bool gen)
 
void setMaskBit (int bit)
 
void update (const HcalDbService &conditions)
 
void update (const char *filename, bool appendMSB=false)
 
void updateXML (const char *filename)
 
 ~HcaluLUTTPGCoder () override
 
- Public Member Functions inherited from HcalTPGCoder
unsigned short adc2Linear (unsigned char adc, HcalDetId id) const
 
virtual ~HcalTPGCoder ()=default
 

Static Public Attributes

static const float lsb_ =1./16
 
static const int QIE10_LUT_BITMASK = 0x7FF
 
static const int QIE11_LUT_BITMASK = 0x3FF
 
static const int QIE8_LUT_BITMASK = 0x3FF
 

Private Types

typedef std::vector< LutElementLut
 
typedef unsigned short LutElement
 

Private Attributes

int bitToMask_
 
unsigned int FG_HF_threshold_
 
int firstHBEta_
 
int firstHEEta_
 
int firstHFEta_
 
std::vector< float > gain_
 
std::vector< LutinputLUT_
 
int lastHBEta_
 
int lastHEEta_
 
int lastHFEta_
 
bool LUTGenerationMode_
 
int maxDepthHB_
 
int maxDepthHE_
 
int maxDepthHF_
 
int nHBEta_
 
int nHEEta_
 
int nHFEta_
 
std::vector< float > ped_
 
int sizeHB_
 
int sizeHE_
 
int sizeHF_
 
const HcalTopologytopo_
 

Static Private Attributes

static const size_t INPUT_LUT_SIZE = 128
 
static const int nFi_ = 72
 
static const int QIE10_LUT_MSB = 0x1000
 
static const int QIE11_LUT_MSB0 = 0x400
 
static const int QIE11_LUT_MSB1 = 0x800
 
static const int QIE8_LUT_MSB = 0x400
 
static const size_t UPGRADE_LUT_SIZE = 256
 

Detailed Description

The nominal coder uses a user-supplied table to linearize the ADC values.

[number of ieta slices]
[low tower 1] [low tower 2] ...
[high tower 1] [ high tower 2] ...
[LUT 1(0)] [LUT 2(0)] ...
[LUT 1(1)] [LUT 2(1)] ...
. . .
[LUT 1(127)] [LUT 2(127)] ...
Author
M. Weinberger – TAMU
Tulika Bose and Greg Landsberg – Brown

Definition at line 31 of file HcaluLUTTPGCoder.h.

Member Typedef Documentation

typedef std::vector<LutElement> HcaluLUTTPGCoder::Lut
private

Definition at line 68 of file HcaluLUTTPGCoder.h.

typedef unsigned short HcaluLUTTPGCoder::LutElement
private

Definition at line 67 of file HcaluLUTTPGCoder.h.

Constructor & Destructor Documentation

HcaluLUTTPGCoder::HcaluLUTTPGCoder ( const HcalTopology topo)

Definition at line 36 of file HcaluLUTTPGCoder.cc.

References firstHBEta_, HcalTopology::firstHBRing(), firstHEEta_, HcalTopology::firstHERing(), firstHFEta_, HcalTopology::firstHFRing(), gain_, HcalBarrel, HcalEndcap, HcalForward, inputLUT_, lastHBEta_, HcalTopology::lastHBRing(), lastHEEta_, HcalTopology::lastHERing(), lastHFEta_, HcalTopology::lastHFRing(), HcalTopology::maxDepth(), maxDepthHB_, maxDepthHE_, maxDepthHF_, nFi_, nHBEta_, nHEEta_, nHFEta_, ped_, sizeHB_, sizeHE_, sizeHF_, and topo_.

36  : topo_(top), LUTGenerationMode_(true), bitToMask_(0) {
52  size_t nluts= (size_t)(sizeHB_+sizeHE_+sizeHF_+1);
53  inputLUT_ = std::vector<HcaluLUTTPGCoder::Lut>(nluts);
54  gain_ = std::vector<float>(nluts, 0.);
55  ped_ = std::vector<float>(nluts, 0.);
56 }
int firstHFRing() const
Definition: HcalTopology.h:91
static const int nFi_
const HcalTopology * topo_
int firstHBRing() const
Definition: HcalTopology.h:87
int lastHBRing() const
Definition: HcalTopology.h:88
int maxDepth(HcalSubdetector subdet) const
int lastHFRing() const
Definition: HcalTopology.h:92
std::vector< float > ped_
std::vector< float > gain_
int firstHERing() const
Definition: HcalTopology.h:89
int lastHERing() const
Definition: HcalTopology.h:90
std::vector< Lut > inputLUT_
HcaluLUTTPGCoder::~HcaluLUTTPGCoder ( )
override

Definition at line 62 of file HcaluLUTTPGCoder.cc.

62  {
63 }

Member Function Documentation

void HcaluLUTTPGCoder::adc2Linear ( const HBHEDataFrame df,
IntegerCaloSamples ics 
) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 337 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), getLUTId(), mps_fire::i, HBHEDataFrame::id(), inputLUT_, lumiPlot::lut, QIE8_LUT_BITMASK, and HBHEDataFrame::size().

Referenced by HcalTriggerPrimitiveAlgo::addSignal().

337  {
338  int lutId = getLUTId(df.id());
339  const Lut& lut = inputLUT_.at(lutId);
340  for (int i=0; i<df.size(); i++){
341  ics[i] = (lut.at(df[i].adc()) & QIE8_LUT_BITMASK);
342  }
343 }
int adc(sample_type sample)
get the ADC sample (12 bits)
int size() const
total number of samples in the digi
Definition: HBHEDataFrame.h:26
static const int QIE8_LUT_BITMASK
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
const HcalDetId & id() const
Definition: HBHEDataFrame.h:22
Definition: Lut.h:32
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::adc2Linear ( const HFDataFrame df,
IntegerCaloSamples ics 
) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 345 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), getLUTId(), mps_fire::i, HFDataFrame::id(), inputLUT_, lumiPlot::lut, QIE8_LUT_BITMASK, and HFDataFrame::size().

345  {
346  int lutId = getLUTId(df.id());
347  const Lut& lut = inputLUT_.at(lutId);
348  for (int i=0; i<df.size(); i++){
349  ics[i] = (lut.at(df[i].adc()) & QIE8_LUT_BITMASK);
350  }
351 }
int adc(sample_type sample)
get the ADC sample (12 bits)
static const int QIE8_LUT_BITMASK
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
int size() const
total number of samples in the digi
Definition: HFDataFrame.h:26
const HcalDetId & id() const
Definition: HFDataFrame.h:22
Definition: Lut.h:32
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::adc2Linear ( const QIE10DataFrame df,
IntegerCaloSamples ics 
) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 353 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), getLUTId(), mps_fire::i, QIE10DataFrame::id(), inputLUT_, lumiPlot::lut, QIE10_LUT_BITMASK, and QIE10DataFrame::samples().

353  {
354  int lutId = getLUTId(HcalDetId(df.id()));
355  const Lut& lut = inputLUT_.at(lutId);
356  for (int i=0; i<df.samples(); i++){
357  ics[i] = (lut.at(df[i].adc()) & QIE10_LUT_BITMASK);
358  }
359 }
int adc(sample_type sample)
get the ADC sample (12 bits)
int samples() const
total number of samples in the digi
edm::DataFrame::id_type id() const
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
static const int QIE10_LUT_BITMASK
Definition: Lut.h:32
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::adc2Linear ( const QIE11DataFrame df,
IntegerCaloSamples ics 
) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 361 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), getLUTId(), mps_fire::i, QIE11DataFrame::id(), inputLUT_, lumiPlot::lut, QIE11_LUT_BITMASK, and QIE11DataFrame::samples().

361  {
362  int lutId = getLUTId(HcalDetId(df.id()));
363  const Lut& lut = inputLUT_.at(lutId);
364  for (int i=0; i<df.samples(); i++){
365  ics[i] = (lut.at(df[i].adc()) & QIE11_LUT_BITMASK);
366  }
367 }
int adc(sample_type sample)
get the ADC sample (12 bits)
static const int QIE11_LUT_BITMASK
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
edm::DataFrame::id_type id() const
int samples() const
total number of samples in the digi
Definition: Lut.h:32
std::vector< Lut > inputLUT_
unsigned short HcaluLUTTPGCoder::adc2Linear ( HcalQIESample  sample,
HcalDetId  id 
) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 369 of file HcaluLUTTPGCoder.cc.

References HcalQIESample::adc(), getLUTId(), inputLUT_, and QIE8_LUT_BITMASK.

369  {
370  int lutId = getLUTId(id);
371  return ((inputLUT_.at(lutId)).at(sample.adc()) & QIE8_LUT_BITMASK);
372 }
int adc() const
get the ADC sample
Definition: HcalQIESample.h:22
static const int QIE8_LUT_BITMASK
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::compress ( const IntegerCaloSamples ics,
const std::vector< bool > &  featureBits,
HcalTriggerPrimitiveDigi tp 
) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 58 of file HcaluLUTTPGCoder.cc.

References Exception.

58  {
59  throw cms::Exception("PROBLEM: This method should never be invoked!");
60 }
std::vector< unsigned short > HcaluLUTTPGCoder::getLinearizationLUT ( HcalDetId  id) const
overridevirtual

Get the full linearization LUT (128 elements). Default implementation just uses adc2Linear to get all values.

Reimplemented from HcalTPGCoder.

Definition at line 384 of file HcaluLUTTPGCoder.cc.

References getLUTId(), and inputLUT_.

384  {
385  int lutId = getLUTId(id);
386  return inputLUT_.at(lutId);
387 }
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
std::vector< Lut > inputLUT_
float HcaluLUTTPGCoder::getLUTGain ( HcalDetId  id) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 379 of file HcaluLUTTPGCoder.cc.

References gain_, and getLUTId().

379  {
380  int lutId = getLUTId(id);
381  return gain_.at(lutId);
382 }
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
std::vector< float > gain_
int HcaluLUTTPGCoder::getLUTId ( HcalSubdetector  id,
int  ieta,
int  iphi,
int  depth 
) const

Definition at line 65 of file HcaluLUTTPGCoder.cc.

References firstHBEta_, firstHEEta_, firstHFEta_, HcalBarrel, HcalEndcap, HcalForward, lastHBEta_, lastHEEta_, lastHFEta_, maxDepthHB_, maxDepthHE_, maxDepthHF_, nFi_, nHBEta_, nHEEta_, nHFEta_, sizeHB_, and sizeHE_.

Referenced by adc2Linear(), getLinearizationLUT(), getLUTGain(), getLUTId(), getLUTPedestal(), getMSB(), lookupMSB(), setMaskBit(), update(), and updateXML().

65  {
66  int retval(0);
67  if (id == HcalBarrel) {
68  retval = (depth-1)+maxDepthHB_*(iphi-1);
69  if (ieta>0) retval+=maxDepthHB_*nFi_*(ieta-firstHBEta_);
70  else retval+=maxDepthHB_*nFi_*(ieta+lastHBEta_+nHBEta_);
71  } else if (id == HcalEndcap) {
72  retval = sizeHB_;
73  retval+= (depth-1)+maxDepthHE_*(iphi-1);
74  if (ieta>0) retval+=maxDepthHE_*nFi_*(ieta-firstHEEta_);
75  else retval+=maxDepthHE_*nFi_*(ieta+lastHEEta_+nHEEta_);
76  } else if (id == HcalForward) {
77  retval = sizeHB_+sizeHE_;
78  retval+= (depth-1)+maxDepthHF_*(iphi-1);
79  if (ieta>0) retval+=maxDepthHF_*nFi_*(ieta-firstHFEta_);
80  else retval+=maxDepthHF_*nFi_*(ieta+lastHFEta_+nHFEta_);
81  }
82  return retval;
83 }
static const int nFi_
int HcaluLUTTPGCoder::getLUTId ( uint32_t  rawid) const

Definition at line 85 of file HcaluLUTTPGCoder.cc.

References HcalDetId::depth(), getLUTId(), HcalDetId::ieta(), HcalDetId::iphi(), and HcalDetId::subdet().

85  {
86  HcalDetId detid(rawid);
87  return getLUTId(detid.subdet(), detid.ieta(), detid.iphi(), detid.depth());
88 }
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
int HcaluLUTTPGCoder::getLUTId ( const HcalDetId detid) const

Definition at line 90 of file HcaluLUTTPGCoder.cc.

References HcalDetId::depth(), getLUTId(), HcalDetId::ieta(), HcalDetId::iphi(), and HcalDetId::subdet().

90  {
91  return getLUTId(detid.subdet(), detid.ieta(), detid.iphi(), detid.depth());
92 }
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:49
int depth() const
get the tower depth
Definition: HcalDetId.cc:129
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
int ieta() const
get the cell ieta
Definition: HcalDetId.h:56
int iphi() const
get the cell iphi
Definition: HcalDetId.cc:124
float HcaluLUTTPGCoder::getLUTPedestal ( HcalDetId  id) const
overridevirtual

Implements HcalTPGCoder.

Definition at line 374 of file HcaluLUTTPGCoder.cc.

References getLUTId(), and ped_.

374  {
375  int lutId = getLUTId(id);
376  return ped_.at(lutId);
377 }
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
std::vector< float > ped_
bool HcaluLUTTPGCoder::getMSB ( const HcalDetId id,
int  adc 
) const

Definition at line 395 of file HcaluLUTTPGCoder.cc.

References getLUTId(), inputLUT_, lumiPlot::lut, and QIE8_LUT_MSB.

Referenced by lookupMSB(), and setMaskBit().

395  {
396  int lutId = getLUTId(id);
397  const Lut& lut = inputLUT_.at(lutId);
398  return (lut.at(adc) & QIE8_LUT_MSB);
399 }
int adc(sample_type sample)
get the ADC sample (12 bits)
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
static const int QIE8_LUT_MSB
Definition: Lut.h:32
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::lookupMSB ( const HBHEDataFrame df,
std::vector< bool > &  msb 
) const

Definition at line 389 of file HcaluLUTTPGCoder.cc.

References HcalQIESample::adc(), getMSB(), mps_fire::i, HBHEDataFrame::id(), HBHEDataFrame::sample(), and HBHEDataFrame::size().

Referenced by HcalTriggerPrimitiveAlgo::addSignal(), and setMaskBit().

389  {
390  msb.resize(df.size());
391  for (int i=0; i<df.size(); ++i)
392  msb[i] = getMSB(df.id(), df.sample(i).adc());
393 }
int adc() const
get the ADC sample
Definition: HcalQIESample.h:22
int size() const
total number of samples in the digi
Definition: HBHEDataFrame.h:26
const HcalQIESample & sample(int i) const
access a sample
Definition: HBHEDataFrame.h:39
bool getMSB(const HcalDetId &id, int adc) const
const HcalDetId & id() const
Definition: HBHEDataFrame.h:22
void HcaluLUTTPGCoder::lookupMSB ( const QIE10DataFrame df,
std::vector< bool > &  msb 
) const

Definition at line 401 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), getLUTId(), mps_fire::i, QIE10DataFrame::id(), inputLUT_, lumiPlot::lut, QIE10_LUT_MSB, and QIE10DataFrame::samples().

401  {
402  msb.resize(df.samples());
403  int lutId = getLUTId(HcalDetId(df.id()));
404  const Lut& lut = inputLUT_.at(lutId);
405  for (int i = 0; i < df.samples(); ++i) {
406  msb[i] = lut.at(df[i].adc()) & QIE10_LUT_MSB;
407  }
408 }
int adc(sample_type sample)
get the ADC sample (12 bits)
int samples() const
total number of samples in the digi
edm::DataFrame::id_type id() const
static const int QIE10_LUT_MSB
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
Definition: Lut.h:32
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::lookupMSB ( const QIE11DataFrame df,
std::vector< std::bitset< 2 >> &  msb 
) const

Definition at line 411 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), getLUTId(), mps_fire::i, QIE11DataFrame::id(), inputLUT_, lumiPlot::lut, QIE11_LUT_MSB0, QIE11_LUT_MSB1, and QIE11DataFrame::samples().

412 {
413  int lutId = getLUTId(HcalDetId(df.id()));
414  const Lut& lut = inputLUT_.at(lutId);
415  for (int i = 0; i < df.samples(); ++i) {
416  msb[i][0] = lut.at(df[i].adc()) & QIE11_LUT_MSB0;
417  msb[i][1] = lut.at(df[i].adc()) & QIE11_LUT_MSB1;
418  }
419 }
int adc(sample_type sample)
get the ADC sample (12 bits)
static const int QIE11_LUT_MSB1
static const int QIE11_LUT_MSB0
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
edm::DataFrame::id_type id() const
int samples() const
total number of samples in the digi
Definition: Lut.h:32
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::setFGHFthreshold ( unsigned int  fgthreshold)
inline

Definition at line 51 of file HcaluLUTTPGCoder.h.

References FG_HF_threshold_.

Referenced by HcalTPGCoderULUT::buildCoder().

51 { FG_HF_threshold_ = fgthreshold; };
unsigned int FG_HF_threshold_
void HcaluLUTTPGCoder::setLUTGenerationMode ( bool  gen)
inline

Definition at line 50 of file HcaluLUTTPGCoder.h.

References relval_steps::gen(), and LUTGenerationMode_.

Referenced by HcalTPGCoderULUT::buildCoder().

50 { LUTGenerationMode_ = gen; };
def gen(fragment, howMuch)
Production test section ####.
void HcaluLUTTPGCoder::setMaskBit ( int  bit)
inline
void HcaluLUTTPGCoder::update ( const HcalDbService conditions)

Definition at line 224 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), hcaldqm::constants::adc2fC, bitToMask_, AlignmentProducer_cff::calibrations, HcalQIECoder::charge(), HcalTopology::dddConstants(), HcalTopology::etaRange(), EnergyCorrector::etas, FG_HF_threshold_, firstHFEta_, muonCSCDigis_cfi::gain, gain_, HcalCondObjectContainer< Item >::getAllChannels(), HcalTPChannelParameter::getFGBitInfo(), HcalL1TriggerObject::getFlag(), HcalDbService::getHcalCalibrations(), HcalDbService::getHcalChannelStatus(), HcalDbService::getHcalCoder(), HcalDbService::getHcalL1TriggerObject(), HcalDbService::getHcalLutMetadata(), HcalDbService::getHcalQIEType(), HcalDbService::getHcalShape(), HcalDbService::getHcalTPChannelParameter(), HcalLutMetadatum::getLutGranularity(), getLUTId(), HcalLutMetadata::getNominalGain(), HcalL1TriggerObject::getPedestal(), HcalLutMetadatum::getRCalib(), HcalL1TriggerObject::getRespGain(), HcalQIEType::getValue(), HcalChannelStatus::getValue(), HcalCondObjectContainer< Item >::getValues(), DetId::Hcal, HcalBarrel, HcalEndcap, HcalForward, mps_fire::i, HcalDetId::ietaAbs(), INPUT_LUT_SIZE, inputLUT_, HcalDDDRecConstants::isPlan1(), lastHFEta_, lsb_, lumiPlot::lut, LUTGenerationMode_, HcalCalibrations::LUTrespcorrgain(), SiStripPI::max, min(), or, ped_, HcalCalibrations::pedestal(), QIE10_LUT_BITMASK, QIE10_LUT_MSB, QIE11_LUT_BITMASK, QIE11_LUT_MSB0, QIE11_LUT_MSB1, QIE8_LUT_BITMASK, SIZE, mps_update::status, HcalDetId::subdet(), topo_, HcalTopology::triggerMode(), HcalTopologyMode::TriggerMode_2018, HcalTopologyMode::TriggerMode_2018legacy, UPGRADE_LUT_SIZE, and HcalTopology::valid().

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), Vispa.Gui.VispaWidget.VispaWidget::autosize(), HcalTPGCoderULUT::buildCoder(), Vispa.Views.LineDecayView.LineDecayContainer::createObject(), HcalTPGCoderULUT::dbRecordCallback(), Vispa.Views.LineDecayView.LineDecayContainer::deselectAllObjects(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::deselectAllWidgets(), Vispa.Gui.VispaWidget.VispaWidget::enableAutosizing(), dqm-mbProfile.Profile::finish(), progressbar.ProgressBar::finish(), Vispa.Gui.MenuWidget.MenuWidget::leaveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseMoveEvent(), Vispa.Gui.MenuWidget.MenuWidget::mouseMoveEvent(), Vispa.Views.LineDecayView.LineDecayContainer::mouseMoveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseReleaseEvent(), Vispa.Views.LineDecayView.LineDecayContainer::objectMoved(), MatrixUtil.Steps::overwrite(), Vispa.Views.LineDecayView.LineDecayContainer::removeObject(), Vispa.Gui.ConnectableWidget.ConnectableWidget::removePorts(), Vispa.Gui.FindDialog.FindDialog::reset(), Vispa.Gui.PortConnection.PointToPointConnection::select(), Vispa.Gui.VispaWidget.VispaWidget::select(), Vispa.Views.LineDecayView.LineDecayContainer::select(), Vispa.Gui.VispaWidget.VispaWidget::setText(), Vispa.Gui.VispaWidget.VispaWidget::setTitle(), Vispa.Gui.ZoomableWidget.ZoomableWidget::setZoom(), Vispa.Views.LineDecayView.LineDecayContainer::setZoom(), and Vispa.Gui.PortConnection.PointToPointConnection::updateConnection().

224  {
225 
227  const HcalLutMetadata *metadata = conditions.getHcalLutMetadata();
228  assert(metadata !=nullptr);
229  float nominalgain_ = metadata->getNominalGain();
230 
231  std::map<int, float> cosh_ieta;
232  for (int i = firstHFEta_; i <= lastHFEta_; ++i){
233  std::pair<double,double> etas = topo_->etaRange(HcalForward,i);
234  double eta1 = etas.first;
235  double eta2 = etas.second;
236  cosh_ieta[i] = cosh((eta1 + eta2)/2.);
237  }
238 
239  for (const auto& id: metadata->getAllChannels()) {
240 
241  if (not (id.det() == DetId::Hcal and topo_->valid(id))) continue;
242 
243  HcalDetId cell(id);
244  HcalSubdetector subdet = cell.subdet();
245 
246  if (subdet != HcalBarrel and subdet != HcalEndcap and subdet != HcalForward) continue;
247 
248  const HcalQIECoder* channelCoder = conditions.getHcalCoder (cell);
249  const HcalQIEShape* shape = conditions.getHcalShape(cell);
250  HcalCoderDb coder (*channelCoder, *shape);
251  const HcalLutMetadatum *meta = metadata->getValues(cell);
252 
253  unsigned int mipMax = 0;
254  unsigned int mipMin = 0;
255 
258  topo_->dddConstants()->isPlan1(cell)) {
259  const HcalTPChannelParameter *channelParameters = conditions.getHcalTPChannelParameter(cell);
260  mipMax = channelParameters->getFGBitInfo() >> 16;
261  mipMin = channelParameters->getFGBitInfo() & 0xFFFF;
262  }
263 
264  int lutId = getLUTId(cell);
265  Lut &lut=inputLUT_[lutId];
266  float ped = 0;
267  float gain = 0;
268  uint32_t status = 0;
269 
270  if (LUTGenerationMode_){
271  const HcalCalibrations& calibrations = conditions.getHcalCalibrations(cell);
272  for (auto capId : {0,1,2,3}){
273  ped += calibrations.pedestal(capId);
274  gain += calibrations.LUTrespcorrgain(capId);
275  }
276  ped /= 4.0;
277  gain /= 4.0;
278 
279  //Get Channel Quality
280  const HcalChannelStatus* channelStatus = conditions.getHcalChannelStatus(cell);
281  status = channelStatus->getValue();
282 
283  } else {
284  const HcalL1TriggerObject* myL1TObj = conditions.getHcalL1TriggerObject(cell);
285  ped = myL1TObj->getPedestal();
286  gain = myL1TObj->getRespGain();
287  status = myL1TObj->getFlag();
288  } // LUTGenerationMode_
289 
290  ped_[lutId] = ped;
291  gain_[lutId] = gain;
292  bool isMasked = ( (status & bitToMask_) > 0 );
293  float rcalib = meta->getRCalib();
294 
295  auto adc2fC = [channelCoder, shape](unsigned int adc){
296  float fC = 0;
297  for (auto capId : {0,1,2,3}) fC += channelCoder->charge(*shape, adc, capId);
298  return fC/4;
299  };
300 
301  int QIEtype =conditions.getHcalQIEType(cell)->getValue();
302 
303  const size_t SIZE = QIEtype==0 ? INPUT_LUT_SIZE : UPGRADE_LUT_SIZE;
304  const int MASK = QIEtype==0 ? QIE8_LUT_BITMASK :
305  QIEtype==1 ? QIE10_LUT_BITMASK : QIE11_LUT_BITMASK;
306 
307  lut.resize(SIZE, 0);
308 
309  // Input LUT for HB/HE/HF
310  if (subdet == HcalBarrel || subdet == HcalEndcap){
311 
312  int granularity = meta->getLutGranularity();
313 
314  for (unsigned int adc = 0; adc < SIZE; ++adc) {
315  if (isMasked) lut[adc] = 0;
316  else {
317  lut[adc] = (LutElement) std::min(std::max(0, int((adc2fC(adc) - ped) * gain * rcalib / nominalgain_ / granularity)), MASK);
318  if(QIEtype==2){
319  if (adc >= mipMin and adc < mipMax) lut[adc] |= QIE11_LUT_MSB0;
320  else if (adc >= mipMax) lut[adc] |= QIE11_LUT_MSB1;
321  }
322  }
323  }
324  }
325  else if (subdet == HcalForward){
326  for (unsigned int adc = 0; adc < SIZE; ++adc) {
327  if (isMasked) lut[adc] = 0;
328  else {
329  lut[adc] = std::min(std::max(0,int((adc2fC(adc) - ped) * gain * rcalib / lsb_ / cosh_ieta[cell.ietaAbs()] )), MASK);
331  }
332  }
333  }
334  }
335 }
int adc(sample_type sample)
get the ADC sample (12 bits)
uint32_t getFlag() const
float getPedestal() const
const HcalDDDRecConstants * dddConstants() const
Definition: HcalTopology.h:161
int getValue() const
Definition: HcalQIEType.h:20
const HcalTPChannelParameter * getHcalTPChannelParameter(const HcalGenericDetId &fId) const
bool valid(const DetId &id) const override
static const int QIE11_LUT_MSB1
static const int QIE11_LUT_BITMASK
const HcalChannelStatus * getHcalChannelStatus(const HcalGenericDetId &fId) const
const HcalTopology * topo_
static const int QIE11_LUT_MSB0
static const float lsb_
double pedestal(int fCapId) const
get pedestal for capid=0..3
const Item * getValues(DetId fId, bool throwOnFail=true) const
static const int QIE8_LUT_BITMASK
uint8_t getLutGranularity() const
HcalTopologyMode::TriggerMode triggerMode() const
Definition: HcalTopology.h:32
unsigned short LutElement
static const int QIE10_LUT_MSB
static const size_t UPGRADE_LUT_SIZE
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
float getRespGain() const
std::vector< DetId > getAllChannels() const
float getNominalGain() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
float getRCalib() const
const HcalL1TriggerObject * getHcalL1TriggerObject(const HcalGenericDetId &fId) const
HcalSubdetector
Definition: HcalAssistant.h:31
const HcalLutMetadata * getHcalLutMetadata() const
unsigned int FG_HF_threshold_
T min(T a, T b)
Definition: MathUtil.h:58
static const int QIE10_LUT_BITMASK
const HcalQIEType * getHcalQIEType(const HcalGenericDetId &fId) const
double const adc2fC[256]
Definition: Constants.h:272
double LUTrespcorrgain(int fCapId) const
get LUT corrected and response corrected gain for capid=0..3
std::vector< float > ped_
std::vector< float > gain_
const HcalQIECoder * getHcalCoder(const HcalGenericDetId &fId) const
const HcalQIEShape * getHcalShape(const HcalGenericDetId &fId) const
static const size_t INPUT_LUT_SIZE
std::pair< double, double > etaRange(HcalSubdetector subdet, int ieta) const
uint32_t getFGBitInfo() const
get FG bit information
bool isPlan1(const HcalDetId &id) const
uint32_t getValue() const
const HcalCalibrations & getHcalCalibrations(const HcalGenericDetId &fId) const
Definition: Lut.h:32
std::vector< Lut > inputLUT_
float charge(const HcalQIEShape &fShape, unsigned fAdc, unsigned fCapId) const
ADC [0..127] + capid [0..3] -> fC conversion.
Definition: HcalQIECoder.cc:22
void HcaluLUTTPGCoder::update ( const char *  filename,
bool  appendMSB = false 
)

Definition at line 94 of file HcaluLUTTPGCoder.cc.

References ecalMGPA::adc(), edmScanValgrind::buffer, particleFlowClusterECALTimeSelected_cfi::depth, FrontierConditions_GlobalTag_cff::file, getLUTId(), HcalBarrel, HcalEndcap, HcalForward, mps_fire::i, triggerObjects_cff::id, recoMuon::in, diffTreeTool::index, INPUT_LUT_SIZE, inputLUT_, QIE8_LUT_BITMASK, QIE8_LUT_MSB, findQualityFiles::size, AlCaHLTBitMon_QueryRunRegistry::string, topo_, and HcalTopology::valid().

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), Vispa.Gui.VispaWidget.VispaWidget::autosize(), Vispa.Views.LineDecayView.LineDecayContainer::createObject(), Vispa.Views.LineDecayView.LineDecayContainer::deselectAllObjects(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::deselectAllWidgets(), Vispa.Gui.VispaWidget.VispaWidget::enableAutosizing(), dqm-mbProfile.Profile::finish(), progressbar.ProgressBar::finish(), Vispa.Gui.MenuWidget.MenuWidget::leaveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseMoveEvent(), Vispa.Gui.MenuWidget.MenuWidget::mouseMoveEvent(), Vispa.Views.LineDecayView.LineDecayContainer::mouseMoveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseReleaseEvent(), Vispa.Views.LineDecayView.LineDecayContainer::objectMoved(), MatrixUtil.Steps::overwrite(), Vispa.Views.LineDecayView.LineDecayContainer::removeObject(), Vispa.Gui.ConnectableWidget.ConnectableWidget::removePorts(), Vispa.Gui.FindDialog.FindDialog::reset(), Vispa.Gui.PortConnection.PointToPointConnection::select(), Vispa.Gui.VispaWidget.VispaWidget::select(), Vispa.Views.LineDecayView.LineDecayContainer::select(), Vispa.Gui.VispaWidget.VispaWidget::setText(), Vispa.Gui.VispaWidget.VispaWidget::setTitle(), Vispa.Gui.ZoomableWidget.ZoomableWidget::setZoom(), Vispa.Views.LineDecayView.LineDecayContainer::setZoom(), and Vispa.Gui.PortConnection.PointToPointConnection::updateConnection().

94  {
95 
96  std::ifstream file(filename, std::ios::in);
97  assert(file.is_open());
98 
99  std::vector<HcalSubdetector> subdet;
101 
102  // Drop first (comment) line
103  std::getline(file, buffer);
104  std::getline(file, buffer);
105 
106  unsigned int index = buffer.find("H", 0);
107  while (index < buffer.length()){
108  std::string subdetStr = buffer.substr(index, 2);
109  if (subdetStr == "HB") subdet.push_back(HcalBarrel);
110  else if (subdetStr == "HE") subdet.push_back(HcalEndcap);
111  else if (subdetStr == "HF") subdet.push_back(HcalForward);
112  //TODO Check subdet
113  //else exception
114  index += 2;
115  index = buffer.find("H", index);
116  }
117 
118  // Get upper/lower ranges for ieta/iphi/depth
119  size_t nCol = subdet.size();
120  assert(nCol > 0);
121 
122  std::vector<int> ietaU;
123  std::vector<int> ietaL;
124  std::vector<int> iphiU;
125  std::vector<int> iphiL;
126  std::vector<int> depU;
127  std::vector<int> depL;
128  std::vector< Lut > lutFromFile(nCol);
129  LutElement lutValue;
130 
131  for (size_t i=0; i<nCol; ++i) {
132  int ieta;
133  file >> ieta;
134  ietaL.push_back(ieta);
135  }
136 
137  for (size_t i=0; i<nCol; ++i) {
138  int ieta;
139  file >> ieta;
140  ietaU.push_back(ieta);
141  }
142 
143  for (size_t i=0; i<nCol; ++i) {
144  int iphi;
145  file >> iphi;
146  iphiL.push_back(iphi);
147  }
148 
149  for (size_t i=0; i<nCol; ++i) {
150  int iphi;
151  file >> iphi;
152  iphiU.push_back(iphi);
153  }
154 
155  for (size_t i=0; i<nCol; ++i) {
156  int dep;
157  file >> dep;
158  depL.push_back(dep);
159  }
160 
161  for (size_t i=0; i<nCol; ++i) {
162  int dep;
163  file >> dep;
164  depU.push_back(dep);
165  }
166 
167  // Read Lut Entry
168  for (size_t i=0; file >> lutValue; i = (i+1) % nCol){
169  lutFromFile[i].push_back(lutValue);
170  }
171 
172  // Check lut size
173  for (size_t i=0; i<nCol; ++i) assert(lutFromFile[i].size() == INPUT_LUT_SIZE);
174 
175  for (size_t i=0; i<nCol; ++i){
176  for (int ieta = ietaL[i]; ieta <= ietaU[i]; ++ieta){
177  for (int iphi = iphiL[i]; iphi <= iphiU[i]; ++iphi){
178  for (int depth = depL[i]; depth <= depU[i]; ++depth){
179 
180  HcalDetId id(subdet[i], ieta, iphi, depth);
181  if (!topo_->valid(id)) continue;
182 
183  int lutId = getLUTId(id);
184  for (size_t adc = 0; adc < INPUT_LUT_SIZE; ++adc){
185  if (appendMSB){
186  // Append FG bit LUT to MSB
187  // MSB = Most Significant Bit = bit 10
188  // Overwrite bit 10
189  LutElement msb = (lutFromFile[i][adc] != 0 ? QIE8_LUT_MSB : 0);
190  inputLUT_[lutId][adc] = (msb | (inputLUT_[lutId][adc] & QIE8_LUT_BITMASK));
191  }
192  else inputLUT_[lutId][adc] = lutFromFile[i][adc];
193  }// for adc
194  }// for depth
195  }// for iphi
196  }// for ieta
197  }// for nCol
198 }
int adc(sample_type sample)
get the ADC sample (12 bits)
size
Write out results.
bool valid(const DetId &id) const override
const HcalTopology * topo_
static const int QIE8_LUT_BITMASK
unsigned short LutElement
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
static const int QIE8_LUT_MSB
static const size_t INPUT_LUT_SIZE
std::vector< Lut > inputLUT_
void HcaluLUTTPGCoder::updateXML ( const char *  filename)

Definition at line 200 of file HcaluLUTTPGCoder.cc.

References LutXml::create_lut_map(), particleFlowClusterECALTimeSelected_cfi::depth, Exception, XMLProcessor::getInstance(), LutXml::getLutFast(), getLUTId(), HcalBarrel, HcalEndcap, HcalForward, mps_fire::i, INPUT_LUT_SIZE, inputLUT_, HcalDetId::kHcalDepthMask2, HcalDetId::kHcalEtaMask2, HcalDetId::kHcalPhiMask2, lumiPlot::lut, XMLProcessor::terminate(), topo_, and HcalTopology::valid().

Referenced by HcalTPGCoderULUT::buildCoder().

200  {
201  LutXml * _xml = new LutXml(filename);
202  _xml->create_lut_map();
204  for (int ieta = -HcalDetId::kHcalEtaMask2;
205  ieta <= HcalDetId::kHcalEtaMask2; ++ieta) {
206  for (int iphi = 0; iphi <= HcalDetId::kHcalPhiMask2; ++iphi) {
207  for (int depth = 1; depth < HcalDetId::kHcalDepthMask2; ++depth) {
208  for (int isub=0; isub<3; ++isub) {
209  HcalDetId detid(subdet[isub], ieta, iphi, depth);
210  if (!topo_->valid(detid)) continue;
211  int id = getLUTId(subdet[isub], ieta, iphi, depth);
212  std::vector<unsigned int>* lut = _xml->getLutFast(detid);
213  if (lut==nullptr) throw cms::Exception("PROBLEM: No inputLUT_ in xml file for ") << detid << std::endl;
214  if (lut->size()!=INPUT_LUT_SIZE) throw cms::Exception ("PROBLEM: Wrong inputLUT_ size in xml file for ") << detid << std::endl;
215  for (unsigned int i=0; i<INPUT_LUT_SIZE; ++i) inputLUT_[id][i] = (LutElement)lut->at(i);
216  }
217  }
218  }
219  }
220  delete _xml;
222 }
Definition: LutXml.h:27
bool valid(const DetId &id) const override
int create_lut_map(void)
Definition: LutXml.cc:375
const HcalTopology * topo_
unsigned short LutElement
static const int kHcalDepthMask2
Definition: HcalDetId.h:26
int getLUTId(HcalSubdetector id, int ieta, int iphi, int depth) const
int terminate(void)
HcalSubdetector
Definition: HcalAssistant.h:31
static const int kHcalPhiMask2
Definition: HcalDetId.h:16
std::vector< unsigned int > * getLutFast(uint32_t det_id)
Definition: LutXml.cc:88
static const size_t INPUT_LUT_SIZE
static const int kHcalEtaMask2
Definition: HcalDetId.h:20
static XMLProcessor * getInstance()
Definition: XMLProcessor.h:145
std::vector< Lut > inputLUT_

Member Data Documentation

int HcaluLUTTPGCoder::bitToMask_
private

Definition at line 84 of file HcaluLUTTPGCoder.h.

Referenced by setMaskBit(), and update().

unsigned int HcaluLUTTPGCoder::FG_HF_threshold_
private

Definition at line 83 of file HcaluLUTTPGCoder.h.

Referenced by setFGHFthreshold(), and update().

int HcaluLUTTPGCoder::firstHBEta_
private

Definition at line 85 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::firstHEEta_
private

Definition at line 86 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::firstHFEta_
private

Definition at line 87 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), HcaluLUTTPGCoder(), and update().

std::vector<float> HcaluLUTTPGCoder::gain_
private

Definition at line 89 of file HcaluLUTTPGCoder.h.

Referenced by getLUTGain(), HcaluLUTTPGCoder(), and update().

const size_t HcaluLUTTPGCoder::INPUT_LUT_SIZE = 128
staticprivate

Definition at line 71 of file HcaluLUTTPGCoder.h.

Referenced by update(), and updateXML().

std::vector< Lut > HcaluLUTTPGCoder::inputLUT_
private
int HcaluLUTTPGCoder::lastHBEta_
private

Definition at line 85 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::lastHEEta_
private

Definition at line 86 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::lastHFEta_
private

Definition at line 87 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), HcaluLUTTPGCoder(), and update().

const float HcaluLUTTPGCoder::lsb_ =1./16
static

Definition at line 33 of file HcaluLUTTPGCoder.h.

Referenced by CaloTPGTranscoderULUT::setup(), and update().

bool HcaluLUTTPGCoder::LUTGenerationMode_
private

Definition at line 82 of file HcaluLUTTPGCoder.h.

Referenced by setLUTGenerationMode(), and update().

int HcaluLUTTPGCoder::maxDepthHB_
private

Definition at line 85 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::maxDepthHE_
private

Definition at line 86 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::maxDepthHF_
private

Definition at line 87 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

const int HcaluLUTTPGCoder::nFi_ = 72
staticprivate

Definition at line 73 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::nHBEta_
private

Definition at line 85 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::nHEEta_
private

Definition at line 86 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::nHFEta_
private

Definition at line 87 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

std::vector<float> HcaluLUTTPGCoder::ped_
private

Definition at line 90 of file HcaluLUTTPGCoder.h.

Referenced by getLUTPedestal(), HcaluLUTTPGCoder(), and update().

const int HcaluLUTTPGCoder::QIE10_LUT_BITMASK = 0x7FF
static

Definition at line 62 of file HcaluLUTTPGCoder.h.

Referenced by adc2Linear(), and update().

const int HcaluLUTTPGCoder::QIE10_LUT_MSB = 0x1000
staticprivate

Definition at line 78 of file HcaluLUTTPGCoder.h.

Referenced by lookupMSB(), and update().

const int HcaluLUTTPGCoder::QIE11_LUT_BITMASK = 0x3FF
static

Definition at line 63 of file HcaluLUTTPGCoder.h.

Referenced by adc2Linear(), and update().

const int HcaluLUTTPGCoder::QIE11_LUT_MSB0 = 0x400
staticprivate

Definition at line 76 of file HcaluLUTTPGCoder.h.

Referenced by lookupMSB(), and update().

const int HcaluLUTTPGCoder::QIE11_LUT_MSB1 = 0x800
staticprivate

Definition at line 77 of file HcaluLUTTPGCoder.h.

Referenced by lookupMSB(), and update().

const int HcaluLUTTPGCoder::QIE8_LUT_BITMASK = 0x3FF
static

Definition at line 61 of file HcaluLUTTPGCoder.h.

Referenced by adc2Linear(), and update().

const int HcaluLUTTPGCoder::QIE8_LUT_MSB = 0x400
staticprivate

Definition at line 75 of file HcaluLUTTPGCoder.h.

Referenced by getMSB(), and update().

int HcaluLUTTPGCoder::sizeHB_
private

Definition at line 85 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::sizeHE_
private

Definition at line 86 of file HcaluLUTTPGCoder.h.

Referenced by getLUTId(), and HcaluLUTTPGCoder().

int HcaluLUTTPGCoder::sizeHF_
private

Definition at line 87 of file HcaluLUTTPGCoder.h.

Referenced by HcaluLUTTPGCoder().

const HcalTopology* HcaluLUTTPGCoder::topo_
private

Definition at line 81 of file HcaluLUTTPGCoder.h.

Referenced by HcaluLUTTPGCoder(), update(), and updateXML().

const size_t HcaluLUTTPGCoder::UPGRADE_LUT_SIZE = 256
staticprivate

Definition at line 72 of file HcaluLUTTPGCoder.h.

Referenced by update().