CMS 3D CMS Logo

LutXml.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: CaloOnlineTools/HcalOnlineDb
4 // Class : LutXml
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Gena Kukartsev, kukarzev@fnal.gov
10 // Created: Tue Mar 18 14:30:20 CDT 2008
11 //
12 
13 #include <iostream>
14 #include <string>
15 #include <vector>
16 #include <sstream>
17 #include <iconv.h>
18 #include <sys/time.h>
19 
22 #include "md5.h"
27 
28 using namespace std;
30 
32  infotype = "LUT";
33  ieta = -1000;
34  iphi = -1000;
35  depth = -1;
36  crate = -1;
37  slot = -1;
38  topbottom = -1;
39  fiber = -1;
40  fiberchan = -1;
41  lut_type = -1;
42  creationtag = "default_tag";
43 
44  char timebuf[50];
45  time_t _time = time(nullptr);
46  strftime(timebuf, 50, "%Y-%m-%d %H:%M:%S", gmtime(&_time));
47  creationstamp = timebuf;
48 
49  formatrevision = "default_revision";
50  targetfirmware = "default_revision";
51  generalizedindex = -1;
52  weight = -1;
53  // Default to keeping veto disabled
54  codedvetothreshold = 0;
55 }
56 
57 LutXml::LutXml() : XMLDOMBlock("CFGBrickSet", 1) { init(); }
58 
59 LutXml::LutXml(InputSource &_source) : XMLDOMBlock(_source) { init(); }
60 
62 
66 }
67 
68 void LutXml::init(void) {
69  root = XMLString::transcode("CFGBrickSet");
70  brick = XMLString::transcode("CFGBrick");
71  brickElem = nullptr;
72 }
73 
74 std::vector<unsigned int> *LutXml::getLutFast(uint32_t det_id) {
75  if (lut_map.find(det_id) != lut_map.end())
76  return &(lut_map)[det_id];
77  edm::LogError("LutXml") << "LUT not found, null pointer is returned";
78  return nullptr;
79 }
80 
81 // checksums_xml is 0 by default
82 void LutXml::addLut(LutXml::Config &_config, XMLDOMBlock *checksums_xml) {
83  DOMElement *rootElem = document->getDocumentElement();
84 
85  brickElem = document->createElement(XMLProcessor::_toXMLCh("CFGBrick"));
86  rootElem->appendChild(brickElem);
87 
88  addParameter("INFOTYPE", "string", _config.infotype);
89  addParameter("CREATIONTAG", "string", _config.creationtag);
90  addParameter("CREATIONSTAMP", "string", _config.creationstamp);
91  addParameter("FORMATREVISION", "string", _config.formatrevision);
92  addParameter("TARGETFIRMWARE", "string", _config.targetfirmware);
93  addParameter("GENERALIZEDINDEX", "int", _config.generalizedindex);
94  addParameter("CRATE", "int", _config.crate);
95  addParameter("SLOT", "int", _config.slot);
96 
97  if (checksums_xml) {
98  addParameter("CHECKSUM", "string", get_checksum(_config.lut));
99  }
100 
101  if (_config.lut_type == 1) { // linearizer LUT
102  addParameter("IETA", "int", _config.ieta);
103  addParameter("IPHI", "int", _config.iphi);
104  addParameter("TOPBOTTOM", "int", _config.topbottom);
105  addParameter("LUT_TYPE", "int", _config.lut_type);
106  addParameter("FIBER", "int", _config.fiber);
107  addParameter("FIBERCHAN", "int", _config.fiberchan);
108  addParameter("DEPTH", "int", _config.depth);
109  addData(to_string(_config.lut.size()), "hex", _config.lut);
110  } else if (_config.lut_type == 2 || _config.lut_type == 4) { // compression LUT or HE feature bit LUT
111  addParameter("IETA", "int", _config.ieta);
112  addParameter("IPHI", "int", _config.iphi);
113  addParameter("TOPBOTTOM", "int", _config.topbottom);
114  addParameter("LUT_TYPE", "int", _config.lut_type);
115  addParameter("SLB", "int", _config.fiber);
116  addParameter("SLBCHAN", "int", _config.fiberchan);
117  addParameter("WEIGHT", "int", _config.weight);
118  // Special coded veto threshold value of zero disables vetoing in PFA1'
119  if (_config.codedvetothreshold > 0) {
120  // A valid coded value here is in the range (1, 2048) inclusive
121  if (_config.codedvetothreshold <= 2048) {
122  // The coded value of 2048 means to do vetoing with no threshold
123  int actualvetothreshold = _config.codedvetothreshold == 2048 ? 0 : _config.codedvetothreshold;
124  addParameter("PREFIRE_VETO_THRESHOLD", "int", actualvetothreshold);
125  } else {
126  edm::LogWarning("LutXml") << "Positive veto threshold of " << _config.codedvetothreshold
127  << " is not in range (1, 2048) ! Vetoing will not be done in PFA1' !";
128  }
129  }
130  addData(to_string(_config.lut.size()), "hex", _config.lut);
131  } else if (_config.lut_type == 5) { // channel masks
132  addParameter("MASK_TYPE", "string", "TRIGGERCHANMASK");
133  addData(to_string(_config.mask.size()), "hex", _config.mask);
134  } else if (_config.lut_type == 6) { // adc threshold for tdc mask
135  addParameter("THRESH_TYPE", "string", "TRIGINTIME");
136  addData(to_string(_config.mask.size()), "hex", _config.mask);
137  } else if (_config.lut_type == 7) { // tdc mask
138  addParameter("TDCMAP_TYPE", "string", "TRIGINTIME");
139  addData(to_string(_config.mask.size()), "hex", _config.mask);
140  } else {
141  edm::LogError("LutXml") << "Unknown LUT type...produced XML will be incorrect";
142  }
143 
144  if (checksums_xml) {
145  add_checksum(checksums_xml->getDocument(), _config);
146  }
147 }
148 
149 template <typename T>
150 DOMElement *LutXml::addData(std::string _elements, std::string _encoding, const T &_lut) {
151  DOMElement *child = document->createElement(XMLProcessor::_toXMLCh("Data"));
152  child->setAttribute(XMLProcessor::_toXMLCh("elements"), XMLProcessor::_toXMLCh(_elements));
153  child->setAttribute(XMLProcessor::_toXMLCh("encoding"), XMLProcessor::_toXMLCh(_encoding));
154 
155  std::stringstream buf;
156 
157  for (const auto &iter : _lut) {
158  char buf2[16];
159  sprintf(buf2, "%lx", uint64_t(iter));
160  buf << buf2 << " ";
161  }
162 
163  std::string _value = buf.str();
164 
165  DOMText *data_value = document->createTextNode(XMLProcessor::_toXMLCh(_value));
166  child->appendChild(data_value);
167 
168  brickElem->appendChild(child);
169 
170  return child;
171 }
172 
173 DOMElement *LutXml::add_checksum(DOMDocument *parent, Config &config) {
174  DOMElement *child = parent->createElement(XMLProcessor::_toXMLCh("Data"));
175  child->setAttribute(XMLProcessor::_toXMLCh("crate"), XMLProcessor::_toXMLCh(config.crate));
176  child->setAttribute(XMLProcessor::_toXMLCh("slot"), XMLProcessor::_toXMLCh(config.slot));
177  child->setAttribute(XMLProcessor::_toXMLCh("fpga"), XMLProcessor::_toXMLCh(config.topbottom));
178  child->setAttribute(XMLProcessor::_toXMLCh("fiber"), XMLProcessor::_toXMLCh(config.fiber));
179  child->setAttribute(XMLProcessor::_toXMLCh("fiberchan"), XMLProcessor::_toXMLCh(config.fiberchan));
180  child->setAttribute(XMLProcessor::_toXMLCh("luttype"), XMLProcessor::_toXMLCh(config.lut_type));
181  child->setAttribute(XMLProcessor::_toXMLCh("elements"), XMLProcessor::_toXMLCh("1"));
182  child->setAttribute(XMLProcessor::_toXMLCh("encoding"), XMLProcessor::_toXMLCh("hex"));
183  DOMText *checksum_value = parent->createTextNode(XMLProcessor::_toXMLCh(get_checksum(config.lut)));
184  child->appendChild(checksum_value);
185 
186  parent->getDocumentElement()->appendChild(child);
187 
188  return child;
189 }
190 
191 DOMElement *LutXml::addParameter(std::string _name, std::string _type, std::string _value) {
192  DOMElement *child = document->createElement(XMLProcessor::_toXMLCh("Parameter"));
193  child->setAttribute(XMLProcessor::_toXMLCh("name"), XMLProcessor::_toXMLCh(_name));
194  child->setAttribute(XMLProcessor::_toXMLCh("type"), XMLProcessor::_toXMLCh(_type));
195  DOMText *parameter_value = document->createTextNode(XMLProcessor::_toXMLCh(_value));
196  child->appendChild(parameter_value);
197 
198  brickElem->appendChild(child);
199 
200  return child;
201 }
202 
203 DOMElement *LutXml::addParameter(std::string _name, std::string _type, int _value) {
204  char buf[128];
205  sprintf(buf, "%d", _value);
206  std::string str_value = buf;
207  return addParameter(_name, _type, str_value);
208 }
209 
211 
212 // do MD5 checksum
213 std::string LutXml::get_checksum(std::vector<unsigned int> &lut) {
214  std::stringstream result;
215  md5_state_t md5er;
216  md5_byte_t digest[16];
217  md5_init(&md5er);
218  // linearizer LUT:
219  if (lut.size() == 128) {
220  unsigned char tool[2];
221  for (int i = 0; i < 128; i++) {
222  tool[0] = lut[i] & 0xFF;
223  tool[1] = (lut[i] >> 8) & 0xFF;
224  md5_append(&md5er, tool, 2);
225  }
226  } else if (lut.size() == 256) {
227  unsigned char tool[2];
228  for (int i = 0; i < 256; i++) {
229  tool[0] = lut[i] & 0xFF;
230  tool[1] = (lut[i] >> 8) & 0xFF;
231  md5_append(&md5er, tool, 2);
232  }
233  }
234  // compression LUT:
235  else if (lut.size() == 1024) {
236  unsigned char tool;
237  for (int i = 0; i < 1024; i++) {
238  tool = lut[i] & 0xFF;
239  md5_append(&md5er, &tool, 1);
240  }
241  } else if (lut.size() == 2048) {
242  unsigned char tool;
243  for (int i = 0; i < 2048; i++) {
244  tool = lut[i] & 0xFF;
245  md5_append(&md5er, &tool, 1);
246  }
247  }
248  // HE fine grain LUT
249  else if (lut.size() == 4096) {
250  unsigned char tool;
251  for (int i = 0; i < 4096; i++) {
252  tool = lut[i] & 0xFF;
253  md5_append(&md5er, &tool, 1);
254  }
255  } else {
256  edm::LogError("LutXml") << "Irregular LUT size, " << lut.size()
257  << " , do not know how to compute checksum, exiting...";
258  exit(-1);
259  }
260  md5_finish(&md5er, digest);
261  for (int i = 0; i < 16; i++)
262  result << std::hex << (((int)(digest[i])) & 0xFF);
263 
264  return result.str();
265 }
266 
268  edm::LogInfo("LutXml") << "Created map size: " << lut_map.size();
269 
270  struct timeval _t;
271  gettimeofday(&_t, nullptr);
272  double _time = (double)(_t.tv_sec) + (double)(_t.tv_usec) / 1000000.0;
273 
274  HcalEmap _emap("./backup/official_emap_v6.04_080905.txt");
275  std::vector<HcalEmap::HcalEmapRow> &_map = _emap.get_map();
276  edm::LogInfo("LutXml") << "HcalEmap contains " << _map.size() << " entries";
277 
278  int _counter = 0;
279  for (std::vector<HcalEmap::HcalEmapRow>::const_iterator row = _map.begin(); row != _map.end(); ++row) {
280  if (row->subdet == "HB") {
281  HcalDetId det_id(HcalBarrel, row->ieta, row->iphi, row->idepth);
282  uint32_t raw_id = det_id.rawId();
283  std::vector<unsigned int> *l = getLutFast(raw_id);
284  if (l)
285  _counter++;
286  }
287  if (row->subdet == "HE") {
288  HcalDetId det_id(HcalEndcap, row->ieta, row->iphi, row->idepth);
289  uint32_t raw_id = det_id.rawId();
290  std::vector<unsigned int> *l = getLutFast(raw_id);
291  if (l)
292  _counter++;
293  }
294  if (row->subdet == "HF") {
295  HcalDetId det_id(HcalForward, row->ieta, row->iphi, row->idepth);
296  uint32_t raw_id = det_id.rawId();
297  std::vector<unsigned int> *l = getLutFast(raw_id);
298  if (l)
299  _counter++;
300  }
301  if (row->subdet == "HO") {
302  HcalDetId det_id(HcalOuter, row->ieta, row->iphi, row->idepth);
303  uint32_t raw_id = det_id.rawId();
304  std::vector<unsigned int> *l = getLutFast(raw_id);
305  if (l)
306  _counter++;
307  }
308  }
309  gettimeofday(&_t, nullptr);
310  edm::LogInfo("LutXml") << "access to " << _counter
311  << " HCAL channels took: " << (double)(_t.tv_sec) + (double)(_t.tv_usec) / 1000000.0 - _time
312  << "sec";
313 
314  return 0;
315 }
316 
318  // HBHE: 0,1,4,5,10,11,14,15,17 (+20)
319  // HF: 2,9,12 (+20)
320  // HO: 3,6,7,13,18 (+20)
321  int crate = crate_ < 20 ? crate_ : crate_ - 20;
322  if (crate == 2 || crate == 9 || crate == 12)
323  return HcalForward;
324  else if (crate == 3 || crate == 6 || crate == 7 || crate == 13 || crate == 18)
325  return HcalOuter;
326  else if (crate == 0 || crate == 1 || crate == 4 || crate == 5 || crate == 10 || crate == 11 || crate == 14 ||
327  crate == 15 || crate == 17) {
328  if (slot % 3 == 1)
329  return HcalBarrel;
330  else if (slot % 3 == 0)
331  return HcalEndcap;
332  else if (fiber < 12)
333  return HcalBarrel;
334  else
335  return HcalEndcap;
336  }
337  edm::LogWarning("LutXml::subdet_from_crate") << "crate " << crate_ << " is not accounted for";
338  return HcalEmpty;
339 }
340 
341 int LutXml::a_to_i(char *inbuf) {
342  int result;
343  sscanf(inbuf, "%d", &result);
344  return result;
345 }
346 
347 // organize all LUTs in XML into a map for fast access
348 //
349 // FIXME: uses hardcoded CRATE-to-subdetector mapping
350 // FIXME: it would be better to use some official map
351 //
353  //delete lut_map;
354  lut_map.clear();
355  //lut_map = new std::map<uint32_t,std::vector<unsigned int> >();
356 
357  if (document) {
358  //DOMElement * rootElem =
359  DOMNodeList *brick_list = document->getDocumentElement()->getElementsByTagName(brick);
360  int n_of_bricks = brick_list->getLength();
361  for (int i = 0; i != n_of_bricks; i++) {
362  DOMElement *aBrick = (DOMElement *)(brick_list->item(i));
363  DOMNodeList *par_list = aBrick->getElementsByTagName(XMLString::transcode("Parameter"));
364  int n_of_par = par_list->getLength();
365  int ieta = -99;
366  int iphi = -99;
367  int depth = -99;
368  int crate = -99;
369  int slot = -99;
370  int fiber = -99;
371  int lut_type = -99;
372  int slb = -99;
373  HcalSubdetector subdet;
374  for (int j = 0; j != n_of_par; j++) {
375  DOMElement *aPar = (DOMElement *)(par_list->item(j));
376  char *aName = XMLString::transcode(aPar->getAttribute(XMLProcessor::_toXMLCh("name")));
377  if (strcmp(aName, "IETA") == 0)
378  ieta = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
379  if (strcmp(aName, "IPHI") == 0)
380  iphi = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
381  if (strcmp(aName, "DEPTH") == 0)
382  depth = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
383  if (strcmp(aName, "CRATE") == 0)
384  crate = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
385  if (strcmp(aName, "SLOT") == 0)
386  slot = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
387  if (strcmp(aName, "FIBER") == 0)
388  fiber = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
389  if (strcmp(aName, "LUT_TYPE") == 0)
390  lut_type = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
391  if (strcmp(aName, "SLB") == 0)
392  slb = a_to_i(XMLString::transcode(aPar->getFirstChild()->getNodeValue()));
393  }
394  subdet = subdet_from_crate(crate, slot, fiber);
395  DOMElement *_data = (DOMElement *)(aBrick->getElementsByTagName(XMLString::transcode("Data"))->item(0));
396  char *_str = XMLString::transcode(_data->getFirstChild()->getNodeValue());
397 
398  // get the LUT vector
399  int _string_length = strlen(_str);
400  std::vector<unsigned int> _lut;
401  unsigned int _base = 16;
402  unsigned int _item = 0;
403  for (int i = 0; i != _string_length; i++) {
404  bool _range = false;
405  char ch_cur = _str[i];
406  if (_base == 16)
407  _range = (ch_cur >= '0' and ch_cur <= '9') || (ch_cur >= 'a' and ch_cur <= 'f') ||
408  (ch_cur >= 'A' and ch_cur <= 'F');
409  else if (_base == 10)
410  _range = (ch_cur >= '0' and ch_cur <= '9');
411  if (_range) {
412  if (ch_cur >= 'a' and ch_cur <= 'f')
413  ch_cur += 10 - 'a';
414  else if (ch_cur >= 'A' and ch_cur <= 'F')
415  ch_cur += 10 - 'A';
416  else if (ch_cur >= '0' and ch_cur <= '9')
417  ch_cur += -'0';
418  _item = _item * _base;
419  _item += ch_cur;
420  bool last_digit = false;
421  if ((i + 1) == _string_length)
422  last_digit = true;
423  else {
424  char ch_next = _str[i + 1];
425  bool _range_next = false;
426  if (_base == 16)
427  _range_next = (ch_next >= '0' and ch_next <= '9') || (ch_next >= 'a' and ch_next <= 'f') ||
428  (ch_next >= 'A' and ch_next <= 'F');
429  else if (_base == 10)
430  _range_next = (ch_next >= '0' and ch_next <= '9');
431  if (!_range_next)
432  last_digit = true;
433  }
434  if (last_digit) {
435  _lut.push_back(_item);
436  _item = 0;
437  }
438  }
439  }
440  // filling the map
441  uint32_t _key = 0;
442  if (lut_type == 1) {
443  HcalDetId _id(subdet, ieta, iphi, depth);
444  _key = _id.rawId();
445  } else if (lut_type == 2) {
446  int version = (abs(ieta) > 29 && slb != 12 && crate > 20) ? 1 : 0;
447  HcalTrigTowerDetId _id(ieta, iphi, 10 * version);
448  _key = _id.rawId();
449  } else
450  continue;
451  lut_map.insert(std::pair<uint32_t, std::vector<unsigned int> >(_key, _lut));
452  }
453  } else {
454  edm::LogError("LutXml") << "XML file with LUTs is not loaded, cannot create map!";
455  }
456 
457  return 0;
458 }
459 
460 LutXml::const_iterator LutXml::begin() const { return lut_map.begin(); }
461 
462 LutXml::const_iterator LutXml::end() const { return lut_map.end(); }
463 
464 LutXml::const_iterator LutXml::find(uint32_t id) const { return lut_map.find(id); }
XERCES_CPP_NAMESPACE::DOMElement * addParameter(std::string _name, std::string _type, std::string _value)
Definition: LutXml.cc:191
XERCES_CPP_NAMESPACE::DOMDocument * document
Definition: XMLDOMBlock.h:117
std::string targetfirmware
Definition: LutXml.h:36
int generalizedindex
Definition: LutXml.h:37
void addLut(Config &_config, XMLDOMBlock *checksums_xml=nullptr)
Definition: LutXml.cc:82
static int slb(const HcalTriggerPrimitiveSample &theSample)
XERCES_CPP_NAMESPACE::DOMElement * add_checksum(XERCES_CPP_NAMESPACE::DOMDocument *parent, Config &config)
Definition: LutXml.cc:173
XERCES_CPP_NAMESPACE::DOMElement * addData(std::string _elements, std::string _encoding, const T &_lut)
int create_lut_map(void)
Definition: LutXml.cc:352
Definition: weight.py:1
Definition: config.py:1
Log< level::Error, false > LogError
int a_to_i(char *inbuf)
Definition: LutXml.cc:341
static std::string to_string(const XMLCh *ch)
std::string & getCurrentBrick(void)
Definition: LutXml.cc:210
~LutXml() override
Definition: LutXml.cc:63
int topbottom
Definition: LutXml.h:32
std::string & getString(void)
Definition: XMLDOMBlock.cc:419
const_iterator find(uint32_t) const
Definition: LutXml.cc:464
std::vector< unsigned int > lut
Definition: LutXml.h:40
std::string creationtag
Definition: LutXml.h:33
XERCES_CPP_NAMESPACE::DOMDocument * getDocument(void)
Definition: XMLDOMBlock.cc:268
static std::string get_checksum(std::vector< unsigned int > &lut)
Definition: LutXml.cc:213
HcalSubdetector
Definition: HcalAssistant.h:31
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int codedvetothreshold
Definition: LutXml.h:39
void init(void)
Definition: LutXml.cc:68
std::string formatrevision
Definition: LutXml.h:35
Log< level::Info, false > LogInfo
HcalSubdetector subdet_from_crate(int crate, int slot, int fiber)
Definition: LutXml.cc:317
std::map< uint32_t, std::vector< unsigned int > > lut_map
Definition: LutXml.h:93
unsigned long long uint64_t
Definition: Time.h:13
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
const_iterator end() const
Definition: LutXml.cc:462
std::string infotype
Definition: LutXml.h:31
std::map< uint32_t, std::vector< unsigned int > >::const_iterator const_iterator
Definition: LutXml.h:74
std::vector< HcalEmap::HcalEmapRow > & get_map(void)
Definition: HcalEmap.cc:71
static XMLCh * _toXMLCh(std::string temp)
Definition: XMLProcessor.h:172
std::vector< unsigned int > * getLutFast(uint32_t det_id)
Definition: LutXml.cc:74
XMLCh * brick
Definition: LutXml.h:81
int test_access(std::string filename)
Definition: LutXml.cc:267
Definition: Config.py:1
Log< level::Warning, false > LogWarning
long double T
XERCES_CPP_NAMESPACE::DOMElement * brickElem
Definition: LutXml.h:90
const_iterator begin() const
Definition: LutXml.cc:460
int lut_type
Definition: LutXml.h:32
std::string creationstamp
Definition: LutXml.h:34
int fiberchan
Definition: LutXml.h:32
LutXml()
Definition: LutXml.cc:57
Helper class to handle FWLite file input sources.
def exit(msg="")
std::vector< uint64_t > mask
Definition: LutXml.h:41