ATLAS Offline Software
Loading...
Searching...
No Matches
TileDigits2Bytes Class Reference

This class converts TileDigits to and from bytestream in ROD format. More...

#include <TileDigits2Bytes.h>

Collaboration diagram for TileDigits2Bytes:

Public Member Functions

 TileDigits2Bytes ()
int getBytes (const TileDigits *digi, const TileHWID *tileHWID, std::vector< unsigned int > &v)
std::array< std::vector< float >, 3 > getDigits (const uint32_t *data, int dataWordsPerChip) const
 Extract samples(digits) for 3 channels, stored in 9 words.
int getBCID (const uint32_t *data, int chipCount, int wordsPerChip) const
 Get BCID from Chip header, bit 0-11.
int getDigiMode (const uint32_t *data, int chipCount, int wordsPerChip) const
 Determine digitizer mode for a number of channels.
int getGain (const uint32_t *data, int chan) const
 Extract gain for <chip> in chip header.
bool checkWordParity (const uint32_t *data) const
 Verify ODD parity for one word.
uint32_t calculateParity (const uint32_t *data) const
 Calculate parity for one word.
uint32_t checkParity (const uint32_t *data, int length) const
 Verify parity for <length> words.
bool checkStartBit (const uint32_t *data, int length, uint32_t startbit) const
 Check that the MSB of <length> words are equal to LSB of <startbit>
void setVerbose (bool verbose)

Private Attributes

bool m_verbose

Detailed Description

This class converts TileDigits to and from bytestream in ROD format.

Author
Alexander Solodkov

Definition at line 20 of file TileDigits2Bytes.h.

Constructor & Destructor Documentation

◆ TileDigits2Bytes()

TileDigits2Bytes::TileDigits2Bytes ( )
inline

Definition at line 24 of file TileDigits2Bytes.h.

24: m_verbose(false) {}

Member Function Documentation

◆ calculateParity()

uint32_t TileDigits2Bytes::calculateParity ( const uint32_t * data) const
inline

Calculate parity for one word.

Parameters
dataPointer to word
Returns
Parity as LSB

Definition at line 133 of file TileDigits2Bytes.cxx.

133 {
134 uint32_t res = *data;
135 res ^= ((*data) >> 1);
136 res ^= (res >> 2);
137 res ^= (res >> 4);
138 res ^= (res >> 8);
139 res ^= (res >> 16);
140
141 return (res & 0x1);
142}
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
std::pair< std::vector< unsigned int >, bool > res
setEventNumber uint32_t

◆ checkParity()

uint32_t TileDigits2Bytes::checkParity ( const uint32_t * data,
int length ) const
inline

Verify parity for <length> words.

The parity bit for each word is stored in an unsigned int LSB is parity bit from first word and so on.

Parameters
dataPointer to first data word
lengthNumber of data words
Returns
Result of check.

Definition at line 145 of file TileDigits2Bytes.cxx.

145 {
146 uint32_t result = 0, tmp;
147 for(int n=0;n<length;++n) {
148 tmp = data[n] ^ (data[n]>> 1);
149 tmp ^= (tmp >> 2);
150 tmp ^= (tmp >> 4);
151 tmp ^= (tmp >> 8);
152 tmp ^= (tmp >> 16);
153 result |= (tmp & 0x1)<<n;
154 }
155 return result;
156}
double length(const pvec &v)

◆ checkStartBit()

bool TileDigits2Bytes::checkStartBit ( const uint32_t * data,
int length,
uint32_t startbit ) const
inline

Check that the MSB of <length> words are equal to LSB of <startbit>

MSB of datawords should is checked.

Parameters
dataPointer to forst data word
lengthNumber of words to check
startbitWord with LSB to check against
Returns
If all words were correct

Definition at line 162 of file TileDigits2Bytes.cxx.

162 {
163 bool result = true;
164 for(int i=0;result && (i<length);++i) {
165 result = (data[i]>>31 == startbit);
166 }
167 return result;
168}

◆ checkWordParity()

bool TileDigits2Bytes::checkWordParity ( const uint32_t * data) const
inline

Verify ODD parity for one word.

Parameters
dataPointer to data word
Returns
If word has even parity (bool)

Definition at line 128 of file TileDigits2Bytes.cxx.

128 {
129 return (calculateParity(data) == 1);
130}
uint32_t calculateParity(const uint32_t *data) const
Calculate parity for one word.

◆ getBCID()

int TileDigits2Bytes::getBCID ( const uint32_t * data,
int chipCount,
int wordsPerChip ) const

Get BCID from Chip header, bit 0-11.

Go through all chip headers, check their parity and extract BCID from them (bits 0-11)

Parameters
dataPointer to first word
chipCountNumber of chips
wordsPerChipNumber of data words per chip
Returns
BCID from chip header with good parity

Definition at line 65 of file TileDigits2Bytes.cxx.

65 {
66 int BCID = 0, n;
67 int modeFound = 0;
68 const uint32_t *wordPtr = data;
69
70 for(n=0; modeFound<5 && n<chipCount;++n) {
71 if(checkWordParity(wordPtr)) {
72 BCID = (*wordPtr) & 0xfff;
73 // this is correct if header has MSB 1 and next word has MSB 0
74 if (((wordPtr[0]>>31) == 1) && ((wordPtr[1]>>31) == 0)) ++modeFound;
75 }
76 wordPtr += wordsPerChip;
77 }
78 // if no valid mode found, take BCID from first chip
79 if(0 == modeFound) BCID = (*data & 0xfff);
80
81 return BCID;
82}
bool checkWordParity(const uint32_t *data) const
Verify ODD parity for one word.

