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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#ifndef DTRawToDigi_DTROChainCoding_h
#define DTRawToDigi_DTROChainCoding_h
/** \class DTROChainCoding
* A class for handling the DT Read-out chain.
*
* \author M. Zanetti - INFN Padova
*/
#include <DataFormats/DTDigi/interface/DTDDUWords.h>
#include <vector>
#include <cstdint>
/// FIXEME:
/*
A major problem is the numbering of the
RO componenets: do they all start from 0?
I think yes but mapping and coding (THIS class)
must be arranged accordingly.
So far TDC channels and ID are bound to start from 0
whereas ROB, ROS and DDU are free to start from 0
or from 1. This has to be coded into the map
*/
class DTROChainCoding {
public:
/// Constructors
DTROChainCoding() : code(0) {}
DTROChainCoding(const int& ddu, const int& ros, const int& rob, const int& tdc, const int& channel) {
code = ddu << DDU_SHIFT | ros << ROS_SHIFT | rob << ROB_SHIFT | tdc << TDC_SHIFT | channel << CHANNEL_SHIFT;
}
DTROChainCoding(uint32_t code_) : code(code_) {}
/// Destructor
virtual ~DTROChainCoding() {}
/// Setters ///////////////////////
inline void setCode(const uint32_t& code_) { code = code_; }
inline void setChain(const int& ddu, const int& ros, const int& rob, const int& tdc, const int& channel) {
code = ddu << DDU_SHIFT | ros << ROS_SHIFT | rob << ROB_SHIFT | tdc << TDC_SHIFT | channel << CHANNEL_SHIFT;
}
/// need to reset the bits before setting
inline void setDDU(const int& ID) { code = (code & (~(DDU_MASK << DDU_SHIFT))) | (ID << DDU_SHIFT); }
inline void setROS(const int& ID) { code = (code & (~(ROS_MASK << ROS_SHIFT))) | (ID << ROS_SHIFT); }
inline void setROB(const int& ID) { code = (code & (~(ROB_MASK << ROB_SHIFT))) | (ID << ROB_SHIFT); }
inline void setTDC(const int& ID) { code = (code & (~(TDC_MASK << TDC_SHIFT))) | (ID << TDC_SHIFT); }
inline void setChannel(const int& ID) { code = (code & (~(CHANNEL_MASK << CHANNEL_SHIFT))) | (ID << CHANNEL_SHIFT); }
/// Getters ///////////////////////
inline uint32_t getCode() const { return code; }
inline int getDDU() const { return (code >> DDU_SHIFT) & DDU_MASK; }
inline int getDDUID() const { return (code >> DDU_SHIFT); }
inline int getROS() const { return (code >> ROS_SHIFT) & ROS_MASK; }
inline int getROSID() const { return (code >> ROS_SHIFT); }
inline int getROB() const { return (code >> ROB_SHIFT) & ROB_MASK; }
inline int getROBID() const { return (code >> ROB_SHIFT); }
inline int getTDC() const { return (code >> TDC_SHIFT) & TDC_MASK; }
inline int getTDCID() const { return (code >> TDC_SHIFT); }
inline int getChannel() const { return (code >> CHANNEL_SHIFT) & CHANNEL_MASK; }
inline int getChannelID() const { return (code >> CHANNEL_SHIFT); }
/// SC getters: same as ROS getters (SC data goes in the corresponding ROS)
inline int getSC() const { return (code >> ROS_SHIFT) & ROS_MASK; }
inline int getSCID() const { return (code >> ROS_SHIFT); }
private:
uint32_t code;
// First shift the bits then apply the mask
// ddu bit are the last ones. I DONT CARE if the ID is > than 730 (I always get the lsb)
static const int DDU_SHIFT = 16;
static const int DDU_MASK = 0x3FF;
static const int ROS_SHIFT = 12;
static const int ROS_MASK = 0xF;
static const int ROB_SHIFT = 7;
static const int ROB_MASK = 0x1F;
static const int TDC_SHIFT = 5;
static const int TDC_MASK = 0x3;
static const int CHANNEL_SHIFT = 0;
static const int CHANNEL_MASK = 0x1F;
};
#endif
|