CMS 3D CMS Logo

PMTDSimAccumulator.h
Go to the documentation of this file.
1 #ifndef DataFormats_FTLDigi_PMTDSimAccumulator_h
2 #define DataFormats_FTLDigi_PMTDSimAccumulator_h
3 
5 
6 #include <vector>
7 #include <cassert>
8 
10 public:
11  // These two structs are public only because of dictionary generation
12  class DetIdSize {
13  public:
14  DetIdSize() {}
15  DetIdSize(unsigned int detId, unsigned char row, unsigned char col) : detId_(detId), row_(row), column_(col) {}
16 
17  void increaseSize() { ++size_; }
18 
19  unsigned int detId() const { return detId_; }
20  unsigned char row() const { return row_; }
21  unsigned char column() const { return column_; }
22  unsigned int size() const { return size_; }
23 
24  private:
25  unsigned int detId_ = 0;
26  unsigned char row_ = 0;
27  unsigned char column_ = 0;
28  unsigned char size_ = 0;
29  };
30  class Data {
31  public:
32  constexpr static unsigned energyOffset = 15;
33  constexpr static unsigned energyMask = 0x1;
34  constexpr static unsigned sampleOffset = 11;
35  constexpr static unsigned sampleMask = 0xf;
36  constexpr static unsigned dataOffset = 0;
37  constexpr static unsigned dataMask = 0x7ff;
38 
39  Data() : data_(0) {}
40  Data(unsigned short ei, unsigned short si, unsigned short d)
41  : data_((ei << energyOffset) | (si << sampleOffset) | d) {}
42 
43  unsigned int energyIndex() const { return data_ >> energyOffset; }
44  unsigned int sampleIndex() const { return (data_ >> sampleOffset) & sampleMask; }
45  unsigned int data() const { return data_ & dataMask; }
46 
47  private:
48  unsigned short data_;
49  };
50 
51  PMTDSimAccumulator() = default;
52  ~PMTDSimAccumulator() = default;
53 
54  void reserve(size_t size) {
55  detIdSize_.reserve(size);
56  data_.reserve(size);
57  }
58 
59  void shrink_to_fit() {
60  detIdSize_.shrink_to_fit();
61  data_.shrink_to_fit();
62  }
63 
71  void emplace_back(unsigned int detId,
72  unsigned char row,
73  unsigned char column,
74  unsigned short energyIndex,
75  unsigned short sampleIndex,
76  unsigned short data) {
77  if (detIdSize_.empty() || detIdSize_.back().detId() != detId || detIdSize_.back().row() != row ||
78  detIdSize_.back().column() != column) {
79  detIdSize_.emplace_back(detId, row, column);
80  }
81  data_.emplace_back(energyIndex, sampleIndex, data);
82  detIdSize_.back().increaseSize();
83  }
84 
85  class TmpElem {
86  public:
87  TmpElem(unsigned int detId, unsigned char row, unsigned char column, Data data)
88  : detId_(detId), data_(data), row_(row), column_(column) {}
89 
90  unsigned int detId() const { return detId_; }
91  unsigned char row() const { return row_; }
92  unsigned char column() const { return column_; }
93  unsigned short energyIndex() const { return data_.energyIndex(); }
94  unsigned short sampleIndex() const { return data_.sampleIndex(); }
95  unsigned short data() const { return data_.data(); }
96 
97  private:
98  unsigned int detId_;
100  unsigned char row_;
101  unsigned char column_;
102  };
103 
105  public:
106  // begin
108  : acc_(acc), iDet_(0), iData_(0), endData_(acc->detIdSize_.empty() ? 0 : acc->detIdSize_.front().size()) {}
109 
110  // end
111  const_iterator(const PMTDSimAccumulator* acc, unsigned int detSize, unsigned int dataSize)
112  : acc_(acc), iDet_(detSize), iData_(dataSize), endData_(0) {}
113 
114  bool operator==(const const_iterator& other) const { return iDet_ == other.iDet_ && iData_ == other.iData_; }
115  bool operator!=(const const_iterator& other) const { return !operator==(other); }
117  ++iData_;
118  if (iData_ == endData_) {
119  ++iDet_;
120  endData_ += (iDet_ == acc_->detIdSize_.size()) ? 0 : acc_->detIdSize_[iDet_].size();
121  }
122  return *this;
123  }
125  auto tmp = *this;
126  ++(*this);
127  return tmp;
128  }
130  const auto& id = acc_->detIdSize_[iDet_];
131  return TmpElem(id.detId(), id.row(), id.column(), acc_->data_[iData_]);
132  }
133 
134  private:
136  unsigned int iDet_;
137  unsigned int iData_;
138  unsigned int endData_;
139  };
140 
141  TmpElem back() const {
142  const auto& id = detIdSize_.back();
143  return TmpElem(id.detId(), id.row(), id.column(), data_.back());
144  }
145 
146  const_iterator cbegin() const { return const_iterator(this); }
147  const_iterator begin() const { return cbegin(); }
148  const_iterator cend() const { return const_iterator(this, detIdSize_.size(), data_.size()); }
149  const_iterator end() const { return cend(); }
150 
151 private:
152  std::vector<DetIdSize> detIdSize_;
153  std::vector<Data> data_;
154 };
155 
156 #endif
unsigned short sampleIndex() const
const_iterator cend() const
unsigned int detId() const
unsigned char row() const
unsigned char column() const
const_iterator(const PMTDSimAccumulator *acc, unsigned int detSize, unsigned int dataSize)
bool operator==(const const_iterator &other) const
void emplace_back(unsigned int detId, unsigned char row, unsigned char column, unsigned short energyIndex, unsigned short sampleIndex, unsigned short data)
std::vector< Data > data_
void reserve(size_t size)
unsigned int data() const
std::map< l1t::HGCalMulticluster::EnergyInterpretation, double > ei
Definition: classes.h:67
const_iterator(const PMTDSimAccumulator *acc)
bool operator!=(const const_iterator &other) const
const PMTDSimAccumulator * acc_
PMTDSimAccumulator()=default
unsigned int sampleIndex() const
const_iterator end() const
unsigned short energyIndex() const
~PMTDSimAccumulator()=default
bool operator==(const QGLikelihoodParameters &lhs, const QGLikelihoodCategory &rhs)
Test if parameters are compatible with category.
d
Definition: ztail.py:151
unsigned int energyIndex() const
unsigned char column() const
std::vector< DetIdSize > detIdSize_
Data(unsigned short ei, unsigned short si, unsigned short d)
unsigned short data() const
TmpElem(unsigned int detId, unsigned char row, unsigned char column, Data data)
const_iterator cbegin() const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
col
Definition: cuy.py:1010
TmpElem back() const
DetIdSize(unsigned int detId, unsigned char row, unsigned char col)
tmp
align.sh
Definition: createJobs.py:716
const_iterator begin() const
unsigned char row() const
#define constexpr