CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
sistrip::FEDBuffer Class Referencefinal

#include <SiStripFEDBuffer.h>

Inheritance diagram for sistrip::FEDBuffer:
sistrip::FEDBufferBase

Public Member Functions

virtual bool channelGood (const uint8_t internalFEDannelNum, const bool doAPVeCheck=true) const
 
bool checkAllChannelStatusBits () const
 
bool checkChannelLengths () const
 
bool checkChannelLengthsMatchBufferLength () const
 
bool checkChannelPacketCodes () const
 
bool checkFEPayloadsPresent () const
 
bool checkFEUnitAPVAddresses () const
 
bool checkFEUnitLengths () const
 
bool checkStatusBits (const uint8_t internalFEDChannelNum) const
 
bool checkStatusBits (const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const
 
virtual std::string checkSummary () const
 
virtual bool doChecks (bool doCRC=true) const
 
virtual bool doCorruptBufferChecks () const
 
 FEDBuffer (const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowBadBuffer=false)
 
bool feGood (const uint8_t internalFEUnitNum) const
 
bool feGoodWithoutAPVEmulatorCheck (const uint8_t internalFEUnitNum) const
 
const FEDFEHeaderfeHeader () const
 
bool fePresent (uint8_t internalFEUnitNum) const
 
virtual void print (std::ostream &os) const
 
virtual ~FEDBuffer ()
 
- Public Member Functions inherited from sistrip::FEDBufferBase
uint8_t apveAddress () const
 
FEDBufferFormat bufferFormat () const
 
size_t bufferSize () const
 
uint16_t calcCRC () const
 
const FEDChannelchannel (const uint8_t internalFEDChannelNum) const
 
const FEDChannelchannel (const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const
 
virtual bool channelGood (const uint8_t internalFEDChannelNum) const
 
bool channelGood (const uint8_t internalFEUnitNum, const uint8_t internalChannelNum) const
 
bool checkAPVEAddressValid () const
 
bool checkBufferFormat () const
 
bool checkCRC () const
 
bool checkHeaderType () const
 
bool checkLengthFromTrailer () const
 
bool checkMajorityAddresses () const
 
bool checkNoExtraHeadersOrTrailers () const
 
bool checkNoFEOverflows () const
 
bool checkNoSlinkCRCError () const
 
bool checkNoSLinkTransmissionError () const
 
bool checkNoUnexpectedSourceID () const
 
bool checkReadoutMode () const
 
bool checkSourceIDs () const
 
uint16_t daqBXID () const
 
uint16_t daqCRC () const
 
uint32_t daqEventLengthIn64bitWords () const
 
uint32_t daqEventLengthInBytes () const
 
FEDDAQEventType daqEventType () const
 
FEDDAQHeader daqHeader () const
 
uint32_t daqLvl1ID () const
 
uint16_t daqSourceID () const
 
FEDDAQTrailer daqTrailer () const
 
FEDTTSBits daqTTSState () const
 
FEDDataType dataType () const
 
virtual bool doChecks () const
 
bool doDAQHeaderAndTrailerChecks () const
 
bool doTrackerSpecialHeaderChecks () const
 
void dump (std::ostream &os) const
 
void dumpOriginalBuffer (std::ostream &os) const
 
 FEDBufferBase (const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat=false)
 
FEDStatusRegister fedStatusRegister () const
 
bool feEnabled (const uint8_t internalFEUnitNum) const
 
bool feOverflow (const uint8_t internalFEUnitNum) const
 
FEDHeaderType headerType () const
 
bool majorityAddressErrorForFEUnit (const uint8_t internalFEUnitNum) const
 
uint8_t nFEUnitsEnabled () const
 
FEDReadoutMode readoutMode () const
 
uint16_t sourceID () const
 
TrackerSpecialHeader trackerSpecialHeader () const
 
virtual ~FEDBufferBase ()
 

Private Member Functions

uint16_t calculateFEUnitLength (const uint8_t internalFEUnitNumber) const
 
void findChannels ()
 
uint8_t getCorrectPacketCode () const
 
uint8_t nFEUnitsPresent () const
 

Private Attributes

std::auto_ptr< FEDFEHeaderfeHeader_
 
bool fePresent_ [FEUNITS_PER_FED]
 
uint16_t payloadLength_
 
const uint8_t * payloadPointer_
 
uint8_t validChannels_
 

Additional Inherited Members

- Protected Member Functions inherited from sistrip::FEDBufferBase
 FEDBufferBase (const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat, const bool fillChannelVector)
 
const uint8_t * getPointerToByteAfterEndOfPayload () const
 
const uint8_t * getPointerToDataAfterTrackerSpecialHeader () const
 
- Protected Attributes inherited from sistrip::FEDBufferBase
std::vector< FEDChannelchannels_
 

Detailed Description

Definition at line 21 of file SiStripFEDBuffer.h.

Constructor & Destructor Documentation

sistrip::FEDBuffer::FEDBuffer ( const uint8_t *  fedBuffer,
const size_t  fedBufferSize,
const bool  allowBadBuffer = false 
)

Definition at line 12 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::channels_, alignCSCRings::e, Exception, sistrip::FEDStatusRegister::feDataMissingFlag(), sistrip::FEDCH_PER_FED, sistrip::FEDBufferBase::fedStatusRegister(), feHeader_, sistrip::FEDFullDebugHeader::fePresent(), fePresent_, sistrip::FEUNITS_PER_FED, findChannels(), sistrip::FEDBufferBase::getPointerToByteAfterEndOfPayload(), sistrip::FEDBufferBase::getPointerToDataAfterTrackerSpecialHeader(), sistrip::HEADER_TYPE_INVALID, sistrip::HEADER_TYPE_NONE, sistrip::FEDBufferBase::headerType(), sistrip::TrackerSpecialHeader::headerTypeNibble(), sistrip::FEDFEHeader::newFEHeader(), payloadLength_, payloadPointer_, sistrip::printHex(), sistrip::READOUT_MODE_SPY, sistrip::FEDBufferBase::readoutMode(), contentValuesCheck::ss, sistrip::FEDBufferBase::trackerSpecialHeader(), and validChannels_.

13  : FEDBufferBase(fedBuffer,fedBufferSize,allowBadBuffer,false)
14  {
15  channels_.reserve(FEDCH_PER_FED);
16  //build the correct type of FE header object
20  } else {
21  feHeader_ = std::auto_ptr<FEDFEHeader>();
23  if (!allowBadBuffer) {
24  std::ostringstream ss;
25  ss << "Header type is invalid. "
26  << "Header type nibble is ";
27  uint8_t headerNibble = trackerSpecialHeader().headerTypeNibble();
28  printHex(&headerNibble,1,ss);
29  ss << ". ";
30  throw cms::Exception("FEDBuffer") << ss.str();
31  }
32  }
33  if (readoutMode() == READOUT_MODE_SPY) {
34  throw cms::Exception("FEDBuffer") << "Unpacking of spy channel data with FEDBuffer is not supported" << std::endl;
35  }
37  //check if FE units are present in data
38  //in Full Debug mode, use the lengths from the header
39  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
40  if (fdHeader) {
41  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
42  if (fdHeader->fePresent(iFE)) fePresent_[iFE] = true;
43  else fePresent_[iFE] = false;
44  }
45  }
46  //in APV error mode, use the FE present byte in the FED status register
47  // a value of '1' means a FE unit's data is missing (in old firmware versions it is always 0)
48  else {
49  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
50  if (fedStatusRegister().feDataMissingFlag(iFE)) fePresent_[iFE] = false;
51  else fePresent_[iFE] = true;
52  }
53  }
54  //try to find channels
55  validChannels_ = 0;
56  try {
57  findChannels();
58  } catch (const cms::Exception& e) {
59  //if there was a problem either rethrow the exception or just mark channel pointers NULL
60  if (!allowBadBuffer) throw;
61  else {
62  channels_.insert(channels_.end(),size_t(FEDCH_PER_FED-validChannels_),FEDChannel(payloadPointer_,0,0));
63  }
64  }
65  }
std::auto_ptr< FEDFEHeader > feHeader_
bool feDataMissingFlag(const uint8_t internalFEUnitNum) const
const uint8_t * getPointerToByteAfterEndOfPayload() const
FEDReadoutMode readoutMode() const
const uint8_t * getPointerToDataAfterTrackerSpecialHeader() const
bool fePresent_[FEUNITS_PER_FED]
const uint8_t * payloadPointer_
static const uint16_t FEUNITS_PER_FED
FEDBufferBase(const uint8_t *fedBuffer, const size_t fedBufferSize, const bool allowUnrecognizedFormat=false)
FEDHeaderType headerType() const
std::vector< FEDChannel > channels_
void printHex(const void *pointer, const size_t length, std::ostream &os)
TrackerSpecialHeader trackerSpecialHeader() const
static const uint16_t FEDCH_PER_FED
static std::auto_ptr< FEDFEHeader > newFEHeader(const FEDHeaderType headerType, const uint8_t *headerBuffer)
FEDStatusRegister fedStatusRegister() const
sistrip::FEDBuffer::~FEDBuffer ( )
virtual

