Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:19

0001 #ifndef RecoLocalTracker_SiPixelClusterizer_SiPixelArrayBuffer_H
0002 #define RecoLocalTracker_SiPixelClusterizer_SiPixelArrayBuffer_H
0003 
0004 //----------------------------------------------------------------------------
0005 //! \class SiPixelArrayBuffer
0006 //! \brief Class to store ADC counts during clustering.
0007 //!
0008 //! This class defines the buffer where the pixel ADC are stored.
0009 //! The size is the number of rows and cols into a
0010 //! ROC and it is set in the PixelThresholdClusterizer
0011 //!
0012 //! TO DO: the chip size should be obtained in some better way.
0013 //!
0014 //! History:
0015 //!    Modify the indexing to col*nrows + row. 9/01 d.k.
0016 //!    Add setSize method to adjust array size. 3/02 d.k.
0017 //----------------------------------------------------------------------------
0018 
0019 // We use PixelPos which is an inner class of SiPixelCluster:
0020 #include "DataFormats/SiPixelCluster/interface/SiPixelCluster.h"
0021 
0022 #include <vector>
0023 #include <iostream>
0024 
0025 class SiPixelArrayBuffer {
0026 public:
0027   inline SiPixelArrayBuffer(int rows, int cols);
0028   inline SiPixelArrayBuffer() {}
0029 
0030   inline void setSize(int rows, int cols);
0031   inline int operator()(int row, int col) const;
0032   inline int operator()(const SiPixelCluster::PixelPos&) const;
0033   inline int rows() const { return nrows; }
0034   inline int columns() const { return ncols; }
0035 
0036   inline bool inside(int row, int col) const;
0037   inline void set_adc(int row, int col, int adc);
0038   inline void set_adc(const SiPixelCluster::PixelPos&, int adc);
0039   inline void add_adc(int row, int col, int adc);
0040   int size() const { return pixel_vec.size(); }
0041 
0042   /// Definition of indexing within the buffer.
0043   int index(int row, int col) const { return col * nrows + row; }
0044   int index(const SiPixelCluster::PixelPos& pix) const { return index(pix.row(), pix.col()); }
0045 
0046 private:
0047   std::vector<int> pixel_vec;  // TO DO: any benefit in using shorts instead?
0048   int nrows;
0049   int ncols;
0050 };
0051 
0052 SiPixelArrayBuffer::SiPixelArrayBuffer(int rows, int cols) : pixel_vec(rows * cols, 0), nrows(rows), ncols(cols) {}
0053 
0054 void SiPixelArrayBuffer::setSize(int rows, int cols) {
0055   pixel_vec.resize(rows * cols, 0);
0056   nrows = rows;
0057   ncols = cols;
0058 }
0059 
0060 bool SiPixelArrayBuffer::inside(int row, int col) const { return (row >= 0 && row < nrows && col >= 0 && col < ncols); }
0061 
0062 int SiPixelArrayBuffer::operator()(int row, int col) const { return pixel_vec[index(row, col)]; }
0063 
0064 int SiPixelArrayBuffer::operator()(const SiPixelCluster::PixelPos& pix) const { return pixel_vec[index(pix)]; }
0065 
0066 // unchecked!
0067 void SiPixelArrayBuffer::set_adc(int row, int col, int adc) { pixel_vec[index(row, col)] = adc; }
0068 
0069 void SiPixelArrayBuffer::set_adc(const SiPixelCluster::PixelPos& pix, int adc) { pixel_vec[index(pix)] = adc; }
0070 
0071 void SiPixelArrayBuffer::add_adc(int row, int col, int adc) { pixel_vec[index(row, col)] += adc; }
0072 
0073 #endif