ATLAS Offline Software
Public Types | Public Member Functions | Public Attributes | List of all members
EfexTobPacker Class Reference

#include <EfexTobPacker.h>

Inheritance diagram for EfexTobPacker:
Collaboration diagram for EfexTobPacker:

Public Types

enum  InputDataFrameType { InputDataFrameType::Normal, InputDataFrameType::Alignement }
 type of input data frame More...
 
using myDataWord = uint32_t
 

Public Member Functions

 EfexTobPacker ()
 Class implementing packing and unpacking data into eFex TOB format. More...
 
virtual ~EfexTobPacker ()
 
virtual std::vector< myDataWordgetPackedData (const std::vector< myDataWord > &inFrame, myDataWord bcNumber, InputDataFrameType frameType) const override
 Function taking SC energies and other stuff and packing them into a data packet. More...
 
virtual std::vector< myDataWordgetPackedControl (const std::vector< myDataWord > &inFrame, myDataWord bcNumber, InputDataFrameType frameType) const override
 Function returning control words. More...
 
virtual bool checkCRC (const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
 
virtual myDataWord getBcNumber (const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
 
virtual myDataWord getBcMask (InputDataFrameType) const override
 
virtual std::vector< myDataWordgetUnpackedData (const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
 
virtual myDataWord crc9full (const std::vector< myDataWord > &inwords, size_t num_bits) const
 Functions calculating CRC over input data. More...
 
virtual myDataWord crc9d32 (const std::vector< myDataWord > &inwords, size_t num_words, bool bit_reverse) const
 
virtual myDataWord crc9d23 (myDataWord inword, myDataWord in_crc, bool bit_reverse) const
 

Public Attributes

myDataWord K_28_5 = 0xbc
 
myDataWord K_28_1 = 0x3c
 
myDataWord K_28_0 = 0x1c
 

Detailed Description

Definition at line 10 of file EfexTobPacker.h.

Member Typedef Documentation

◆ myDataWord

using FibrePackerBase::myDataWord = uint32_t
inherited

Definition at line 25 of file FibrePackerBase.h.

Member Enumeration Documentation

◆ InputDataFrameType

type of input data frame

Enumerator
Normal 

Standard data frame.

Alignement 

Special mapping/alignement frame.

Definition at line 37 of file FibrePackerBase.h.

37  {
38  Normal,
39  Alignement
40  };

Constructor & Destructor Documentation

◆ EfexTobPacker()

EfexTobPacker::EfexTobPacker ( )
inline

Class implementing packing and unpacking data into eFex TOB format.

This is a relatively simple packing class

Definition at line 18 of file EfexTobPacker.h.

18 {}

◆ ~EfexTobPacker()

virtual EfexTobPacker::~EfexTobPacker ( )
inlinevirtual

Definition at line 19 of file EfexTobPacker.h.

19 {}

Member Function Documentation

◆ checkCRC()

bool EfexTobPacker::checkCRC ( const std::vector< myDataWord > &  encodedData,
InputDataFrameType  frameType 
) const
overridevirtual

Implements FibrePackerBase.

Definition at line 36 of file EfexTobPacker.cxx.

37 {
38  auto inputData = encodedData;
39  inputData.at(0) = inputData.at(0) & 0xffffff00;
40  // calculate CRC on 224 bits = 7*32 bit words
41  return (crc9full(inputData,224) == 0);
42 }

◆ crc9d23()

FibrePackerBase::myDataWord FibrePackerBase::crc9d23 ( FibrePackerBase::myDataWord  inword,
myDataWord  in_crc,
bool  bit_reverse 
) const
virtualinherited

CRC9D23 as specified in LAr VHDL

Function does CRC9D23 calculation. Thanslated from LATOME VHDL to python by Ed Flaherty, then to c++ by jb

Definition at line 111 of file FibrePackerBase.cxx.

111  {
112 
121  long int mask = 0x00000001;
122  long int crc_word = 0x000;
123 
124 
125  //d_in_s is a '23-bit input word'
126 
127  std::vector<long int> d_in_s(23,0);
128  std::vector<long int> crc_in_s(9,0);
129  std::vector<long int> crc_r(9,0);
130 
131  // crc calculation
132 
133  if (bit_reverse){
134 
135  for(int i=0; i!= 23; i++){
136  d_in_s[22-i] = inword & (mask << i);
137  d_in_s[22-i] = d_in_s[22-i] >> i;
138  }
139 
140  for(int i=0; i!= 9; i++){
141  crc_in_s[8-i] = in_crc & (mask << i);
142  crc_in_s[8-i] = crc_in_s[8-i] >> i;
143  }
144 
145  } else {
146 
147  for(int i=0; i!= 23; i++){
148  d_in_s[i] = inword & (mask << i);
149  d_in_s[i] = d_in_s[i] >> i;
150  }
151 
152  for(int i=0; i!= 9; i++){
153  crc_in_s[i] = in_crc & (mask << i);
154  crc_in_s[i] = crc_in_s[i] >> i;
155  }
156  }
157 
158  crc_r[0] = crc_in_s[1] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[6] ^ crc_in_s[7] ^ crc_in_s[8] ^ d_in_s[0] ^ d_in_s[2] ^ d_in_s[3] ^ d_in_s[5] ^ d_in_s[6] ^ d_in_s[7] ^ d_in_s[8] ^ d_in_s[9] ^ d_in_s[10] ^ d_in_s[11] ^ d_in_s[15] ^ d_in_s[18] ^ d_in_s[19] ^ d_in_s[20] ^ d_in_s[21] ^ d_in_s[22];
159  crc_r[1] = crc_in_s[1] ^ crc_in_s[2] ^ crc_in_s[4] ^ d_in_s[0] ^ d_in_s[1] ^ d_in_s[2] ^ d_in_s[4] ^ d_in_s[5] ^ d_in_s[12] ^ d_in_s[15] ^ d_in_s[16] ^ d_in_s[18];
160  crc_r[2] = crc_in_s[2] ^ crc_in_s[3] ^ crc_in_s[5] ^ d_in_s[1] ^ d_in_s[2] ^ d_in_s[3] ^ d_in_s[5] ^ d_in_s[6] ^ d_in_s[13] ^ d_in_s[16] ^ d_in_s[17] ^ d_in_s[19];
161  crc_r[3] = crc_in_s[0] ^ crc_in_s[1] ^ crc_in_s[3] ^ crc_in_s[5] ^ crc_in_s[7] ^ crc_in_s[8] ^ d_in_s[0] ^ d_in_s[4] ^ d_in_s[5] ^ d_in_s[8] ^ d_in_s[9] ^ d_in_s[10] ^ d_in_s[11] ^ d_in_s[14] ^ d_in_s[15] ^ d_in_s[17] ^ d_in_s[19] ^ d_in_s[21] ^ d_in_s[22];
162  crc_r[4] = crc_in_s[2] ^ crc_in_s[5] ^ crc_in_s[7] ^ d_in_s[0] ^ d_in_s[1] ^ d_in_s[2] ^ d_in_s[3] ^ d_in_s[7] ^ d_in_s[8] ^ d_in_s[12] ^ d_in_s[16] ^ d_in_s[19] ^ d_in_s[21];
163  crc_r[5] = crc_in_s[1] ^ crc_in_s[3] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[7] ^ d_in_s[0] ^ d_in_s[1] ^ d_in_s[4] ^ d_in_s[5] ^ d_in_s[6] ^ d_in_s[7] ^ d_in_s[10] ^ d_in_s[11] ^ d_in_s[13] ^ d_in_s[15] ^ d_in_s[17] ^ d_in_s[18] ^ d_in_s[19] ^ d_in_s[21];
164  crc_r[6] = crc_in_s[0] ^ crc_in_s[1] ^ crc_in_s[2] ^ crc_in_s[7] ^ d_in_s[0] ^ d_in_s[1] ^ d_in_s[3] ^ d_in_s[9] ^ d_in_s[10] ^ d_in_s[12] ^ d_in_s[14] ^ d_in_s[15] ^ d_in_s[16] ^ d_in_s[21];
165  crc_r[7] = crc_in_s[2] ^ crc_in_s[3] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[6] ^ crc_in_s[7] ^ d_in_s[0] ^ d_in_s[1] ^ d_in_s[3] ^ d_in_s[4] ^ d_in_s[5] ^ d_in_s[6] ^ d_in_s[7] ^ d_in_s[8] ^ d_in_s[9] ^ d_in_s[13] ^ d_in_s[16] ^ d_in_s[17] ^ d_in_s[18] ^ d_in_s[19] ^ d_in_s[20] ^ d_in_s[21];
166  crc_r[8] = crc_in_s[0] ^ crc_in_s[3] ^ crc_in_s[4] ^ crc_in_s[5] ^ crc_in_s[6] ^ crc_in_s[7] ^ crc_in_s[8] ^ d_in_s[1] ^ d_in_s[2] ^ d_in_s[4] ^ d_in_s[5] ^ d_in_s[6] ^ d_in_s[7] ^ d_in_s[8] ^ d_in_s[9] ^ d_in_s[10] ^ d_in_s[14] ^ d_in_s[17] ^ d_in_s[18] ^ d_in_s[19] ^ d_in_s[20] ^ d_in_s[21] ^ d_in_s[22];
167 
168 
169  if (bit_reverse){
170  for(int i=0; i!= 9; i++)
171  crc_word = crc_word | (crc_r[8-i] << i);
172  } else{
173  for(int i=0; i!= 9; i++)
174  crc_word = crc_word | (crc_r[i] << i);
175  }
176 
177  return (crc_word);
178 
179 }

◆ crc9d32()

FibrePackerBase::myDataWord FibrePackerBase::crc9d32 ( const std::vector< myDataWord > &  inwords,
size_t  num_words,
bool  bit_reverse = true 
) const
virtualinherited

CRC9D32 as specified in LAr VHDL

Function does CRC9D32 calculation. Thanslated from LATOME VHDL to python by Ed Flaherty, then to c++ by jb

Definition at line 40 of file FibrePackerBase.cxx.

40  {
48  long int mask = 0x00000001;
49  long int crc_word = 0x000;
50 
51 
52  //d_in_s is a '23-bit input word'
53 
54  std::vector<long int> d_in(32,0);
55  std::vector<long int> crc_s(9,1);
56  std::vector<long int> crc_r(9,1);
57 
58  for(size_t k=0; k != num_words; k++){
59 
60  // 32-bit word crc calculation
61 
62  if (bit_reverse){
63  for(int i=0; i!= 32; i++){
64  d_in [31-i] = inwords.at(k) & (mask << i);
65  d_in[31-i] = d_in[31-i] >> i;
66  }
67  } else {
68  for(int i=0; i!= 32; i++){
69  d_in [i] = inwords.at(k) & (mask << i);
70  d_in[i] = d_in[i] >> i;
71  }
72  }
73 
74  // in the first iteration CRC_S must be set to all 1's: note CRC_R is set to 1's above
75  // then CRC_S must equal the previous CRC_R
76 
77  for(int j=0; j!= 9; j++)
78  crc_s[j] = crc_r[j];
79 
80 
81  crc_r[0]= crc_s[0] ^ crc_s[2] ^ crc_s[3] ^ crc_s[6] ^ crc_s[8] ^ d_in[0] ^ d_in[2] ^ d_in[3] ^ d_in[5] ^ d_in[6] ^ d_in[7] ^ d_in[8] ^ d_in[9] ^ d_in[10] ^ d_in[11] ^ d_in[15] ^ d_in[18] ^ d_in[19] ^ d_in[20] ^ d_in[21] ^ d_in[22] ^ d_in[23] ^ d_in[25] ^ d_in[26] ^ d_in[29] ^ d_in[31];
82  crc_r[1]= crc_s[1] ^ crc_s[2] ^ crc_s[4] ^ crc_s[6] ^ crc_s[7] ^ crc_s[8] ^ d_in[0] ^ d_in[1] ^ d_in[2] ^ d_in[4] ^ d_in[5] ^ d_in[12] ^ d_in[15] ^ d_in[16] ^ d_in[18] ^ d_in[24] ^ d_in[25] ^ d_in[27] ^ d_in[29] ^ d_in[30] ^ d_in[31];
83  crc_r[2]= crc_s[2] ^ crc_s[3] ^ crc_s[5] ^ crc_s[7] ^ crc_s[8] ^ d_in[1] ^ d_in[2] ^ d_in[3] ^ d_in[5] ^ d_in[6] ^ d_in[13] ^ d_in[16] ^ d_in[17] ^ d_in[19] ^ d_in[25] ^ d_in[26] ^ d_in[28] ^ d_in[30] ^ d_in[31];
84  crc_r[3]= crc_s[0] ^ crc_s[2] ^ crc_s[4] ^ d_in[0] ^ d_in[4] ^ d_in[5] ^ d_in[8] ^ d_in[9] ^ d_in[10] ^ d_in[11] ^ d_in[14] ^ d_in[15] ^ d_in[17] ^ d_in[19] ^ d_in[21] ^ d_in[22] ^ d_in[23] ^ d_in[25] ^ d_in[27];
85  crc_r[4]= crc_s[1] ^ crc_s[2] ^ crc_s[5] ^ crc_s[6] ^ crc_s[8] ^ d_in[0] ^ d_in[1] ^ d_in[2] ^ d_in[3] ^ d_in[7] ^ d_in[8] ^ d_in[12] ^ d_in[16] ^ d_in[19] ^ d_in[21] ^ d_in[24] ^ d_in[25] ^ d_in[28] ^ d_in[29] ^ d_in[31];
86  crc_r[5]= crc_s[0] ^ crc_s[7] ^ crc_s[8] ^ d_in[0] ^ d_in[1] ^ d_in[4] ^ d_in[5] ^ d_in[6] ^ d_in[7] ^ d_in[10] ^ d_in[11] ^ d_in[13] ^ d_in[15] ^ d_in[17] ^ d_in[18] ^ d_in[19] ^ d_in[21] ^ d_in[23] ^ d_in[30] ^ d_in[31];
87  crc_r[6]= crc_s[0] ^ crc_s[1] ^ crc_s[2] ^ crc_s[3] ^ crc_s[6] ^ d_in[0] ^ d_in[1] ^ d_in[3] ^ d_in[9] ^ d_in[10] ^ d_in[12] ^ d_in[14] ^ d_in[15] ^ d_in[16] ^ d_in[21] ^ d_in[23] ^ d_in[24] ^ d_in[25] ^ d_in[26] ^ d_in[29];
88  crc_r[7]= crc_s[0] ^ crc_s[1] ^ crc_s[4] ^ crc_s[6] ^ crc_s[7] ^ crc_s[8] ^ d_in[0] ^ d_in[1] ^ d_in[3] ^ d_in[4] ^ d_in[5] ^ d_in[6] ^ d_in[7] ^ d_in[8] ^ d_in[9] ^ d_in[13] ^ d_in[16] ^ d_in[17] ^ d_in[18] ^ d_in[19] ^ d_in[20] ^ d_in[21] ^ d_in[23] ^ d_in[24] ^ d_in[27] ^ d_in[29] ^ d_in[30] ^ d_in[31];
89  crc_r[8]= crc_s[1] ^ crc_s[2] ^ crc_s[5] ^ crc_s[7] ^ crc_s[8] ^ d_in[1] ^ d_in[2] ^ d_in[4] ^ d_in[5] ^ d_in[6] ^ d_in[7] ^ d_in[8] ^ d_in[9] ^ d_in[10] ^ d_in[14] ^ d_in[17] ^ d_in[18] ^ d_in[19] ^ d_in[20] ^ d_in[21] ^ d_in[22] ^ d_in[24] ^ d_in[25] ^ d_in[28] ^ d_in[30] ^ d_in[31];
90 
91  crc_word = 0x000;
92 
93  if (bit_reverse){
94 
95  for(int i=0; i!= 9; i++)
96  crc_word = crc_word | (crc_r[8-i] << i);
97 
98  } else {
99 
100  for(int i=0; i!= 9; i++)
101  crc_word = crc_word | (crc_r[i] << i);
102 
103  }
104 
105  }
106 
107  return (crc_word);
108 
109 }

◆ crc9full()

FibrePackerBase::myDataWord FibrePackerBase::crc9full ( const std::vector< myDataWord > &  inwords,
size_t  num_bits 
) const
virtualinherited

Functions calculating CRC over input data.

CRC9 with polynomial 1011111011 over num_bits bits

Uses a more succinct CRC calculation and flexible in terms of digits, checked versus old code but only supports bit reversal = true

Definition at line 11 of file FibrePackerBase.cxx.

12 {
21  size_t num_words = inwords.size();
22  if ( (num_bits+31)/32 > num_words )
23  {
24  std::cout << "ERROR: not enough words (" << num_words << ") for " << num_bits << "-bit CRC calculation." << std::endl;
25  return 0;
26  }
27  long int val = 0x1ff;
28  for ( size_t i = 0 ; i < num_bits ; ++i )
29  {
30  if ( (inwords.at(i/32)>>(i%32)) & 1 )
31  val ^= 1;
32  if ( val&1 )
33  val ^= 0x37d; // 1101111101 = polynomial reversed
34  val >>= 1;
35  }
36  return val;
37 }

◆ getBcMask()

virtual myDataWord EfexTobPacker::getBcMask ( InputDataFrameType  ) const
inlineoverridevirtual

Implements FibrePackerBase.

Definition at line 26 of file EfexTobPacker.h.

26 { return 0; }

◆ getBcNumber()

FibrePackerBase::myDataWord EfexTobPacker::getBcNumber ( const std::vector< myDataWord > &  encodedData,
InputDataFrameType  frameType 
) const
overridevirtual

Implements FibrePackerBase.

Definition at line 45 of file EfexTobPacker.cxx.

46 {
47  return ((encodedData.at(6)>>8)&0xf);
48 }

◆ getPackedControl()

std::vector< FibrePackerBase::myDataWord > EfexTobPacker::getPackedControl ( const std::vector< myDataWord > &  inFrame,
myDataWord  bcNumber,
InputDataFrameType  frameType 
) const
overridevirtual

Function returning control words.

The control words are used to distinguish between standard data and K characters. Each K character is 8 bit long and can be at one of four positions in 32 bit word. Control words encode location of K characters in 32 bit words, for example 0x1 means K character in the lowest byte, 0x3 means two K-characters in two lowest bytes

Implements FibrePackerBase.

Definition at line 29 of file EfexTobPacker.cxx.

30 {
31  std::vector<myDataWord> controlWords(FexDefs::num32BitWordsPerFibre(),0);
32  return controlWords;
33 }

◆ getPackedData()

std::vector< FibrePackerBase::myDataWord > EfexTobPacker::getPackedData ( const std::vector< myDataWord > &  inFrame,
myDataWord  bcNumber,
InputDataFrameType  frameType 
) const
overridevirtual

Function taking SC energies and other stuff and packing them into a data packet.

Implements FibrePackerBase.

Definition at line 13 of file EfexTobPacker.cxx.

14 {
15  size_t sz = inFrame.size();
16  std::vector<myDataWord> dataToLoad(FexDefs::num32BitWordsPerFibre(),0);
17  for ( size_t i = 0 ; i < sz ; ++i )
18  dataToLoad.at(i) = inFrame.at(i);
19  dataToLoad.at(6) = 0x1000; // Is an eFEX
20  dataToLoad.at(6) |= (bcNumber&0xf)<<8; // Lowest bits of BCID
21  dataToLoad.at(6) |= crc9full(dataToLoad,224)<<23; // Add CRC, 224 = 32*7 = full frame
22  dataToLoad.at(6) |= K_28_5; // add K-character
23 
24  return dataToLoad;
25 
26 }

◆ getUnpackedData()

std::vector< FibrePackerBase::myDataWord > EfexTobPacker::getUnpackedData ( const std::vector< myDataWord > &  encodedData,
InputDataFrameType  frameType 
) const
overridevirtual

Implements FibrePackerBase.

Definition at line 51 of file EfexTobPacker.cxx.

52 {
53  return encodedData;
54 }

Member Data Documentation

◆ K_28_0

myDataWord FibrePackerBase::K_28_0 = 0x1c
inherited

Definition at line 32 of file FibrePackerBase.h.

◆ K_28_1

myDataWord FibrePackerBase::K_28_1 = 0x3c
inherited

Definition at line 31 of file FibrePackerBase.h.

◆ K_28_5

myDataWord FibrePackerBase::K_28_5 = 0xbc
inherited

Definition at line 30 of file FibrePackerBase.h.


The documentation for this class was generated from the following files:
FexDefs::num32BitWordsPerFibre
static int num32BitWordsPerFibre()
Definition: FexDefs.h:17
fitman.sz
sz
Definition: fitman.py:527
ORAlgo::Normal
@ Normal
FibrePackerBase::K_28_5
myDataWord K_28_5
Definition: FibrePackerBase.h:30
python.utils.AtlRunQueryLookup.mask
string mask
Definition: AtlRunQueryLookup.py:459
FibrePackerBase::crc9full
virtual myDataWord crc9full(const std::vector< myDataWord > &inwords, size_t num_bits) const
Functions calculating CRC over input data.
Definition: FibrePackerBase.cxx:11
lumiFormat.i
int i
Definition: lumiFormat.py:85
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
fitman.k
k
Definition: fitman.py:528