Definition at line 67 of file SiStripFEDBuffer.cc.

68  {
69  }

Member Function Documentation

uint16_t sistrip::FEDBuffer::calculateFEUnitLength ( const uint8_t  internalFEUnitNumber) const
private

Definition at line 279 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::channels_, sistrip::FEDCH_PER_FEUNIT, and sistrip::internalFEDChannelNum().

Referenced by checkFEUnitLengths(), and checkSummary().

280  {
281  //get length from channels
282  uint16_t lengthFromChannels = 0;
283  for (uint8_t iCh = 0; iCh < FEDCH_PER_FEUNIT; iCh++) {
284  lengthFromChannels += channels_[internalFEDChannelNum(internalFEUnitNumber,iCh)].length();
285  }
286  return lengthFromChannels;
287  }
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
std::vector< FEDChannel > channels_
static const uint16_t FEDCH_PER_FEUNIT
bool sistrip::FEDBuffer::channelGood ( const uint8_t  internalFEDannelNum,
const bool  doAPVeCheck = true 
) const
virtual

Definition at line 146 of file SiStripFEDBuffer.cc.

References checkStatusBits(), sistrip::FEDCH_PER_FEUNIT, feGood(), feGoodWithoutAPVEmulatorCheck(), sistrip::READOUT_MODE_SCOPE, sistrip::FEDBufferBase::readoutMode(), and validChannels_.

