CMS 3D CMS Logo

CSCDDUEventData.cc
Go to the documentation of this file.
1 /* CSCDDUEventData.cc
2  * Modified 4/21/03 to get rid of arrays and store all CSC data
3  * in vectors.
4  * A.Tumanov
5  */
6 
9 
10 #include <iostream>
11 #include <cstdio>
12 
14 
15 #ifdef LOCAL_UNPACK
16 bool CSCDDUEventData::debug = false;
17 uint32_t CSCDDUEventData::errMask = 0xFFFFFFFF;
18 #else
19 #include <atomic>
20 std::atomic<bool> CSCDDUEventData::debug{false};
21 std::atomic<uint32_t> CSCDDUEventData::errMask{0xFFFFFFFF};
22 #endif
23 
25 
26 CSCDDUEventData::CSCDDUEventData(const uint16_t* buf, CSCDCCExaminer* examiner) { unpack_data(buf, examiner); }
27 
29 
30 void CSCDDUEventData::add(CSCEventData& cscData, int dmbId, int dduInput, unsigned format_version) {
31  theDDUHeader.setDMBDAV(dduInput);
32  //@@ Tim: The following sets the word which is supposed to be CSCs in error, with bit 15 set for DMB Full
33  //@@ so I think sim should not set it at all
34  //@@ theDDUTrailer.setDMBDAV(dmbId);
35  theDDUHeader.setDMBDAV(dduInput);
36  cscData.dmbHeader()->setdmbID(dmbId);
38  theData.push_back(cscData);
39 }
40 
42 
43 void CSCDDUEventData::decodeStatus(int code) const {
44  // JRG is Jason Gilmore
45  // JRG, low-order 16-bit status (most serious errors):
46  if ((code & errMask) > 0) {
47  // JRG, low-order 16-bit status (most serious errors):
48  if ((code & 0x0000F000) > 0) {
49  if ((0x00008000 & code) > 0)
50  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Critical Error, ** needs reset **";
51  if ((0x00004000 & code) > 0)
52  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Single Error, bad event";
53  if ((0x00002000 & code) > 0)
54  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Single Warning";
55  if ((0x00001000 & code) > 0)
56  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Near Full Warning";
57  }
58  if ((code & 0x00000F00) > 0) {
59  if ((0x00000800 & code) > 0)
60  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU 64-bit Alignment Error";
61  if ((0x00000400 & code) > 0)
62  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Control DLL Error occured";
63  if ((0x00000200 & code) > 0)
64  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU DMB Error occurred";
65  if ((0x00000100 & code) > 0)
66  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Lost In Event Error";
67  }
68  if ((code & 0x000000F0) > 0) {
69  if ((0x00000080 & code) > 0)
70  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Lost In Data Error occurred";
71  if ((0x00000040 & code) > 0)
72  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Timeout Error";
73  if ((0x00000020 & code) > 0)
74  LogTrace("CSCDDUEventData|CSCRawToDigi") << " TMB or ALCT CRC Error";
75  if ((0x00000010 & code) > 0)
76  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Multiple Transmit Errors";
77  }
78  if ((code & 0x0000000F) > 0) {
79  if ((0x00000008 & code) > 0)
80  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Sync Lost or FIFO Full Error";
81  if ((0x00000004 & code) > 0)
82  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Fiber/FIFO Connection Error";
83  if ((0x00000002 & code) > 0)
84  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU L1A Match Error";
85  if ((0x00000001 & code) > 0)
86  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU DMB or CFEB CRC Error";
87  }
88  if ((code & 0xF0000000) > 0) {
89  // JRG, high-order 16-bit status (not-so-serious errors):
90  if ((0x80000000 & code) > 0)
91  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU DMB LCT/DAV/Movlp Mismatch";
92  if ((0x40000000 & code) > 0)
93  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU-CFEB L1 Mismatch";
94  if ((0x20000000 & code) > 0)
95  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU saw no good DMB CRCs";
96  if ((0x10000000 & code) > 0)
97  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU CFEB Count Error";
98  }
99  if ((code & 0x0F000000) > 0) {
100  if ((0x08000000 & code) > 0)
101  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU FirstDat Error";
102  if ((0x04000000 & code) > 0)
103  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU L1A-FIFO Full Error";
104  if ((0x02000000 & code) > 0)
105  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Data Stuck in FIFO";
106  if ((0x01000000 & code) > 0)
107  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU NoLiveFibers Error";
108  }
109  if ((code & 0x00F00000) > 0) {
110  if ((0x00800000 & code) > 0)
111  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Spwd single-bit Warning";
112  if ((0x00400000 & code) > 0)
113  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Input FPGA Error";
114  if ((0x00200000 & code) > 0)
115  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU DAQ Stop bit set";
116  if ((0x00100000 & code) > 0)
117  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU DAQ says Not Ready";
118  if ((0x00300000 & code) == 0x00200000)
119  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU DAQ Applied Backpressure";
120  }
121  if ((code & 0x000F0000) > 0) {
122  if ((0x00080000 & code) > 0)
123  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU TMB Error";
124  if ((0x00040000 & code) > 0)
125  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU ALCT Error";
126  if ((0x00020000 & code) > 0)
127  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Trigger Readout Wordcount Error";
128  if ((0x00010000 & code) > 0)
129  LogTrace("CSCDDUEventData|CSCRawToDigi") << " DDU Trigger L1A Match Error";
130  }
131  }
132 }
133 
134 void CSCDDUEventData::unpack_data(const uint16_t* buf, CSCDCCExaminer* examiner) {
135  // just to calculate length
136  const uint16_t* inputBuf = buf;
137  const uint16_t* inputBuf0 = buf;
138  theData.clear();
139  if (debug)
140  LogTrace("CSCDDUEventData|CSCRawToDigi") << "CSCDDUEventData::unpack_data() is called";
141  if (debug)
142  for (int i = 0; i < 6; ++i) {
143  LogTrace("CSCDDUEventData|CSCRawToDigi")
144  << i << std::hex << buf[4 * i + 3] << buf[4 * i + 2] << buf[4 * i + 1] << buf[4 * i];
145  std::cout << i << " " << std::hex << buf[4 * i + 3] << " " << buf[4 * i + 2] << " " << buf[4 * i + 1] << " "
146  << buf[4 * i] << std::endl;
147  }
148 
150 
151  if (debug) {
152  LogTrace("CSCDDUEventData|CSCRawToDigi") << "size of ddu header in words = " << theDDUHeader.sizeInWords();
153  LogTrace("CSCDDUEventData|CSCRawToDigi") << "sizeof(DDUHeader) = " << sizeof(theDDUHeader);
154  }
155  buf += theDDUHeader.sizeInWords();
156 
157  // if (theDDUHeader.format_version() >= 0x6)
158  if (theDDUHeader.format_version() == 0x7)
159  {
160  theFormatVersion = 2013;
161  } else if (theDDUHeader.format_version() <= 0x6)
162  {
163  theFormatVersion = 2005;
164  } else // Add handling for any other format version
165  {
166  theFormatVersion = 2013;
167  }
168 
169  // we really don't want to copy CSCEventData's while filling the vec
170  theData.clear();
171  theData.reserve(theDDUHeader.ncsc());
172 
173  if (examiner != nullptr) { // Use selective unpacking mode
174 
175  if (debug)
176  LogTrace("CSCDDUEventData|CSCRawToDigi") << "selective unpacking starting";
177 
178  // Find this DDU in examiner's DDUs list
179  DDUIdType dduID = theDDUHeader.source_id();
180 
181  std::map<DDUIdType, std::map<CSCIdType, const uint16_t*> > ddus = examiner->DMB_block();
182  std::map<DDUIdType, std::map<CSCIdType, const uint16_t*> >::iterator ddu_itr = ddus.find(dduID);
183  const uint16_t* dduBlock = (const uint16_t*)((examiner->DDU_block())[dduID]);
184  uint32_t dduBufSize = (examiner->DDU_size())[dduID];
185 
186  if (ddu_itr != ddus.end() && dduBufSize != 0 && dduBlock == inputBuf) {
187  std::map<CSCIdType, const uint16_t*>& cscs = ddu_itr->second;
188  std::map<CSCIdType, const uint16_t*>::iterator csc_itr;
189 
190  for (csc_itr = cscs.begin(); csc_itr != cscs.end(); ++csc_itr) {
191  short cscid = csc_itr->first;
192 
193  if (cscid != -1) {
194  const uint16_t* pos = (const uint16_t*)csc_itr->second;
195 
196  ExaminerStatusType errors = examiner->errorsForChamber(cscid);
197  if ((errors & examiner->getMask()) > 0) {
198  if (debug)
199  LogTrace("CSCDDUEventData|CSCRawToDigi")
200  << "skip unpacking of CSC " << cscid << " due format errors: 0x" << std::hex << errors << std::dec;
201  continue;
202  }
203 
204  theData.push_back(CSCEventData(pos, theFormatVersion));
205  }
206  }
207 
208  if (debug) {
209  LogTrace("CSCDDUEventData|CSCRawToDigi") << "size of vector of cscData = " << theData.size();
210  }
211  // decode ddu tail
212  theDDUTrailer.setFromBuffer(inputBuf + dduBufSize);
213  // memcpy(&theDDUTrailer, dduBlock+(dduBufSize-theDDUTrailer.sizeInWords())*2, theDDUTrailer.sizeInWords()*2);
214  if (debug)
215  LogTrace("CSCDDUEventData|CSCRawToDigi") << theDDUTrailer.check();
217  if ((errorstat & errMask) != 0) {
218  if (theDDUTrailer.check()) {
219  if (debug)
220  LogTrace("CSCDDUEventData|CSCRawToDigi")
221  << "+++ CSCDDUEventData warning: DDU Trailer errors = " << std::hex << errorstat << " +++ ";
222  if (debug)
223  decodeStatus(errorstat);
224  } else {
225  if (debug)
226  LogTrace("CSCDDUEventData|CSCRawToDigi")
227  << " Unpacking lost DDU trailer - check() failed and 8 8 ffff 8 was not found ";
228  }
229  }
230 
231  if (debug) {
232  LogTrace("CSCDDUEventData|CSCRawToDigi") << " Final errorstat " << std::hex << errorstat << std::dec;
233  }
234  // the trailer counts in 64-bit words
235 
236  // theSizeInWords = dduBufSize;
237  // buf=inputBuf+dduBufSize;
238  }
239  theSizeInWords = dduBufSize + 12;
240 
241  } else {
242  while ((((buf[0] & 0xf000) == 0x9000) || ((buf[0] & 0xf000) == 0xa000)) && (buf[3] != 0x8000)) {
243  // ++i;
244  if (debug)
245  LogTrace("CSCDDUEventData|CSCRawToDigi") << "unpack csc data loop started";
246  theData.push_back(CSCEventData(buf));
247  buf += (theData.back()).size();
248  if (debug) {
249  LogTrace("CSCDDUEventData|CSCRawToDigi") << "size of vector of cscData = " << theData.size();
250  }
251  }
252 
253  if (debug) {
254  LogTrace("CSCDDUEventData|CSCRawToDigi") << "unpacking ddu trailer ";
255  LogTrace("CSCDDUEventData|CSCRawToDigi") << std::hex << buf[3] << " " << buf[2] << " " << buf[1] << " " << buf[0];
256  }
257 
258  // decode ddu tail
260  if (debug)
261  LogTrace("CSCDDUEventData|CSCRawToDigi") << theDDUTrailer.check();
263  if ((errorstat & errMask) != 0) {
264  if (theDDUTrailer.check()) {
265  if (debug)
266  LogTrace("CSCDDUEventData|CSCRawToDigi")
267  << "+++ CSCDDUEventData warning: DDU Trailer errors = " << std::hex << errorstat << " +++ ";
268  if (debug)
269  decodeStatus(errorstat);
270  } else {
271  if (debug)
272  LogTrace("CSCDDUEventData|CSCRawToDigi")
273  << " Unpacking lost DDU trailer - check() failed and 8 8 ffff 8 was not found ";
274  }
275  }
276 
277  if (debug)
278  LogTrace("CSCDDUEventData|CSCRawToDigi") << " Final errorstat " << std::hex << errorstat << std::dec;
279  // the trailer counts in 64-bit words
280  buf += theDDUTrailer.sizeInWords();
281 
282  theSizeInWords = buf - inputBuf;
283  }
284 
286  theDDUTrailer0 = inputBuf0[theSizeInWords - 4];
287 }
288 
290  // the trailer counts in 64-bit words
291  if (debug) {
292  LogTrace("CSCDDUEventData|CSCRawToDigi") << sizeInWords();
293  LogTrace("CSCDDUEventData|CSCRawToDigi") << "wordcount = " << theDDUTrailer.wordcount() * 4;
294  }
295 
296  return theDDUHeader.check() && theDDUTrailer.check();
297 }
298 
299 boost::dynamic_bitset<> CSCDDUEventData::pack() {
300  boost::dynamic_bitset<> result =
302  //std::cout <<"SANDRIK inside DDUEvdata check = ";
303  //theDDUHeader.check();
304  //std::cout <<std::endl;
305  //std::cout <<"printing out ddu header words"<<std::endl;
306  //for (unsigned int i=0;i<theDDUHeader.sizeInWords();i++) {
307  // unsigned short * buf = theDDUHeader.data();
308  // printf("%04x %04x %04x %04x\n",buf[i+3],buf[i+2],buf[i+1],buf[i]);
309  // i+=3;
310  //}
311  //std::cout <<"printing out ddu header words via bitset"<<std::endl;
312  //bitset_utilities::printWords(result);
313 
314  for (unsigned int i = 0; i < theData.size(); ++i) {
315  result = bitset_utilities::append(result, theData[i].pack());
316  }
317  theSizeInWords = result.size() / 16 + theDDUTrailer.sizeInWords();
318  // 64-bit word count
320  boost::dynamic_bitset<> dduTrailer =
322  result = bitset_utilities::append(result, dduTrailer);
323 
324  return result;
325 }
void setFromBuffer(uint16_t const *buf)
Definition: CSCDDUHeader.h:17
void setEventInformation(int bxnum, int lvl1num)
CSCDDUEventData(const CSCDDUHeader &)
uint16_t theFormatVersion
CSCDDUHeader header() const
bool check() const
Definition: CSCDDUHeader.cc:43
int format_version() const
Definition: CSCDDUHeader.h:21
void setDMBDAV(int dduInput)
Definition: CSCDDUHeader.cc:26
static unsigned sizeInWords()
Definition: CSCDDUTrailer.h:23
CSCDDUHeader theDDUHeader
int lvl1num() const
Definition: CSCDDUHeader.h:24
void setWordCount(unsigned wordcount)
Definition: CSCDDUTrailer.h:38
boost::dynamic_bitset append(const boost::dynamic_bitset<> &bs1, const boost::dynamic_bitset<> &bs2)
this method takes two bitsets bs1 and bs2 and returns result of bs2 appended to the end of bs1 ...
unsigned errorstat() const
Definition: CSCDDUTrailer.h:36
ExaminerStatusType errorsForChamber(CSCIdType chamber) const
int bxnum() const
Definition: CSCDDUHeader.h:23
std::map< DDUIdType, uint32_t > DDU_size(void) const
void unpack_data(const uint16_t *buf, CSCDCCExaminer *examiner=0)
a good test routine would be to unpack data, then pack it again.
unsigned short * data()
Definition: CSCDDUTrailer.h:32
bool check() const
Definition: CSCDDUTrailer.h:25
const std::vector< CSCEventData > & cscData() const
accessor to data
#define LogTrace(id)
static std::atomic< unsigned int > errMask
ExaminerMaskType getMask() const
std::map< DDUIdType, std::map< CSCIdType, const uint16_t * > > DMB_block(void) const
uint16_t theDDUTrailer0
void setFromBuffer(uint16_t const *buf)
Definition: CSCDDUTrailer.h:21
std::map< DDUIdType, const uint16_t * > DDU_block(void) const
uint32_t ExaminerStatusType
int size() const
static unsigned sizeInWords()
Definition: CSCDDUHeader.h:31
void add(CSCEventData &, int dmbId, int dduInput, unsigned int format_version=2005)
for making events. Sets the bxnum and lvl1num inside the chamber event
int16_t DDUIdType
std::vector< CSCEventData > theData
unsigned wordcount() const
Definition: CSCDDUTrailer.h:37
int ncsc() const
Definition: CSCDDUHeader.h:26
Definition: errors.py:1
int source_id() const
Definition: CSCDDUHeader.h:22
boost::dynamic_bitset ushortToBitset(const unsigned int numberOfBits, unsigned short *buf)
this method takes numberOfBits bits from unsigned short * array and returns them in the bitset obj...
bool check() const
void decodeStatus() const
CSCDDUTrailer theDDUTrailer
unsigned short * data()
Definition: CSCDDUHeader.h:44
const CSCDMBHeader * dmbHeader() const
the DAQ motherboard header. A good place for event and chamber info
Definition: CSCEventData.h:75
static std::atomic< bool > debug
void setdmbID(int newDMBID)
Definition: CSCDMBHeader.h:31
long unsigned int errorstat
trailer info
boost::dynamic_bitset pack()
Alex check this 16 or 64.
int sizeInWords() const