CMS 3D CMS Logo

L1GctGlobalHfSumAlgos.cc
Go to the documentation of this file.
2 
4 
8 
10 
11 L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos(const std::vector<L1GctWheelJetFpga*>& wheelJetFpga)
12  : L1GctProcessor(),
13  m_plusWheelJetFpga(wheelJetFpga.at(1)),
14  m_minusWheelJetFpga(wheelJetFpga.at(0)),
15  m_bitCountLuts(),
16  m_etSumLuts(),
17  m_hfInputSumsPlusWheel(),
18  m_hfInputSumsMinusWheel(),
19  m_hfOutputSumsPipe(),
20  m_setupOk(true) {
21  if (wheelJetFpga.size() != 2) {
22  m_setupOk = false;
23  if (m_verbose) {
24  edm::LogWarning("L1GctSetupError")
25  << "L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos() : Global HfSum Algos has been incorrectly constructed!\n"
26  << "This class needs two wheel jet fpga pointers. "
27  << "Number of wheel jet fpga pointers present is " << wheelJetFpga.size() << ".\n";
28  }
29  }
30 
31  if (m_plusWheelJetFpga == nullptr) {
32  m_setupOk = false;
33  if (m_verbose) {
34  edm::LogWarning("L1GctSetupError")
35  << "L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos() has been incorrectly constructed!\n"
36  << "Plus Wheel Jet Fpga pointer has not been set!\n";
37  }
38  }
39  if (m_minusWheelJetFpga == nullptr) {
40  m_setupOk = false;
41  if (m_verbose) {
42  edm::LogWarning("L1GctSetupError")
43  << "L1GctGlobalHfSumAlgos::L1GctGlobalHfSumAlgos() has been incorrectly constructed!\n"
44  << "Minus Wheel Jet Fpga pointer has not been set!\n";
45  }
46  }
47 
48  if (!m_setupOk && m_verbose) {
49  edm::LogError("L1GctSetupError") << "L1GctGlobalEnergyAlgos has been incorrectly constructed";
50  }
51 }
52 
54  std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut*>::const_iterator bclut = m_bitCountLuts.begin();
55  while (bclut != m_bitCountLuts.end()) {
56  delete bclut->second;
57  bclut++;
58  }
59  std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut*>::const_iterator eslut = m_etSumLuts.begin();
60  while (eslut != m_etSumLuts.end()) {
61  delete eslut->second;
62  eslut++;
63  }
64 }
65 
66 std::ostream& operator<<(std::ostream& os, const L1GctGlobalHfSumAlgos& fpga) {
67  os << "===L1GctGlobalHfSumAlgos===" << std::endl;
68  os << "WheelJetFpga* plus = " << fpga.m_plusWheelJetFpga << std::endl;
69  os << "Plus wheel inputs:" << std::endl;
70  os << "Bit counts ring 1: " << fpga.m_hfInputSumsPlusWheel.nOverThreshold0
71  << ", ring 2: " << fpga.m_hfInputSumsPlusWheel.nOverThreshold1 << std::endl;
72  os << "Et sums ring 1: " << fpga.m_hfInputSumsPlusWheel.etSum0 << ", ring 2: " << fpga.m_hfInputSumsPlusWheel.etSum1
73  << std::endl;
74  os << "WheelJetFpga* minus = " << fpga.m_minusWheelJetFpga << std::endl;
75  os << "Minus wheel inputs:" << std::endl;
76  os << "Bit counts ring 1: " << fpga.m_hfInputSumsMinusWheel.nOverThreshold0
77  << ", ring 2: " << fpga.m_hfInputSumsMinusWheel.nOverThreshold1 << std::endl;
78  os << "Et sums ring 1: " << fpga.m_hfInputSumsMinusWheel.etSum0 << ", ring 2: " << fpga.m_hfInputSumsMinusWheel.etSum1
79  << std::endl;
80 
81  int bxZero = -fpga.bxMin();
82  if (bxZero >= 0 && bxZero < fpga.numOfBx()) {
83  os << "Output word " << std::hex << fpga.hfSumsWord().at(bxZero) << std::dec << std::endl;
84  }
85 
86  return os;
87 }
88 
92 }
93 
95  m_hfOutputSumsPipe.clear();
97  // Make one copy of the empty pipeline for each type of Hf lut
98  unsigned nTypes = (unsigned)L1GctHfEtSumsLut::numberOfLutTypes;
99  for (unsigned t = 0; t < nTypes; ++t) {
101  }
102 }
103 
105  if (m_setupOk) {
108  }
109 }
110 
111 // process the event
113  if (m_setupOk) {
114  // step through the different types of Hf summed quantity
115  // and store each one in turn into the relevant pipeline
116 
117  // bit count, positive eta, ring 1
119 
120  // bit count, negative eta, ring 1
122 
123  // bit count, positive eta, ring 2
125 
126  // bit count, negative eta, ring 2
128 
129  // et sum, positive eta, ring 1
131 
132  // et sum, negative eta, ring 1
134 
135  // et sum, positive eta, ring 2
137 
138  // et sum, negative eta, ring 2
140  }
141 }
142 
143 // Convert bit count value using LUT and store in the pipeline
145  std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut*>::const_iterator bclut = m_bitCountLuts.find(type);
146  if (bclut != m_bitCountLuts.end()) {
147  m_hfOutputSumsPipe[type].store((*bclut->second)[value], bxRel());
148  }
149 }
150 
151 // Convert et sum value using LUT and store in the pipeline
153  std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut*>::const_iterator eslut = m_etSumLuts.find(type);
154  if (eslut != m_etSumLuts.end()) {
155  m_hfOutputSumsPipe[type].store((*eslut->second)[value], bxRel());
156  }
157 }
158 
161  std::vector<uint16_t> result(numOfBx());
162  std::map<L1GctHfEtSumsLut::hfLutType, Pipeline<uint16_t> >::const_iterator lut = m_hfOutputSumsPipe.find(type);
163  if (lut != m_hfOutputSumsPipe.end()) {
164  result = (lut->second).contents;
165  }
166 
167  return result;
168 }
169 
170 std::vector<unsigned> L1GctGlobalHfSumAlgos::hfSumsWord() const {
171  std::vector<unsigned> result(numOfBx(), 0x00001000);
172  std::vector<uint16_t> outputBits;
173 
175  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
176  result.at(bx) |= outputBits.at(bx);
177  }
178 
180  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
181  result.at(bx) |= outputBits.at(bx) << 3;
182  }
183 
185  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
186  result.at(bx) |= outputBits.at(bx) << 6;
187  }
188 
190  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
191  result.at(bx) |= outputBits.at(bx) << 9;
192  }
193 
195  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
196  result.at(bx) |= outputBits.at(bx) << 12;
197  }
198 
200  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
201  result.at(bx) |= outputBits.at(bx) << 16;
202  }
203 
205  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
206  result.at(bx) |= outputBits.at(bx) << 19;
207  }
208 
210  for (unsigned bx = 0; bx < outputBits.size(); bx++) {
211  result.at(bx) |= outputBits.at(bx) << 22;
212  }
213 
214  return result;
215 }
216 
219  // Replaces existing list of luts with a new one
220  while (!m_bitCountLuts.empty()) {
221  delete m_bitCountLuts.begin()->second;
222  m_bitCountLuts.erase(m_bitCountLuts.begin());
223  }
232 
233  while (!m_etSumLuts.empty()) {
234  delete m_etSumLuts.begin()->second;
235  m_etSumLuts.erase(m_etSumLuts.begin());
236  }
241 }
242 
245  std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut*>::const_iterator bclut = m_bitCountLuts.find(type);
246  if (bclut != m_bitCountLuts.end()) {
247  return (bclut->second);
248  } else {
249  return nullptr;
250  }
251 }
252 
254  std::map<L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut*>::const_iterator eslut = m_etSumLuts.find(type);
255  if (eslut != m_etSumLuts.end()) {
256  return (eslut->second);
257  } else {
258  return nullptr;
259  }
260 }
261 
264  std::vector<double> result;
265  const L1GctHfEtSumsLut* ESLut = getESLut(type);
266  if (ESLut != nullptr) {
267  result = ESLut->lutFunction()->getThresholds();
268  }
269  return result;
270 }
int numOfBx() const
L1GctWheelJetFpga * m_minusWheelJetFpga
void process() override
process the data, fill output buffers
const std::vector< double > & getThresholds() const
get thresholds
Definition: L1CaloEtScale.h:66
void fetchInput() override
get input data from sources; this is the standard way to provide input
L1GctJetCount< kHfCountBits > nOverThreshold1
std::map< L1GctHfEtSumsLut::hfLutType, Pipeline< uint16_t > > m_hfOutputSumsPipe
Emulates the GCT summing and packing of Hf Et sums and tower-over-threshold counts.
unsigned value() const
access value as unsigned
bool m_verbose
Flag to control output messages.
hfTowerSumsType m_hfInputSumsPlusWheel
L1GctJetCount< kHfEtSumBits > etSum1
Log< level::Error, false > LogError
int bxRel() const
const L1GctHfBitCountsLut * getBCLut(const L1GctHfEtSumsLut::hfLutType type) const
Get lut pointers.
std::vector< uint16_t > hfSumsOutput(const L1GctHfEtSumsLut::hfLutType type) const
Access to output quantities.
hfTowerSumsType m_hfInputSumsMinusWheel
void resetProcessor() override
Separate reset methods for the processor itself and any data stored in pipelines. ...
ABC for a GCT trigger data processing unit.
std::map< L1GctHfEtSumsLut::hfLutType, const L1GctHfEtSumsLut * > m_etSumLuts
int bxMin() const
Support for multiple beam crossing operation.
~L1GctGlobalHfSumAlgos() override
Destructor.
L1GctWheelJetFpga * m_plusWheelJetFpga
LUT for compression of HF feature bit counts to output format.
void storeEtSum(L1GctHfEtSumsLut::hfLutType type, uint16_t value)
std::vector< double > getThresholds(const L1GctHfEtSumsLut::hfLutType type) const
Get thresholds.
LUT for compression of HF Et sum to output format.
L1GctJetCount< kHfCountBits > nOverThreshold0
Definition: value.py:1
std::map< L1GctHfEtSumsLut::hfLutType, const L1GctHfBitCountsLut * > m_bitCountLuts
const L1CaloEtScale * lutFunction() const
Return the Lut function.
std::vector< unsigned > hfSumsWord() const
hfTowerSumsType getOutputHfSums() const
get the output Hf Sums
L1GctJetCount< kHfEtSumBits > etSum0
const L1GctHfEtSumsLut * getESLut(const L1GctHfEtSumsLut::hfLutType type) const
L1GctGlobalHfSumAlgos(const std::vector< L1GctWheelJetFpga *> &WheelJetFpga)
Constructor needs the Wheel card Fpgas set up first.
std::ostream & operator<<(std::ostream &os, const L1GctGlobalHfSumAlgos &fpga)
void setupLuts(const L1CaloEtScale *scale)
Setup luts.
Log< level::Warning, false > LogWarning
void storeBitCount(L1GctHfEtSumsLut::hfLutType type, uint16_t value)