Referenced by checkChannelPacketCodes().

147  {
148  return ( (internalFEDChannelNum < validChannels_) &&
149  ( (doAPVeCheck && feGood(internalFEDChannelNum/FEDCH_PER_FEUNIT)) ||
151  ) &&
153  }
bool checkStatusBits(const uint8_t internalFEDChannelNum) const
FEDReadoutMode readoutMode() const
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
bool feGoodWithoutAPVEmulatorCheck(const uint8_t internalFEUnitNum) const
static const uint16_t FEDCH_PER_FEUNIT
bool feGood(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::checkAllChannelStatusBits ( ) const

Definition at line 176 of file SiStripFEDBuffer.cc.

References checkStatusBits(), sistrip::FEDCH_PER_FED, sistrip::FEDCH_PER_FEUNIT, and feGood().

Referenced by checkSummary().

177  {
178  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
179  //if FE unit is disabled then skip all channels on it
180  if (!feGood(iCh/FEDCH_PER_FEUNIT)) {
181  iCh += FEDCH_PER_FEUNIT;
182  continue;
183  }
184  //channel is bad then return false
185  if (!checkStatusBits(iCh)) return false;
186  }
187  //if no bad channels have been found then they are all fine
188  return true;
189  }
bool checkStatusBits(const uint8_t internalFEDChannelNum) const
static const uint16_t FEDCH_PER_FEUNIT
static const uint16_t FEDCH_PER_FED
bool feGood(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::checkChannelLengths ( ) const

Definition at line 191 of file SiStripFEDBuffer.cc.

References sistrip::FEDCH_PER_FED, and validChannels_.

Referenced by checkChannelLengthsMatchBufferLength().

192  {
193  return (validChannels_ == FEDCH_PER_FED);
194  }
static const uint16_t FEDCH_PER_FED
bool sistrip::FEDBuffer::checkChannelLengthsMatchBufferLength ( ) const

Definition at line 196 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::channels_, checkChannelLengths(), sistrip::FEDCH_PER_FEUNIT, sistrip::FEDBufferBase::feEnabled(), fePresent(), sistrip::internalFEDChannelNum(), sistrip::FEDChannel::length(), sistrip::FEDChannel::offset(), and payloadLength_.

Referenced by checkSummary(), and doCorruptBufferChecks().

197  {
198  //check they fit into buffer
199  if (!checkChannelLengths()) return false;
200 
201  //payload length from length of data buffer
202  const size_t payloadLengthInWords = payloadLength_/8;
203 
204  //find channel length
205  //find last enabled FE unit
206  uint8_t lastEnabledFeUnit = 7;
207  while ( !(fePresent(lastEnabledFeUnit) && feEnabled(lastEnabledFeUnit)) && lastEnabledFeUnit!=0 ) lastEnabledFeUnit--;
208  //last channel is last channel on last enabled FE unit
209  const FEDChannel& lastChannel = channels_[internalFEDChannelNum(lastEnabledFeUnit,FEDCH_PER_FEUNIT-1)];
210  const size_t offsetLastChannel = lastChannel.offset();
211  const size_t offsetEndOfChannelData = offsetLastChannel+lastChannel.length();
212  const size_t channelDataLength = offsetEndOfChannelData;
213  //channel length in words is length in bytes rounded up to nearest word
214  size_t channelDataLengthInWords = channelDataLength/8;
215  if (channelDataLength % 8) channelDataLengthInWords++;
216 
217  //check lengths match
218  if (channelDataLengthInWords == payloadLengthInWords) {
219  return true;
220  } else {
221  return false;
222  }
223  }
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
bool fePresent(uint8_t internalFEUnitNum) const
bool feEnabled(const uint8_t internalFEUnitNum) const
std::vector< FEDChannel > channels_
static const uint16_t FEDCH_PER_FEUNIT
bool checkChannelLengths() const
bool sistrip::FEDBuffer::checkChannelPacketCodes ( ) const

Definition at line 225 of file SiStripFEDBuffer.cc.

References channelGood(), sistrip::FEDBufferBase::channels_, sistrip::FEDCH_PER_FED, sistrip::FEDCH_PER_FEUNIT, feGood(), and getCorrectPacketCode().

Referenced by checkSummary(), and doCorruptBufferChecks().

226  {
227  const uint8_t correctPacketCode = getCorrectPacketCode();
228  //if the readout mode if not one which has a packet code then this is set to zero. in this case return true
229  if (!correctPacketCode) return true;
230  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
231  //if FE unit is disabled then skip all channels on it
232  if (!feGood(iCh/FEDCH_PER_FEUNIT)) {
233  iCh += FEDCH_PER_FEUNIT;
234  continue;
235  }
236  //only check enabled, working channels
237  if (channelGood(iCh)) {
238  //if a channel is bad then return false
239  if (channels_[iCh].packetCode() != correctPacketCode) return false;
240  }
241  }
242  //if no bad channels were found the they are all ok
243  return true;
244  }
virtual bool channelGood(const uint8_t internalFEDannelNum, const bool doAPVeCheck=true) const
std::vector< FEDChannel > channels_
static const uint16_t FEDCH_PER_FEUNIT
uint8_t getCorrectPacketCode() const
static const uint16_t FEDCH_PER_FED
bool feGood(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::checkFEPayloadsPresent ( ) const

Definition at line 289 of file SiStripFEDBuffer.cc.

References fePresent(), and sistrip::FEUNITS_PER_FED.

Referenced by checkSummary().

290  {
291  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
292  if (!fePresent(iFE)) return false;
293  }
294  return true;
295  }
bool fePresent(uint8_t internalFEUnitNum) const
static const uint16_t FEUNITS_PER_FED
bool sistrip::FEDBuffer::checkFEUnitAPVAddresses ( ) const

Definition at line 246 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::apveAddress(), feGood(), feHeader_, sistrip::FEDFullDebugHeader::feUnitMajorityAddress(), and sistrip::FEUNITS_PER_FED.

Referenced by checkSummary().

247  {
248  //get golden address
249  const uint8_t goldenAddress = apveAddress();
250  //don't check if the address is 00 since APVe is probably not connected
251  if (goldenAddress == 0x00) return true;
252  //check can only be done for full debug headers
253  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
254  if (!fdHeader) return true;
255  //check all enabled FE units
256  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
257  if (!feGood(iFE)) continue;
258  //if address is bad then return false
259  if (fdHeader->feUnitMajorityAddress(iFE) != goldenAddress) return false;
260  }
261  //if no bad addresses were found then return true
262  return true;
263  }
std::auto_ptr< FEDFEHeader > feHeader_
static const uint16_t FEUNITS_PER_FED
bool feGood(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::checkFEUnitLengths ( ) const

Definition at line 265 of file SiStripFEDBuffer.cc.

References calculateFEUnitLength(), feGood(), feHeader_, sistrip::FEDFullDebugHeader::feUnitLength(), and sistrip::FEUNITS_PER_FED.

Referenced by checkSummary(), and doCorruptBufferChecks().

266  {
267  //check can only be done for full debug headers
268  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
269  if (!fdHeader) return true;
270  //check lengths for enabled FE units
271  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
272  if (!feGood(iFE)) continue;
273  if (calculateFEUnitLength(iFE) != fdHeader->feUnitLength(iFE)) return false;
274  }
275  //if no errors were encountered then return true
276  return true;
277  }
std::auto_ptr< FEDFEHeader > feHeader_
static const uint16_t FEUNITS_PER_FED
uint16_t calculateFEUnitLength(const uint8_t internalFEUnitNumber) const
bool feGood(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::checkStatusBits ( const uint8_t  internalFEDChannelNum) const
inline

Definition at line 159 of file SiStripFEDBuffer.h.

References feHeader_.

Referenced by channelGood(), checkAllChannelStatusBits(), checkStatusBits(), and checkSummary().

160  {
161  return feHeader_->checkChannelStatusBits(internalFEDChannelNum);
162  }
std::auto_ptr< FEDFEHeader > feHeader_
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
bool sistrip::FEDBuffer::checkStatusBits ( const uint8_t  internalFEUnitNum,
const uint8_t  internalChannelNum 
) const
inline

Definition at line 164 of file SiStripFEDBuffer.h.

References checkStatusBits(), and sistrip::internalFEDChannelNum().

165  {
166  return checkStatusBits(internalFEDChannelNum(internalFEUnitNum,internalChannelNum));
167  }
bool checkStatusBits(const uint8_t internalFEDChannelNum) const
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
std::string sistrip::FEDBuffer::checkSummary ( ) const
virtual

Reimplemented from sistrip::FEDBufferBase.

Definition at line 297 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::apveAddress(), calculateFEUnitLength(), sistrip::FEDBufferBase::channels_, checkAllChannelStatusBits(), checkChannelLengthsMatchBufferLength(), checkChannelPacketCodes(), checkFEPayloadsPresent(), checkFEUnitAPVAddresses(), checkFEUnitLengths(), checkStatusBits(), sistrip::FEDBufferBase::checkSummary(), sistrip::FEDCH_PER_FED, sistrip::FEDCH_PER_FEUNIT, feGood(), feHeader_, fePresent(), sistrip::FEDFullDebugHeader::feUnitLength(), sistrip::FEDFullDebugHeader::feUnitMajorityAddress(), sistrip::FEUNITS_PER_FED, sistrip::FEDFullDebugHeader::getChannelStatus(), getCorrectPacketCode(), sistrip::HEADER_TYPE_FULL_DEBUG, sistrip::FEDBufferBase::headerType(), and edmLumisInFiles::summary.

298  {
299  std::ostringstream summary;
300  summary << FEDBufferBase::checkSummary();
301  summary << "Check FE unit payloads are all present: " << (checkFEPayloadsPresent() ? "passed" : "FAILED" ) << std::endl;
302  if (!checkFEPayloadsPresent()) {
303  summary << "FE units missing payloads: ";
304  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
305  if (!fePresent(iFE)) summary << uint16_t(iFE) << " ";
306  }
307  summary << std::endl;
308  }
309  summary << "Check channel status bits: " << ( checkAllChannelStatusBits() ? "passed" : "FAILED" ) << std::endl;
310  if (!checkAllChannelStatusBits()) {
311  unsigned int badChannels = 0;
313  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
314  if (fdHeader) {
315  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
316  if (!feGood(iCh/FEDCH_PER_FEUNIT)) continue;
317  if (!checkStatusBits(iCh)) {
318  summary << uint16_t(iCh) << ": " << fdHeader->getChannelStatus(iCh) << std::endl;
319  badChannels++;
320  }
321  }
322  }
323  } else {
324  summary << "Channels with errors: ";
325  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
326  if (!feGood(iCh/FEDCH_PER_FEUNIT)) continue;
327  if (!checkStatusBits(iCh)) {
328  summary << uint16_t(iCh) << " ";
329  badChannels++;
330  }
331  }
332  summary << std::endl;
333  }
334  summary << "Number of channels with bad status bits: " << badChannels << std::endl;
335  }
336  summary << "Check channel lengths match buffer length: " << ( checkChannelLengthsMatchBufferLength() ? "passed" : "FAILED" ) << std::endl;
337  summary << "Check channel packet codes: " << ( checkChannelPacketCodes() ? "passed" : "FAILED" ) << std::endl;
338  if (!checkChannelPacketCodes()) {
339  summary << "Channels with bad packet codes: ";
340  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
341  if (!feGood(iCh/FEDCH_PER_FEUNIT)) continue;
342  if (channels_[iCh].packetCode() != getCorrectPacketCode())
343  summary << uint16_t(iCh) << " ";
344  }
345  }
346  summary << "Check FE unit lengths: " << ( checkFEUnitLengths() ? "passed" : "FAILED" ) << std::endl;
347  if (!checkFEUnitLengths()) {
348  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
349  if (fdHeader) {
350  summary << "Bad FE units:" << std::endl;
351  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
352  if (!feGood(iFE)) continue;
353  uint16_t lengthFromChannels = calculateFEUnitLength(iFE);
354  uint16_t lengthFromHeader = fdHeader->feUnitLength(iFE);
355  if (lengthFromHeader != lengthFromChannels) {
356  summary << "FE unit: " << uint16_t(iFE)
357  << " length in header: " << lengthFromHeader
358  << " length from channel lengths: " << lengthFromChannels << std::endl;
359  }
360  }
361  }
362  }
363  summary << "Check FE unit APV addresses match APVe: " << ( checkFEUnitAPVAddresses() ? "passed" : "FAILED" ) << std::endl;
364  if (!checkFEUnitAPVAddresses()) {
365  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
366  if (fdHeader) {
367  const uint8_t goldenAddress = apveAddress();
368  summary << "Address from APVe:" << uint16_t(goldenAddress) << std::endl;
369  summary << "Bad FE units:" << std::endl;
370  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
371  if (!feGood(iFE)) continue;
372  if (fdHeader->feUnitMajorityAddress(iFE) != goldenAddress) {
373  summary << "FE unit: " << uint16_t(iFE)
374  << " majority address: " << uint16_t(fdHeader->feUnitMajorityAddress(iFE)) << std::endl;
375  }
376  }
377  }
378  }
379  return summary.str();
380  }
std::auto_ptr< FEDFEHeader > feHeader_
bool checkFEUnitLengths() const
bool checkStatusBits(const uint8_t internalFEDChannelNum) const
virtual std::string checkSummary() const
bool checkFEPayloadsPresent() const
bool fePresent(uint8_t internalFEUnitNum) const
static const uint16_t FEUNITS_PER_FED
FEDHeaderType headerType() const
std::vector< FEDChannel > channels_
bool checkChannelPacketCodes() const
static const uint16_t FEDCH_PER_FEUNIT
bool checkFEUnitAPVAddresses() const
uint8_t getCorrectPacketCode() const
bool checkChannelLengthsMatchBufferLength() const
static const uint16_t FEDCH_PER_FED
bool checkAllChannelStatusBits() const
uint16_t calculateFEUnitLength(const uint8_t internalFEUnitNumber) const
bool feGood(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::doChecks ( bool  doCRC = true) const
virtual

Definition at line 155 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::checkCRC(), sistrip::FEDBufferBase::doChecks(), sistrip::FEDCH_PER_FED, and validChannels_.

156  {
157  //check that all channels were unpacked properly
158  if (validChannels_ != FEDCH_PER_FED) return false;
159  //do checks from base class
160  if (!FEDBufferBase::doChecks()) return false;
161  //check CRC
162  if (doCRC && !checkCRC()) return false;
163  return true;
164  }
static const uint16_t FEDCH_PER_FED
bool sistrip::FEDBuffer::doCorruptBufferChecks ( ) const
virtual

Definition at line 166 of file SiStripFEDBuffer.cc.

References checkChannelLengthsMatchBufferLength(), checkChannelPacketCodes(), sistrip::FEDBufferBase::checkCRC(), and checkFEUnitLengths().

167  {
168  return ( checkCRC() &&
171  //checkClusterLengths() &&
172  checkFEUnitLengths() );
173  //checkFEUnitAPVAddresses() );
174  }
bool checkFEUnitLengths() const
bool checkChannelPacketCodes() const
bool checkChannelLengthsMatchBufferLength() const
bool sistrip::FEDBuffer::feGood ( const uint8_t  internalFEUnitNum) const
inline

Definition at line 144 of file SiStripFEDBuffer.h.

References sistrip::FEDBufferBase::feOverflow(), fePresent(), and sistrip::FEDBufferBase::majorityAddressErrorForFEUnit().

Referenced by channelGood(), checkAllChannelStatusBits(), checkChannelPacketCodes(), checkFEUnitAPVAddresses(), checkFEUnitLengths(), and checkSummary().

145  {
146  return ( !majorityAddressErrorForFEUnit(internalFEUnitNum) && !feOverflow(internalFEUnitNum) && fePresent(internalFEUnitNum) );
147  }
bool fePresent(uint8_t internalFEUnitNum) const
bool majorityAddressErrorForFEUnit(const uint8_t internalFEUnitNum) const
bool feOverflow(const uint8_t internalFEUnitNum) const
bool sistrip::FEDBuffer::feGoodWithoutAPVEmulatorCheck ( const uint8_t  internalFEUnitNum) const
inline

Definition at line 149 of file SiStripFEDBuffer.h.

References sistrip::FEDBufferBase::feOverflow(), and fePresent().

Referenced by channelGood().

150  {
151  return ( !feOverflow(internalFEUnitNum) && fePresent(internalFEUnitNum) );
152  }
bool fePresent(uint8_t internalFEUnitNum) const
bool feOverflow(const uint8_t internalFEUnitNum) const
const FEDFEHeader * sistrip::FEDBuffer::feHeader ( ) const
inline

Definition at line 139 of file SiStripFEDBuffer.h.

References feHeader_.

Referenced by print(), and sistrip::RawToDigiUnpacker::updateEventSummary().

140  {
141  return feHeader_.get();
142  }
std::auto_ptr< FEDFEHeader > feHeader_
bool sistrip::FEDBuffer::fePresent ( uint8_t  internalFEUnitNum) const
inline

Definition at line 154 of file SiStripFEDBuffer.h.

References fePresent_.

Referenced by checkChannelLengthsMatchBufferLength(), checkFEPayloadsPresent(), checkSummary(), feGood(), feGoodWithoutAPVEmulatorCheck(), findChannels(), and nFEUnitsPresent().

155  {
156  return fePresent_[internalFEUnitNum];
157  }
bool fePresent_[FEUNITS_PER_FED]
void sistrip::FEDBuffer::findChannels ( )
private

Definition at line 71 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::channels_, Exception, SiStripFedKey::feChan(), sistrip::FEDCH_PER_FED, sistrip::FEDCH_PER_FEUNIT, sistrip::FEDBufferBase::feEnabled(), fePresent(), SiStripFedKey::feUnit(), i, relval_steps::key, payloadLength_, payloadPointer_, sistrip::READOUT_MODE_PREMIX_RAW, sistrip::READOUT_MODE_ZERO_SUPPRESSED, sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE, sistrip::FEDBufferBase::readoutMode(), contentValuesCheck::ss, unlikely, and validChannels_.

Referenced by FEDBuffer().

72  {
73  //set min length to 2 for ZSLite, 7 for ZS and 3 for raw
74  uint16_t minLength;
75  switch (readoutMode()) {
77  minLength = 7;
78  break;
81  minLength = 2;
82  break;
83  default:
84  minLength = 3;
85  break;
86  }
87  size_t offsetBeginningOfChannel = 0;
88  for (size_t i = 0; i < FEDCH_PER_FED; i++) {
89  //if FE unit is not enabled then skip rest of FE unit adding NULL pointers
91  channels_.insert(channels_.end(),size_t(FEDCH_PER_FEUNIT),FEDChannel(payloadPointer_,0,0));
92  i += FEDCH_PER_FEUNIT-1;
94  continue;
95  }
96  //if FE unit is enabled
97  //check that channel length bytes fit into buffer
98  if unlikely(offsetBeginningOfChannel+1 >= payloadLength_) {
99  std::ostringstream ss;
101  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
102  << " does not fit into buffer. "
103  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
104  << "Payload length is " << uint16_t(payloadLength_) << ". ";
105  throw cms::Exception("FEDBuffer") << ss.str();
106  }
107 
108  channels_.push_back(FEDChannel(payloadPointer_,offsetBeginningOfChannel));
109  //get length and check that whole channel fits into buffer
110  uint16_t channelLength = channels_.back().length();
111 
112  //check that the channel length is long enough to contain the header
113  if unlikely(channelLength < minLength) {
115  std::ostringstream ss;
116  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
117  << " is too short. "
118  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
119  << "Channel length is " << uint16_t(channelLength) << ". "
120  << "Min length is " << uint16_t(minLength) << ". ";
121  throw cms::Exception("FEDBuffer") << ss.str();
122  }
123  if unlikely(offsetBeginningOfChannel+channelLength > payloadLength_) {
125  std::ostringstream ss;
126  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
127  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
128  << "Channel length is " << uint16_t(channelLength) << ". "
129  << "Payload length is " << uint16_t(payloadLength_) << ". ";
130  throw cms::Exception("FEDBuffer") << ss.str();
131  }
132 
133  validChannels_++;
134  const size_t offsetEndOfChannel = offsetBeginningOfChannel+channelLength;
135  //add padding if necessary and calculate offset for begining of next channel
136  if (!( (i+1) % FEDCH_PER_FEUNIT )) {
137  uint8_t numPaddingBytes = 8 - (offsetEndOfChannel % 8);
138  if (numPaddingBytes == 8) numPaddingBytes = 0;
139  offsetBeginningOfChannel = offsetEndOfChannel + numPaddingBytes;
140  } else {
141  offsetBeginningOfChannel = offsetEndOfChannel;
142  }
143  }
144  }
int i
Definition: DBlmapReader.cc:9
A container class for generic run and event-related info, information required by the commissioning a...
Definition: SiStripFedKey.h:56
FEDReadoutMode readoutMode() const
#define unlikely(x)
const uint8_t * payloadPointer_
bool fePresent(uint8_t internalFEUnitNum) const
bool feEnabled(const uint8_t internalFEUnitNum) const
std::vector< FEDChannel > channels_
static const uint16_t FEDCH_PER_FEUNIT
static const uint16_t FEDCH_PER_FED
uint8_t sistrip::FEDBuffer::getCorrectPacketCode ( ) const
private

