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