ATLAS Offline Software
EfexTrexFibrePacker.cxx
Go to the documentation of this file.
2 
3 #include <iostream>
4 #include <cstdlib>
5 #include <cmath>
6 #include <map>
7 
8 
9 std::vector<FibrePackerBase::myDataWord> EfexTrexFibrePacker::getPackedData(const std::vector<myDataWord>& inFrame,
10  myDataWord bcNumber,
11  InputDataFrameType frameType) const {
12 
13  std::vector<myDataWord> dataToLoad(FexDefs::num32BitWordsPerFibre(),0);
14  auto supercells = inFrame;
15 
16  switch(frameType){
17 
18  case InputDataFrameType::Normal: // Standard data pattern
19  {
20  for(auto& icell:supercells)
21  icell = icell & 0x3ff; // truncate to 10 bits
22 
23  myDataWord bcId = bcNumber & 0x7f ; // 7 bits from BCID
24  myDataWord bcIdFull = bcNumber & 0xfff; // full 12 bit BCID
25  myDataWord bcId02 = bcId & 0x7;
26  myDataWord bcId34 = (bcId >> 3) & 0x3;
27  myDataWord bcId56 = (bcId >> 5) & 0x3;
28 
29  dataToLoad.at(0) = (bcId56 << 8) | ((supercells.at(0)&0xff) <<10) |
30  ((supercells.at(1)&0xff) << 20) | (bcId34 << 30);
31  dataToLoad.at(1) = (supercells.at(2)&0xff) | ((supercells.at(3)&0xff) << 10) |
32  ((supercells.at(4)&0xff) << 20);
33  dataToLoad.at(2) = (supercells.at(5)&0xff) | ((supercells.at(6)&0xff) << 10) |
34  ((supercells.at(7)&0xff) << 20);
35  dataToLoad.at(3) = (supercells.at(8)&0xff) | ((supercells.at(9)&0xff) << 10) |
36  ((supercells.at(10)&0xff) << 20);
37  dataToLoad.at(4) = (supercells.at(11)&0xff) | ((supercells.at(12)&0xff) << 10) |
38  ((supercells.at(13)&0xff) << 20);
39  dataToLoad.at(5) = (supercells.at(14)&0xff) | ((supercells.at(15)&0xff) << 10) ;
40  dataToLoad.at(6) = bcIdFull | bcId02 << 20;
41 
42  myDataWord tempCRC = crc9d32(dataToLoad,6l,true); // calculate CRC32 on first 6 words
43  myDataWord myCRCReminder = crc9d23(dataToLoad[6],tempCRC,true); // CRC23 on the last word
44 
45  dataToLoad.at(0) = K_28_5 | dataToLoad.at(0) ; // add K-character
46  dataToLoad[6] = dataToLoad[6] | ( myCRCReminder << 23) ; // add CRC check
47 
48  break;
49  }
50  case InputDataFrameType::Alignement: // Special pattern, LATOME alignement/mapping frame
51  {
52 
53  myDataWord bcId = bcNumber & 0xfff ; // 12 bits of BCID
54 
55  dataToLoad.at(6) = bcId;
56  dataToLoad.at(0) = (K_28_0 << 8) | dataToLoad.at(0) ; // add K_28_0 -character, used for CRC calculation
57 
58  myDataWord tempCRC = crc9d32(dataToLoad,6l,true); // calculate CRC32 on first 6 words
59  myDataWord myCRCReminder = crc9d23(dataToLoad[6],tempCRC,true); // CRC23 on the last word
60 
61  dataToLoad.at(0) = K_28_5 | dataToLoad.at(0) ; // add K-character
62  dataToLoad[6] = dataToLoad[6] | ( myCRCReminder << 23) ; // add CRC check to the famous last word
63 
64  break;
65  }
66  }
67 
68  return dataToLoad;
69 
70 }
71 
72 std::vector<FibrePackerBase::myDataWord> EfexTrexFibrePacker::getPackedControl(const std::vector<myDataWord>& /*inFrame*/,
73  myDataWord /*bcNumber*/,
74  InputDataFrameType frameType) const {
75 
76  std::vector<myDataWord> controlWords(FexDefs::num32BitWordsPerFibre(),0);
77 
78  switch(frameType){
79 
80  case InputDataFrameType::Normal: // one K character in first data word
81  controlWords.at(0) = 0x1;
82  break;
83 
84  case InputDataFrameType::Alignement: // two K characters in first data word
85  controlWords.at(0) = 0x3;
86  break;
87 
88  }
89 
90  return controlWords;
91 }
92 
93 bool EfexTrexFibrePacker::checkCRC(const std::vector<myDataWord>& encodedData,
94  InputDataFrameType frameType) const {
95 
96  auto inputData = encodedData;
97  myDataWord CRCCheck = 0;
98 
99  switch(frameType){
100 
101  case InputDataFrameType::Normal: // one K character in first data word
102  inputData.at(0) = inputData.at(0) & 0xffffff00;
103  CRCCheck = crc9d32(inputData,7l,true); // calculate CRC32 on first 6 words
104  break;
105 
106  case InputDataFrameType::Alignement: // two K characters in first data word, mask the first one
107  inputData.at(0) = inputData.at(0) & 0xffffff00;
108  CRCCheck = crc9d32(inputData,7l,true); // calculate CRC32 on first 6 words
109  break;
110 
111  }
112 
113  return (CRCCheck == 0);
114 }
115 
116 FibrePackerBase::myDataWord EfexTrexFibrePacker::getBcNumber(const std::vector<myDataWord>& encodedData,
117  InputDataFrameType /*frameType*/) const {
118  myDataWord BcNumber = encodedData.at(6) & 0xfff;
119  return BcNumber;
120 }
121 
123  // BC number is the full 12 bits from any frame.
124  return 0xfff;
125 }
126 
127 std::vector<FibrePackerBase::myDataWord> EfexTrexFibrePacker::getUnpackedData(const std::vector<myDataWord>& encodedData,
128  InputDataFrameType frameType) const {
129  std::vector<myDataWord> unpackedData;
130 
131  switch(frameType){
132 
134  {
135  std::vector<myDataWord> supercells(EfexDefs::maxSuperCellsPerFibre(),0);
136 
137  supercells.at(0) = (encodedData.at(0) >> 10) & 0x3ff;
138  supercells.at(1) = (encodedData.at(0) >> 20) & 0x3ff;
139  supercells.at(2) = (encodedData.at(1) ) & 0x3ff;
140  supercells.at(3) = (encodedData.at(1) >> 10) & 0x3ff;
141  supercells.at(4) = (encodedData.at(1) >> 20) & 0x3ff;
142  supercells.at(5) = (encodedData.at(2) ) & 0x3ff;
143  supercells.at(6) = (encodedData.at(2) >> 10) & 0x3ff;
144  supercells.at(7) = (encodedData.at(2) >> 20) & 0x3ff;
145  supercells.at(8) = (encodedData.at(3) ) & 0x3ff;
146  supercells.at(9) = (encodedData.at(3) >> 10) & 0x3ff;
147  supercells.at(10) = (encodedData.at(3) >> 20) & 0x3ff;
148  supercells.at(11) = (encodedData.at(4) ) & 0x3ff;
149  supercells.at(12) = (encodedData.at(4) >> 10) & 0x3ff;
150  supercells.at(13) = (encodedData.at(4) >> 20) & 0x3ff;
151  supercells.at(14) = (encodedData.at(5) ) & 0x3ff;
152  supercells.at(15) = (encodedData.at(5) >> 10) & 0x3ff;
153 
154  unpackedData=supercells;
155  break;
156  }
158  {
159  break; // no hyper data in the frame
160  }
161  }
162 
163  return unpackedData;
164 
165 }
166 
FexDefs::num32BitWordsPerFibre
static int num32BitWordsPerFibre()
Definition: FexDefs.h:17
EfexTrexFibrePacker.h
WriteCellNoiseToCool.icell
icell
Definition: WriteCellNoiseToCool.py:339
FibrePackerBase::K_28_5
myDataWord K_28_5
Definition: FibrePackerBase.h:30
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
EfexTrexFibrePacker::getBcNumber
virtual myDataWord getBcNumber(const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
Definition: EfexTrexFibrePacker.cxx:116
EfexDefs::maxSuperCellsPerFibre
static int maxSuperCellsPerFibre()
Definition: EfexDefs.h:27
FibrePackerBase::K_28_0
myDataWord K_28_0
Definition: FibrePackerBase.h:32
FibrePackerBase::crc9d32
virtual myDataWord crc9d32(const std::vector< myDataWord > &inwords, size_t num_words, bool bit_reverse) const
Definition: FibrePackerBase.cxx:37
EfexTrexFibrePacker::getBcMask
virtual myDataWord getBcMask(InputDataFrameType frameType) const override
Definition: EfexTrexFibrePacker.cxx:122
EfexTrexFibrePacker::getUnpackedData
virtual std::vector< myDataWord > getUnpackedData(const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
Function unpacking the data from LATOME format, either standard or alignement frame.
Definition: EfexTrexFibrePacker.cxx:127
EfexTrexFibrePacker::getPackedControl
virtual std::vector< myDataWord > getPackedControl(const std::vector< myDataWord > &inFrame, myDataWord bcNumber, InputDataFrameType frameType) const override
Function returning control words.
Definition: EfexTrexFibrePacker.cxx:72
bcId
uint16_t bcId(uint32_t data)
Definition: TgcByteStreamData.h:329
EfexTrexFibrePacker::getPackedData
virtual std::vector< myDataWord > getPackedData(const std::vector< myDataWord > &inFrame, myDataWord bcNumber, InputDataFrameType frameType) const override
Function packing the data into the LATOME format, either standard or alignement frame.
Definition: EfexTrexFibrePacker.cxx:9
EfexTrexFibrePacker::checkCRC
virtual bool checkCRC(const std::vector< myDataWord > &encodedData, InputDataFrameType frameType) const override
Definition: EfexTrexFibrePacker.cxx:93
FibrePackerBase::InputDataFrameType::Alignement
@ Alignement
Special mapping/alignement frame.
FibrePackerBase::InputDataFrameType
InputDataFrameType
type of input data frame
Definition: FibrePackerBase.h:37
FibrePackerBase::myDataWord
uint32_t myDataWord
Definition: FibrePackerBase.h:25
FibrePackerBase::crc9d23
virtual myDataWord crc9d23(myDataWord inword, myDataWord in_crc, bool bit_reverse) const
Definition: FibrePackerBase.cxx:108
FibrePackerBase::InputDataFrameType::Normal
@ Normal
Standard data frame.