Definition at line 382 of file SiStripFEDBuffer.cc.

References sistrip::PACKET_CODE_PROC_RAW, sistrip::PACKET_CODE_SCOPE, sistrip::PACKET_CODE_VIRGIN_RAW, sistrip::PACKET_CODE_ZERO_SUPPRESSED, sistrip::READOUT_MODE_INVALID, sistrip::READOUT_MODE_PREMIX_RAW, sistrip::READOUT_MODE_PROC_RAW, sistrip::READOUT_MODE_SCOPE, sistrip::READOUT_MODE_SPY, sistrip::READOUT_MODE_VIRGIN_RAW, sistrip::READOUT_MODE_ZERO_SUPPRESSED, sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE, and sistrip::FEDBufferBase::readoutMode().

Referenced by checkChannelPacketCodes(), and checkSummary().

383  {
384  switch(readoutMode()) {
385  case READOUT_MODE_SCOPE:
386  return PACKET_CODE_SCOPE;
387  break;
389  return PACKET_CODE_VIRGIN_RAW;
390  break;
392  return PACKET_CODE_PROC_RAW;
393  break;
396  break;
399  case READOUT_MODE_SPY:
401  default:
402  return 0;
403  }
404  }
static const uint8_t PACKET_CODE_SCOPE
FEDReadoutMode readoutMode() const
static const uint8_t PACKET_CODE_ZERO_SUPPRESSED
static const uint8_t PACKET_CODE_PROC_RAW
static const uint8_t PACKET_CODE_VIRGIN_RAW
uint8_t sistrip::FEDBuffer::nFEUnitsPresent ( ) const
private