◆ getBytes()

int TileDigits2Bytes::getBytes ( const TileDigits * digi,
const TileHWID * tileHWID,
std::vector< unsigned int > & v )

Definition at line 12 of file TileDigits2Bytes.cxx.

12 { // Salukvadze
13 int chID = tileHWID->channel(digi->adc_HWID());
14 int gain = (tileHWID->is_low_gain(digi->adc_HWID()) ? 0 : 1);
15 std::vector<float> digits = digi->samples();
16 unsigned int w;
17 w = (gain << 15) + (digits.size() << 8) + chID;
18 for (unsigned int i=0; i+1<digits.size(); i+=2) {
19 w += (int)digits[i] << 16;
20 v.push_back(w);
21 w = (int)digits[i+1];
22 }
23 if (digits.size() % 2 != 0) {
24 w += (int)digits[digits.size()-1] << 16;
25 v.push_back(w);
26 } else {
27 v.push_back(w);
28 }
29 return digits.size() / 2 + 1;
30
31}
const std::vector< float > & samples() const
Definition TileDigits.h:58
int channel(const HWIdentifier &id) const
extract channel field from HW identifier
Definition TileHWID.h:189
bool is_low_gain(const HWIdentifier &id) const
Test ID for low gain.
Definition TileHWID.cxx:98
HWIdentifier adc_HWID(void) const
Definition TileRawData.h:53

◆ getDigiMode()

int TileDigits2Bytes::getDigiMode ( const uint32_t * data,
int chipCount,
int wordsPerChip ) const

Determine digitizer mode for a number of channels.

Go through all chip headers, check their parity and extract digi mode from them (bit 15,16)

Parameters
dataPointer to first word
chipCountNumber of chips
wordsPerChipNumber of data words per chip
Returns
Digitizer mode

Definition at line 89 of file TileDigits2Bytes.cxx.

89 {
90 int digiMode = -1, n;
91 bool modeFound = false;
92 const uint32_t *wordPtr = data;
93
94 for(n=0;!modeFound && n<chipCount;++n) {
95 if(checkWordParity(wordPtr)) {
96 digiMode = ((*wordPtr)>>15) & 0x3;
97 // this is correct if header has MSB 1 and next word has MSB 0
98 modeFound = ((wordPtr[0]>>31) == 1) && ((wordPtr[1]>>31) == 0);
99 }
100 wordPtr += wordsPerChip;
101 }
102 // if no valid mode found, ignore parity
103 if(!modeFound) {
104 wordPtr = data;
105 for(n=0;!modeFound && n<chipCount;++n) {
106 digiMode = ((*wordPtr)>>15) & 0x3;
107 // this is correct if header has MSB 1 and next word has MSB 0
108 modeFound = ((wordPtr[0]>>31) == 1) && ((wordPtr[1]>>31) == 0);
109 wordPtr += wordsPerChip;
110 }
111 }
112 // if still no valid mode found
113 if(!modeFound) {
114 if(m_verbose) std::cout<<"<TileD2B> No valid header found, assuming normal mode!"<<std::endl;
115 digiMode = -1;
116 }
117 else if(m_verbose) {
118 if(digiMode > 0) n <<= 1;
119 if(checkWordParity(wordPtr)) std::cout<<"<TileD2B> DigiMode "<<digiMode<<" found in chip header "<<n<<std::endl;
120 else std::cout<<"<TileD2B> DigiMode "<<digiMode<<" found in chip header "<<n<<" with BAD PARITY"<<std::endl;
121 if(digiMode > 0) std::cout<<"<TileD2B> Calibration mode selected!"<<std::endl;
122 }
123
124 return digiMode;
125}

◆ getDigits()

std::array< std::vector< float >, 3 > TileDigits2Bytes::getDigits ( const uint32_t * data,
int dataWordsPerChip ) const

Extract samples(digits) for 3 channels, stored in 9 words.

Parameters
dataPointer to ROD-data

Definition at line 35 of file TileDigits2Bytes.cxx.

35 {
36 // create new containers on the heap
37 std::array< std::vector<float>, 3 > digiVec;
38
39 digiVec[0].reserve(dataWordsPerChip);
40 digiVec[1].reserve(dataWordsPerChip);
41 digiVec[2].reserve(dataWordsPerChip);
42
43 for(int sampl=0;sampl<dataWordsPerChip;++sampl) {
44 int word = (*data); ++data;
45 digiVec[0].push_back((float)(word & 0x3ff));
46 digiVec[1].push_back((float)((word>>10) & 0x3ff));
47 digiVec[2].push_back((float)((word>>20) & 0x3ff));
48 }
49 return digiVec;
50}

◆ getGain()

int TileDigits2Bytes::getGain ( const uint32_t * data,
int chan ) const

Extract gain for <chip> in chip header.

Gain bits are bit 12-14 in chip header.

Parameters
dataPointer to chip header word
chanis channel number in chip (0-2) return 0-low gain, 1-high gain

Bit 12 corresponds to chan with lowest #.

Definition at line 56 of file TileDigits2Bytes.cxx.

56 {
57 return ((*data)>>(12+chan)) & 0x1;
58}

◆ setVerbose()

void TileDigits2Bytes::setVerbose ( bool verbose)
inline

Definition at line 92 of file TileDigits2Bytes.h.

bool verbose
Definition hcg.cxx:73

Member Data Documentation

◆ m_verbose

bool TileDigits2Bytes::m_verbose
private

Definition at line 96 of file TileDigits2Bytes.h.


The documentation for this class was generated from the following files: