CMS 3D CMS Logo

LUT.cc
Go to the documentation of this file.
2 
3 #include <sstream>
4 #include <string>
5 #include <algorithm>
6 
7 //reads in the file
8 //the format is "address payload"
9 //all commments are ignored (start with '#') except for the header comment (starts with #<header>)
10 //currently ignores anything else on the line after the "address payload" and assumes they come first
11 int l1t::LUT::read(std::istream& stream) {
12  data_.clear();
13 
14  int readHeaderCode = readHeader_(stream);
15  if (readHeaderCode != SUCCESS)
16  return readHeaderCode;
17 
18  std::vector<std::pair<unsigned int, int> > entries;
19  unsigned int maxAddress = addressMask_;
21 
22  while (std::getline(stream, line)) {
23  line.erase(std::find(line.begin(), line.end(), '#'), line.end()); //ignore comments
24  std::istringstream lineStream(line);
25  std::pair<unsigned int, int> entry;
26  while (lineStream >> entry.first >> entry.second) {
27  entry.first &= addressMask_;
28  entry.second &= dataMask_;
29  entries.push_back(entry);
30  if (entry.first > maxAddress || maxAddress == addressMask_)
31  maxAddress = entry.first;
32  }
33  }
34  std::sort(entries.begin(), entries.end());
35  if (entries.empty()) {
36  //log the error we read nothing
37  return NO_ENTRIES;
38  }
39  //this check is redundant as dups are also picked up by the next check but might make for easier debugging
40  if (std::adjacent_find(entries.begin(), entries.end(), [](auto const& a, auto const& b) {
41  return a.first == b.first;
42  }) != entries.end()) {
43  //log the error that we have duplicate addresses once masked
44  return DUP_ENTRIES;
45  }
46  if (entries.front().first != 0 ||
47  std::adjacent_find(entries.begin(), entries.end(), [](auto const& a, auto const& b) {
48  return a.first + 1 != b.first;
49  }) != entries.end()) {
50  //log the error that we have a missing entry
51  return MISS_ENTRIES;
52  }
53 
54  if (maxAddress != std::numeric_limits<unsigned int>::max())
55  data_.resize(maxAddress + 1, 0);
56  else {
57  //log the error that we have more addresses than we can deal with (which is 4gb so something probably has gone wrong anyways)
59  }
60 
61  std::transform(entries.begin(), entries.end(), data_.begin(), [](auto const& x) { return x.second; });
62  return SUCCESS;
63 }
64 
65 void l1t::LUT::write(std::ostream& stream) const {
66  stream << "#<header> V1 " << nrBitsAddress_ << " " << nrBitsData_ << " </header> " << std::endl;
67  for (unsigned int address = 0; address < data_.size(); address++) {
68  stream << (address & addressMask_) << " " << data(address) << std::endl;
69  }
70 }
71 
72 int l1t::LUT::readHeader_(std::istream& stream) {
73  int startPos = stream.tellg(); //we are going to reset to this position before we exit
75  while (std::getline(stream, line)) {
76  if (line.find("#<header>") == 0) { //line
77  std::istringstream lineStream(line);
78 
79  std::string version; //currently not doing anything with this
80  std::string headerField; //currently not doing anything with this
81  if (lineStream >> headerField >> version >> nrBitsAddress_ >> nrBitsData_) {
82  addressMask_ = nrBitsAddress_ != 32 ? (0x1 << nrBitsAddress_) - 1 : ~0x0;
83  dataMask_ = (0x1 << nrBitsData_) - 1;
84  stream.seekg(startPos);
85  return SUCCESS;
86  }
87  }
88  }
89 
90  nrBitsAddress_ = 0;
91  nrBitsData_ = 0;
92  addressMask_ = (0x1 << nrBitsAddress_) - 1;
93  dataMask_ = (0x1 << nrBitsData_) - 1;
94 
95  stream.seekg(startPos);
96  return NO_HEADER;
97 }
std::vector< int > data_
Definition: LUT.h:68
void write(std::ostream &stream) const
Definition: LUT.cc:65
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
unsigned int nrBitsData_
Definition: LUT.h:64
int read(std::istream &stream)
Definition: LUT.cc:11
unsigned int addressMask_
Definition: LUT.h:65
int readHeader_(std::istream &)
Definition: LUT.cc:72
double b
Definition: hdecay.h:118
double a
Definition: hdecay.h:119
int data(unsigned int address) const
Definition: LUT.h:46
unsigned int nrBitsAddress_
Definition: LUT.h:63
unsigned int dataMask_
Definition: LUT.h:66
unsigned transform(const HcalDetId &id, unsigned transformCode)