Definition at line 406 of file SiStripFEDBuffer.cc.

References fePresent(), sistrip::FEUNITS_PER_FED, and query::result.

Referenced by print().

407  {
408  uint8_t result = 0;
409  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
410  if (fePresent(iFE)) result++;
411  }
412  return result;
413  }
bool fePresent(uint8_t internalFEUnitNum) const
static const uint16_t FEUNITS_PER_FED
tuple result
Definition: query.py:137
void sistrip::FEDBuffer::print ( std::ostream &  os) const
virtual

Reimplemented from sistrip::FEDBufferBase.

Definition at line 415 of file SiStripFEDBuffer.cc.

References feHeader(), sistrip::HEADER_TYPE_FULL_DEBUG, sistrip::FEDBufferBase::headerType(), nFEUnitsPresent(), and sistrip::FEDBufferBase::print().

416  {
419  os << "FE units with data: " << uint16_t(nFEUnitsPresent()) << std::endl;
420  os << "BE status register flags: ";
421  dynamic_cast<const FEDFullDebugHeader*>(feHeader())->beStatusRegister().printFlags(os);
422  os << std::endl;
423  }
424  }
const FEDFEHeader * feHeader() const
FEDHeaderType headerType() const
uint8_t nFEUnitsPresent() const
virtual void print(std::ostream &os) const

Member Data Documentation

std::auto_ptr<FEDFEHeader> sistrip::FEDBuffer::feHeader_
private
bool sistrip::FEDBuffer::fePresent_[FEUNITS_PER_FED]
private

Definition at line 79 of file SiStripFEDBuffer.h.

Referenced by FEDBuffer(), and fePresent().

uint16_t sistrip::FEDBuffer::payloadLength_
private
const uint8_t* sistrip::FEDBuffer::payloadPointer_
private

Definition at line 76 of file SiStripFEDBuffer.h.

Referenced by FEDBuffer(), and findChannels().

uint8_t sistrip::FEDBuffer::validChannels_
private