1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#ifndef CTPPS_CTPPSDigi_CTPPSPixelDigi_h
#define CTPPS_CTPPSDigi_CTPPSPixelDigi_h
/**
* Persistent digi for CTPPS Pixels.
* Author: F.Ferro ferro@ge.infn.it
*/
#include "FWCore/Utilities/interface/Exception.h"
class CTPPSPixelDigi {
public:
CTPPSPixelDigi(int packed_value) : theData(packed_value) {}
CTPPSPixelDigi(int row, int col, int adc) { init(row, col, adc); }
CTPPSPixelDigi(int chan, int adc) {
std::pair<int, int> rc = channelToPixel(chan);
init(rc.first, rc.second, adc);
}
CTPPSPixelDigi() : theData(0) {}
/// Access to digi information
int row() const { return (theData >> row_shift) & row_mask; }
int column() const { return (theData >> column_shift) & column_mask; }
unsigned short adc() const { return (theData >> adc_shift) & adc_mask; }
uint32_t packedData() const { return theData; }
static std::pair<int, int> channelToPixel(int ch) {
int row = (ch >> column_width_ch) & row_mask_ch;
int col = ch & column_mask_ch;
return std::pair<int, int>(row, col);
}
static int pixelToChannel(int row, int col) { return (row << column_width_ch) | col; }
int channel() const { return pixelToChannel(row(), column()); }
/// const values for digi packing with bit structure: adc_bits+col_bits+row_bits
static const uint32_t row_shift, column_shift, adc_shift;
static const uint32_t row_mask, column_mask, adc_mask, rowcol_mask;
static const uint32_t row_width, column_width, adc_width;
static const uint32_t max_row, max_column, max_adc;
/// const values for channel definition with bit structure: row_bits+col_bits
static const uint32_t column_width_ch;
static const uint32_t column_mask_ch;
static const uint32_t row_mask_ch;
private:
void init(int row, int col, int adc);
uint32_t theData;
};
/// Comparison operator
inline bool operator<(const CTPPSPixelDigi& one, const CTPPSPixelDigi& other) {
return (one.packedData() & CTPPSPixelDigi::rowcol_mask) < (other.packedData() & CTPPSPixelDigi::rowcol_mask);
}
#include <iostream>
inline std::ostream& operator<<(std::ostream& o, const CTPPSPixelDigi& digi) {
return o << " " << digi.row() << " " << digi.column() << " " << digi.adc();
}
#endif
|