CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DataFrameContainer.h
Go to the documentation of this file.
1 #ifndef DataFormats_Common_DataFrameContainer_h
2 #define DataFormats_Common_DataFrameContainer_h
3 
5 
6 #include <boost/iterator/transform_iterator.hpp>
7 #include <boost/iterator/counting_iterator.hpp>
8 
9 #include<vector>
10 #include<algorithm>
11 
12 class TestDataFrame;
13 
14 template<typename DigiCollection>
16 
17 namespace edm {
18 
30  public:
31  typedef unsigned int size_type; // for persistency
32  typedef unsigned int id_type;
33  typedef unsigned short data_type;
34  typedef std::vector<id_type> IdContainer;
35  typedef std::vector<data_type> DataContainer;
36  typedef std::vector<id_type>::iterator IdIter;
37  typedef std::vector<data_type>::iterator DataIter;
38  typedef std::pair<IdIter,DataIter> IterPair;
39  typedef std::vector<id_type>::const_iterator const_IdIter;
40  typedef std::vector<data_type>::const_iterator const_DataIter;
41  typedef std::pair<const_IdIter,const_DataIter> const_IterPair;
42 
43  struct IterHelp {
45  IterHelp(DataFrameContainer const & iv) : v(iv){}
46 
47  DataFrame const & operator()(int i) const {
48  frame.set(v,i);
49  return frame;
50  }
51  private:
53  mutable DataFrame frame;
54  };
55 
56  typedef boost::transform_iterator<IterHelp,boost::counting_iterator<int> > const_iterator;
57 
59  m_subdetId(0), m_stride(0),
60  m_ids(), m_data(){}
61 
62  explicit DataFrameContainer(size_t istride, int isubdet=0, size_t isize=0) :
63  m_subdetId(isubdet), m_stride(istride),
64  m_ids(isize), m_data(isize*m_stride){}
65 
66  void swap(DataFrameContainer & rh) {
69  m_ids.swap(rh.m_ids);
70  m_data.swap(rh.m_data);
71  }
72 
75  this->swap(temp);
76  return *this;
77  }
78 
79  void swap(IdContainer & iic, DataContainer & idc) {
80  m_ids.swap(iic);
81  m_data.swap(idc);
82  }
83 
84  void reserve(size_t isize) {
85  m_ids.reserve(isize);
86  m_data.reserve(isize*m_stride);
87  }
88 
89  void resize(size_t isize) {
90  m_ids.resize(isize);
91  m_data.resize(isize*m_stride);
92  }
93 
94  void sort();
95 
96  // FIXME not sure what the best way to add one cell to cont
97  void push_back(id_type iid, data_type const * idata) {
98  m_ids.push_back(iid);
99  size_t cs = m_data.size();
100  m_data.resize(m_data.size()+m_stride);
101  std::copy(idata,idata+m_stride,m_data.begin()+cs);
102  }
103  //make space for it
104  void push_back(id_type iid) {
105  m_ids.push_back(iid);
106  m_data.resize(m_data.size()+m_stride);
107  }
108  // overwrite back (very ad hoc interface...)
109  void set_back(id_type iid, data_type const * idata) {
110  m_ids.back() = iid;
111  size_t cs = m_data.size()-m_stride;
112  std::copy(idata,idata+m_stride,m_data.begin()+cs);
113  }
114  void set_back(id_type iid) {
115  m_ids.back() = iid;
116  }
117  void set_back(data_type const * idata) {
118  size_t cs = m_data.size()-m_stride;
119  std::copy(idata,idata+m_stride,m_data.begin()+cs);
120  }
121 
123  return DataFrame(*this,size()-1);
124  }
125 
126  void pop_back() {
127  m_ids.resize(m_ids.size()-1);
128  m_data.resize(m_data.size()-m_stride);
129  }
130 
131  //---------------------------------------------------------
132 
133  IterPair pair(size_t i) {
134  return IterPair(m_ids.begin()+i,m_data.begin()+i*m_stride);
135  }
136 
137  const_IterPair pair(size_t i) const {
138  return const_IterPair(m_ids.begin()+i,m_data.begin()+i*m_stride);
139  }
140 
142  return DataFrame(*this,i);
143  }
144 
145  DataFrame operator[](size_t i) const {
146  return DataFrame(*this,i);
147  }
148 
149  // slow interface
151  const_IdIter p = std::lower_bound(m_ids.begin(),m_ids.end(),i);
152  return (p==m_ids.end() || (*p)!=i) ? end() :
153  boost::make_transform_iterator(boost::counting_iterator<int>(p-m_ids.begin()),
154  IterHelp(*this));
155  }
156 
158  return boost::make_transform_iterator(boost::counting_iterator<int>(0),
159  IterHelp(*this));
160  }
161  const_iterator end() const {
162  return boost::make_transform_iterator(boost::counting_iterator<int>(size()),
163  IterHelp(*this));
164  }
165 
166 
167  int subdetId() const { return m_subdetId; }
168 
169  size_type stride() const { return m_stride; }
170 
171  bool empty() const { return m_ids.empty();}
172 
173  size_type size() const { return m_ids.size();}
174 
175  data_type operator()(size_t cell, size_t frame) const {
176  return m_data[cell*m_stride+frame];
177  }
178 
179  data_type const * frame(size_t cell) const {
180  return &m_data[cell*m_stride];
181  }
182 
183  id_type id(size_t cell) const {
184  return m_ids[cell];
185  }
186 
187  // IdContainer const & ids() const { return m_ids;}
188  // DataContainer const & data() const { return m_data;}
189 
190  private:
191  //for testing
192  friend class ::TestDataFrame;
193 
194  template<typename DigiCollection>
195  friend class ::TestEcalDigi;
196 
197  // subdetector id (as returned by DetId::subdetId())
199 
200  // can be a enumerator, or a template argument
202 
205 
206  };
207 
208  inline
210  size_type i) :
211  m_id(icont.id(i)), m_data(icont.frame(i)), m_size(icont.stride()){}
212 
213  inline
214  void DataFrame::set(DataFrameContainer const & icont,
215  size_type i) {
216  m_id=icont.id(i);
217  m_data=icont.frame(i);
218  m_size=icont.stride();
219  }
220 
221  // Free swap function
222  inline
223  void
225  lhs.swap(rhs);
226  }
227 
228 }
229 
230 // The standard allows us to specialize std::swap for non-templates.
231 // This ensures that DataFrameContainer::swap() will be used in algorithms.
232 
233 namespace std {
234  template <> inline void swap(edm::DataFrameContainer& lhs, edm::DataFrameContainer& rhs) {
235  lhs.swap(rhs);
236  }
237 }
238 
239 #endif // DataFormats_Common_DataFrameContainer_h
data_type operator()(size_t cell, size_t frame) const
int i
Definition: DBlmapReader.cc:9
std::pair< IdIter, DataIter > IterPair
data_type const * m_data
Definition: DataFrame.h:75
auto_ptr< ClusterSequence > cs
void resize(size_t isize)
boost::transform_iterator< IterHelp, boost::counting_iterator< int > > const_iterator
std::vector< data_type >::iterator DataIter
void push_back(id_type iid)
IterHelp(DataFrameContainer const &iv)
size_type stride() const
DataFrameContainer(size_t istride, int isubdet=0, size_t isize=0)
const_iterator begin() const
DataFrame operator[](size_t i) const
id_type m_id
Definition: DataFrame.h:74
id_type id(size_t cell) const
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:116
unsigned int size_type
Definition: DataFrame.h:18
void swap(IdContainer &iic, DataContainer &idc)
DataFrame const & operator()(int i) const
const_iterator find(id_type i) const
std::vector< data_type > DataContainer
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
std::vector< data_type >::const_iterator const_DataIter
std::vector< id_type >::const_iterator const_IdIter
std::pair< const_IdIter, const_DataIter > const_IterPair
DataFrameContainer & operator=(DataFrameContainer const &rhs)
void swap(DataFrameContainer &rh)
std::vector< id_type >::iterator IdIter
m_id("(unknown)")
void set_back(data_type const *idata)
void reserve(size_t isize)
void set(DataFrameContainer const &icont, size_type i)
DataFrameContainer const & v
size_type m_size
Definition: DataFrame.h:76
void set_back(id_type iid)
void push_back(id_type iid, data_type const *idata)
const_iterator end() const
std::vector< id_type > IdContainer
DataFrame operator[](size_t i)
const_IterPair pair(size_t i) const
void set_back(id_type iid, data_type const *idata)
data_type const * frame(size_t cell) const