CMS 3D CMS Logo

SiPixelCluster.h
Go to the documentation of this file.
1 #ifndef DataFormats_SiPixel_Cluster_SiPixelCluster_h
2 #define DataFormats_SiPixel_Cluster_SiPixelCluster_h
3 
4 //---------------------------------------------------------------------------
19 //---------------------------------------------------------------------------
20 
21 #include <vector>
22 #include <cstdint>
23 #include <cassert>
24 #include <limits>
25 
26 class PixelDigi;
27 
29 public:
30  class Pixel {
31  public:
32  constexpr Pixel() : x(0), y(0), adc(0) {} // for root
33  constexpr Pixel(int pix_x, int pix_y, int pix_adc) : x(pix_x), y(pix_y), adc(pix_adc) {}
34  uint16_t x;
35  uint16_t y;
36  uint16_t adc;
37  };
38 
39  //--- Integer shift in x and y directions.
40  class Shift {
41  public:
42  constexpr Shift(int dx, int dy) : dx_(dx), dy_(dy) {}
43  constexpr Shift() : dx_(0), dy_(0) {}
44  constexpr int dx() const { return dx_; }
45  constexpr int dy() const { return dy_; }
46 
47  private:
48  int dx_;
49  int dy_;
50  };
51 
52  //--- Position of a SiPixel
53  class PixelPos {
54  public:
55  constexpr PixelPos() : row_(0), col_(0) {}
56  constexpr PixelPos(int row, int col) : row_(row), col_(col) {}
57  constexpr int row() const { return row_; }
58  constexpr int col() const { return col_; }
59  constexpr PixelPos operator+(const Shift& shift) const { return PixelPos(row() + shift.dx(), col() + shift.dy()); }
60 
61  private:
62  int row_;
63  int col_;
64  };
65 
66  typedef std::vector<PixelDigi>::const_iterator PixelDigiIter;
67  typedef std::pair<PixelDigiIter, PixelDigiIter> PixelDigiRange;
68 
69  static constexpr unsigned int MAXSPAN = 255;
70  static constexpr unsigned int MAXPOS = 2047;
71 
73 
78  SiPixelCluster() = default;
79 
80  SiPixelCluster(unsigned int isize,
81  uint16_t const* adcs,
82  uint16_t const* xpos,
83  uint16_t const* ypos,
84  uint16_t xmin,
85  uint16_t ymin,
86  uint16_t id = invalidClusterId)
87  : thePixelOffset(2 * isize), thePixelADC(adcs, adcs + isize), theOriginalClusterId(id) {
88  uint16_t maxCol = 0;
89  uint16_t maxRow = 0;
90  for (unsigned int i = 0; i != isize; ++i) {
91  uint16_t xoffset = xpos[i] - xmin;
92  uint16_t yoffset = ypos[i] - ymin;
93  thePixelOffset[i * 2] = std::min(uint16_t(MAXSPAN), xoffset);
94  thePixelOffset[i * 2 + 1] = std::min(uint16_t(MAXSPAN), yoffset);
95  if (xoffset > maxRow)
96  maxRow = xoffset;
97  if (yoffset > maxCol)
98  maxCol = yoffset;
99  }
100  packRow(xmin, maxRow);
101  packCol(ymin, maxCol);
102  }
103 
104  // obsolete (only for regression tests)
105  SiPixelCluster(const PixelPos& pix, int adc);
106  void add(const PixelPos& pix, int adc);
107 
108  // Analog linear average position (barycenter)
109  float x() const {
110  float qm = 0.0;
111  int isize = thePixelADC.size();
112  for (int i = 0; i < isize; ++i)
113  qm += float(thePixelADC[i]) * (thePixelOffset[i * 2] + minPixelRow() + 0.5f);
114  return qm / charge();
115  }
116 
117  float y() const {
118  float qm = 0.0;
119  int isize = thePixelADC.size();
120  for (int i = 0; i < isize; ++i)
121  qm += float(thePixelADC[i]) * (thePixelOffset[i * 2 + 1] + minPixelCol() + 0.5f);
122  return qm / charge();
123  }
124 
125  // Return number of pixels.
126  int size() const { return thePixelADC.size(); }
127 
128  // Return cluster dimension in the x direction.
129  int sizeX() const { return rowSpan() + 1; }
130 
131  // Return cluster dimension in the y direction.
132  int sizeY() const { return colSpan() + 1; }
133 
134  inline int charge() const {
135  int qm = 0;
136  int isize = thePixelADC.size();
137  for (int i = 0; i < isize; ++i)
138  qm += thePixelADC[i];
139  return qm;
140  } // Return total cluster charge.
141 
142  inline int minPixelRow() const { return theMinPixelRow; } // The min x index.
143  inline int maxPixelRow() const { return minPixelRow() + rowSpan(); } // The max x index.
144  inline int minPixelCol() const { return theMinPixelCol; } // The min y index.
145  inline int maxPixelCol() const { return minPixelCol() + colSpan(); } // The max y index.
146 
147  const std::vector<uint8_t>& pixelOffset() const { return thePixelOffset; }
148  const std::vector<uint16_t>& pixelADC() const { return thePixelADC; }
149 
150  // obsolete, use single pixel access below
151  const std::vector<Pixel> pixels() const {
152  std::vector<Pixel> oldPixVector;
153  int isize = thePixelADC.size();
154  oldPixVector.reserve(isize);
155  for (int i = 0; i < isize; ++i) {
156  oldPixVector.push_back(pixel(i));
157  }
158  return oldPixVector;
159  }
160 
161  // infinite faster than above...
162  Pixel pixel(int i) const {
163  return Pixel(minPixelRow() + thePixelOffset[i * 2], minPixelCol() + thePixelOffset[i * 2 + 1], thePixelADC[i]);
164  }
165 
166 private:
167  static int overflow_(uint16_t span) { return span == uint16_t(MAXSPAN); }
168 
169 public:
170  int colSpan() const { return thePixelColSpan; }
171 
172  int rowSpan() const { return thePixelRowSpan; }
173 
174  bool overflowCol() const { return overflow_(thePixelColSpan); }
175 
176  bool overflowRow() const { return overflow_(thePixelRowSpan); }
177 
178  bool overflow() const { return overflowCol() || overflowRow(); }
179 
180  void packCol(uint16_t ymin, uint16_t yspan) {
182  thePixelColSpan = std::min(yspan, uint16_t(MAXSPAN));
183  }
184  void packRow(uint16_t xmin, uint16_t xspan) {
186  thePixelRowSpan = std::min(xspan, uint16_t(MAXSPAN));
187  }
188 
189  // ggiurgiu@fnal.gov, 01/05/12
190  // Getters and setters for the newly added data members (err_x and err_y). See below.
191  void setSplitClusterErrorX(float errx) { err_x = errx; }
192  void setSplitClusterErrorY(float erry) { err_y = erry; }
193  float getSplitClusterErrorX() const { return err_x; }
194  float getSplitClusterErrorY() const { return err_y; }
195 
196  // the original id (they get sorted)
197  auto originalId() const { return theOriginalClusterId; }
198  void setOriginalId(uint16_t id) { theOriginalClusterId = id; }
199 
200 private:
201  std::vector<uint8_t> thePixelOffset;
202  std::vector<uint16_t> thePixelADC;
203 
204  uint16_t theMinPixelRow = MAXPOS; // Minimum pixel index in the x direction (low edge).
205  uint16_t theMinPixelCol = MAXPOS; // Minimum pixel index in the y direction (left edge).
206  uint8_t thePixelRowSpan = 0; // Span pixel index in the x direction (low edge).
207  uint8_t thePixelColSpan = 0; // Span pixel index in the y direction (left edge).
208 
210 
211  float err_x = -99999.9f;
212  float err_y = -99999.9f;
213 };
214 
215 // Comparison operators (needed by DetSetVector)
216 inline bool operator<(const SiPixelCluster& one, const SiPixelCluster& other) {
217  if (one.minPixelRow() < other.minPixelRow()) {
218  return true;
219  } else if (one.minPixelRow() > other.minPixelRow()) {
220  return false;
221  } else if (one.minPixelCol() < other.minPixelCol()) {
222  return true;
223  } else {
224  return false;
225  }
226 }
227 
232 
237 
240 #endif
edm::RefProd
Definition: EDProductfwd.h:25
edm::DetSetVector
Definition: DetSetVector.h:61
SiPixelCluster::theMinPixelRow
uint16_t theMinPixelRow
Definition: SiPixelCluster.h:204
SiPixelCluster::minPixelCol
int minPixelCol() const
Definition: SiPixelCluster.h:144
EcalSCDynamicDPhiParametersESProducer_cfi.yoffset
yoffset
Definition: EcalSCDynamicDPhiParametersESProducer_cfi.py:10
mps_fire.i
i
Definition: mps_fire.py:428
SiPixelPI::one
Definition: SiPixelPayloadInspectorHelper.h:39
SiPixelCluster::invalidClusterId
static constexpr uint16_t invalidClusterId
Definition: SiPixelCluster.h:72
SiPixelCluster::PixelPos::PixelPos
constexpr PixelPos()
Definition: SiPixelCluster.h:55
SiPixelCluster::packCol
void packCol(uint16_t ymin, uint16_t yspan)
Definition: SiPixelCluster.h:180
SiPixelCluster::overflowRow
bool overflowRow() const
Definition: SiPixelCluster.h:176
min
T min(T a, T b)
Definition: MathUtil.h:58
EcalSCDynamicDPhiParametersESProducer_cfi.xoffset
xoffset
Definition: EcalSCDynamicDPhiParametersESProducer_cfi.py:12
SiPixelClusterCollectionNew
edmNew::DetSetVector< SiPixelCluster > SiPixelClusterCollectionNew
Definition: SiPixelCluster.h:238
gpuClustering::adc
uint16_t *__restrict__ uint16_t const *__restrict__ adc
Definition: gpuClusterChargeCut.h:20
SiPixelCluster::y
float y() const
Definition: SiPixelCluster.h:117
SiPixelCluster::maxPixelCol
int maxPixelCol() const
Definition: SiPixelCluster.h:145
PixelDigi
Definition: PixelDigi.h:14
SiPixelCluster::PixelPos::col_
int col_
Definition: SiPixelCluster.h:63
SiPixelCluster::maxPixelRow
int maxPixelRow() const
Definition: SiPixelCluster.h:143
operator<
bool operator<(const SiPixelCluster &one, const SiPixelCluster &other)
Definition: SiPixelCluster.h:216
SiPixelCluster::rowSpan
int rowSpan() const
Definition: SiPixelCluster.h:172
SiPixelCluster::MAXSPAN
static constexpr unsigned int MAXSPAN
Definition: SiPixelCluster.h:69
SiPixelCluster
Pixel cluster – collection of neighboring pixels above threshold.
Definition: SiPixelCluster.h:28
SiPixelCluster::Shift::Shift
constexpr Shift(int dx, int dy)
Definition: SiPixelCluster.h:42
SiPixelClusterRef
edm::Ref< SiPixelClusterCollection, SiPixelCluster > SiPixelClusterRef
Definition: SiPixelCluster.h:234
SiPixelCluster::theOriginalClusterId
uint16_t theOriginalClusterId
Definition: SiPixelCluster.h:209
SiPixelCluster::theMinPixelCol
uint16_t theMinPixelCol
Definition: SiPixelCluster.h:205
SiPixelCluster::PixelDigiRange
std::pair< PixelDigiIter, PixelDigiIter > PixelDigiRange
Definition: SiPixelCluster.h:67
SiPixelCluster::Pixel
Definition: SiPixelCluster.h:30
DetSetRefVector.h
edm::Ref
Definition: AssociativeIterator.h:58
SiPixelCluster::overflowCol
bool overflowCol() const
Definition: SiPixelCluster.h:174
SiPixelCluster::colSpan
int colSpan() const
Definition: SiPixelCluster.h:170
SiPixelCluster::getSplitClusterErrorX
float getSplitClusterErrorX() const
Definition: SiPixelCluster.h:193
SiPixelCluster::sizeY
int sizeY() const
Definition: SiPixelCluster.h:132
SiPixelCluster::overflow
bool overflow() const
Definition: SiPixelCluster.h:178
SiPixelCluster::Pixel::adc
uint16_t adc
Definition: SiPixelCluster.h:36
SiPixelCluster::add
void add(const PixelPos &pix, int adc)
Definition: SiPixelCluster.cc:25
SiPixelClusterRefVector
edm::DetSetRefVector< SiPixelCluster > SiPixelClusterRefVector
Definition: SiPixelCluster.h:235
SiPixelCluster::PixelDigiIter
std::vector< PixelDigi >::const_iterator PixelDigiIter
Definition: SiPixelCluster.h:66
SiPixelCluster::thePixelColSpan
uint8_t thePixelColSpan
Definition: SiPixelCluster.h:207
SiPixelCluster::overflow_
static int overflow_(uint16_t span)
Definition: SiPixelCluster.h:167
SiPixelCluster::minPixelRow
int minPixelRow() const
Definition: SiPixelCluster.h:142
SiPixelCluster::Shift::dx
constexpr int dx() const
Definition: SiPixelCluster.h:44
SiPixelCluster::SiPixelCluster
SiPixelCluster(unsigned int isize, uint16_t const *adcs, uint16_t const *xpos, uint16_t const *ypos, uint16_t xmin, uint16_t ymin, uint16_t id=invalidClusterId)
Definition: SiPixelCluster.h:80
SiPixelCluster::thePixelRowSpan
uint8_t thePixelRowSpan
Definition: SiPixelCluster.h:206
SiPixelCluster::err_y
float err_y
Definition: SiPixelCluster.h:212
trackingPlots.other
other
Definition: trackingPlots.py:1460
SiPixelCluster::PixelPos::operator+
constexpr PixelPos operator+(const Shift &shift) const
Definition: SiPixelCluster.h:59
SiPixelCluster::pixelADC
const std::vector< uint16_t > & pixelADC() const
Definition: SiPixelCluster.h:148
SiPixelCluster::setSplitClusterErrorX
void setSplitClusterErrorX(float errx)
Definition: SiPixelCluster.h:191
SiPixelCluster::err_x
float err_x
Definition: SiPixelCluster.h:211
SiPixelCluster::Pixel::Pixel
constexpr Pixel(int pix_x, int pix_y, int pix_adc)
Definition: SiPixelCluster.h:33
SiPixelCluster::thePixelADC
std::vector< uint16_t > thePixelADC
Definition: SiPixelCluster.h:202
SiPixelCluster::Shift::dy
constexpr int dy() const
Definition: SiPixelCluster.h:45
SiPixelCluster::x
float x() const
Definition: SiPixelCluster.h:109
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
SiPixelCluster::PixelPos::PixelPos
constexpr PixelPos(int row, int col)
Definition: SiPixelCluster.h:56
SiPixelCluster::Shift::dy_
int dy_
Definition: SiPixelCluster.h:49
SiPixelCluster::getSplitClusterErrorY
float getSplitClusterErrorY() const
Definition: SiPixelCluster.h:194
SiPixelCluster::Shift
Definition: SiPixelCluster.h:40
SiPixelCluster::Pixel::y
uint16_t y
Definition: SiPixelCluster.h:35
SiPixelCluster::setOriginalId
void setOriginalId(uint16_t id)
Definition: SiPixelCluster.h:198
SiPixelCluster::thePixelOffset
std::vector< uint8_t > thePixelOffset
Definition: SiPixelCluster.h:201
SiPixelCluster::size
int size() const
Definition: SiPixelCluster.h:126
SiPixelCluster::pixel
Pixel pixel(int i) const
Definition: SiPixelCluster.h:162
DetSetVector.h
SiPixelCluster::MAXPOS
static constexpr unsigned int MAXPOS
Definition: SiPixelCluster.h:70
SiPixelCluster::packRow
void packRow(uint16_t xmin, uint16_t xspan)
Definition: SiPixelCluster.h:184
SiPixelCluster::PixelPos::row_
int row_
Definition: SiPixelCluster.h:62
SiPixelCluster::setSplitClusterErrorY
void setSplitClusterErrorY(float erry)
Definition: SiPixelCluster.h:192
SiPixelClusterRefProd
edm::RefProd< SiPixelClusterCollection > SiPixelClusterRefProd
Definition: SiPixelCluster.h:236
edmNew::DetSetVector
Definition: DetSetNew.h:13
Ref.h
L1TOccupancyClient_cfi.ymin
ymin
Definition: L1TOccupancyClient_cfi.py:43
edm::shift
static unsigned const int shift
Definition: LuminosityBlockID.cc:7
edm::DetSetRefVector
Definition: DetSetRefVector.h:50
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:29
SiPixelClusterCollection
edm::DetSetVector< SiPixelCluster > SiPixelClusterCollection
Definition: SiPixelCluster.h:233
SiPixelCluster::PixelPos::row
constexpr int row() const
Definition: SiPixelCluster.h:57
SiPixelCluster::Shift::Shift
constexpr Shift()
Definition: SiPixelCluster.h:43
SiPixelCluster::charge
int charge() const
Definition: SiPixelCluster.h:134
align::Pixel
Definition: StructureType.h:68
SiPixelCluster::pixelOffset
const std::vector< uint8_t > & pixelOffset() const
Definition: SiPixelCluster.h:147
SiPixelCluster::pixels
const std::vector< Pixel > pixels() const
Definition: SiPixelCluster.h:151
SiPixelCluster::Pixel::x
uint16_t x
Definition: SiPixelCluster.h:34
TrackerOfflineValidation_Dqm_cff.xmin
xmin
Definition: TrackerOfflineValidation_Dqm_cff.py:10
SiPixelCluster::originalId
auto originalId() const
Definition: SiPixelCluster.h:197
SiPixelCluster::SiPixelCluster
SiPixelCluster()=default
SiPixelCluster::sizeX
int sizeX() const
Definition: SiPixelCluster.h:129
SiPixelCluster::PixelPos
Definition: SiPixelCluster.h:53
DetSetVectorNew.h
SiPixelClusterRefNew
edm::Ref< SiPixelClusterCollectionNew, SiPixelCluster > SiPixelClusterRefNew
Definition: SiPixelCluster.h:239
SiPixelCluster::Pixel::Pixel
constexpr Pixel()
Definition: SiPixelCluster.h:32
SiPixelCluster::PixelPos::col
constexpr int col() const
Definition: SiPixelCluster.h:58
SiPixelCluster::Shift::dx_
int dx_
Definition: SiPixelCluster.h:48