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, edm::hlt::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(), 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 278 of file SiStripFEDBuffer.cc.

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

Referenced by checkFEUnitLengths(), and checkSummary().

279  {
280  //get length from channels
281  uint16_t lengthFromChannels = 0;
282  for (uint8_t iCh = 0; iCh < FEDCH_PER_FEUNIT; iCh++) {
283  lengthFromChannels += channels_[internalFEDChannelNum(internalFEUnitNumber,iCh)].length();
284  }
285  return lengthFromChannels;
286  }
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 145 of file SiStripFEDBuffer.cc.

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

Referenced by checkChannelPacketCodes(), and sistrip::RawToClustersLazyUnpacker::fill().

146  {
147  return ( (internalFEDChannelNum < validChannels_) &&
148  ( (doAPVeCheck && feGood(internalFEDChannelNum/FEDCH_PER_FEUNIT)) ||
150  ) &&
152  }
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 175 of file SiStripFEDBuffer.cc.

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

Referenced by checkSummary().

176  {
177  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
178  //if FE unit is disabled then skip all channels on it
179  if (!feGood(iCh/FEDCH_PER_FEUNIT)) {
180  iCh += FEDCH_PER_FEUNIT;
181  continue;
182  }
183  //channel is bad then return false
184  if (!checkStatusBits(iCh)) return false;
185  }
186  //if no bad channels have been found then they are all fine
187  return true;
188  }
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 190 of file SiStripFEDBuffer.cc.

References sistrip::FEDCH_PER_FED, and validChannels_.

Referenced by checkChannelLengthsMatchBufferLength().

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

Definition at line 195 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().

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

225  {
226  const uint8_t correctPacketCode = getCorrectPacketCode();
227  //if the readout mode if not one which has a packet code then this is set to zero. in this case return true
228  if (!correctPacketCode) return true;
229  for (uint8_t iCh = 0; iCh < FEDCH_PER_FED; iCh++) {
230  //if FE unit is disabled then skip all channels on it
231  if (!feGood(iCh/FEDCH_PER_FEUNIT)) {
232  iCh += FEDCH_PER_FEUNIT;
233  continue;
234  }
235  //only check enabled, working channels
236  if (channelGood(iCh)) {
237  //if a channel is bad then return false
238  if (channels_[iCh].packetCode() != correctPacketCode) return false;
239  }
240  }
241  //if no bad channels were found the they are all ok
242  return true;
243  }
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 288 of file SiStripFEDBuffer.cc.

References fePresent(), and sistrip::FEUNITS_PER_FED.

Referenced by checkSummary().

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

Definition at line 245 of file SiStripFEDBuffer.cc.

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

Referenced by checkSummary().

246  {
247  //get golden address
248  const uint8_t goldenAddress = apveAddress();
249  //don't check if the address is 00 since APVe is probably not connected
250  if (goldenAddress == 0x00) return true;
251  //check can only be done for full debug headers
252  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
253  if (!fdHeader) return true;
254  //check all enabled FE units
255  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
256  if (!feGood(iFE)) continue;
257  //if address is bad then return false
258  if (fdHeader->feUnitMajorityAddress(iFE) != goldenAddress) return false;
259  }
260  //if no bad addresses were found then return true
261  return true;
262  }
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 264 of file SiStripFEDBuffer.cc.

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

Referenced by checkSummary(), and doCorruptBufferChecks().

265  {
266  //check can only be done for full debug headers
267  const FEDFullDebugHeader* fdHeader = dynamic_cast<FEDFullDebugHeader*>(feHeader_.get());
268  if (!fdHeader) return true;
269  //check lengths for enabled FE units
270  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
271  if (!feGood(iFE)) continue;
272  if (calculateFEUnitLength(iFE) != fdHeader->feUnitLength(iFE)) return false;
273  }
274  //if no errors were encountered then return true
275  return true;
276  }
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 156 of file SiStripFEDBuffer.h.

References feHeader_.

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

157  {
158  return feHeader_->checkChannelStatusBits(internalFEDChannelNum);
159  }
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 161 of file SiStripFEDBuffer.h.

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

162  {
163  return checkStatusBits(internalFEDChannelNum(internalFEUnitNum,internalChannelNum));
164  }
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 296 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.

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

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

Referenced by sistrip::RawToClustersLazyUnpacker::fill().

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

Definition at line 165 of file SiStripFEDBuffer.cc.

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

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

Definition at line 141 of file SiStripFEDBuffer.h.

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

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

142  {
143  return ( !majorityAddressErrorForFEUnit(internalFEUnitNum) && !feOverflow(internalFEUnitNum) && fePresent(internalFEUnitNum) );
144  }
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 146 of file SiStripFEDBuffer.h.

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

Referenced by channelGood().

147  {
148  return ( !feOverflow(internalFEUnitNum) && fePresent(internalFEUnitNum) );
149  }
bool fePresent(uint8_t internalFEUnitNum) const
bool feOverflow(const uint8_t internalFEUnitNum) const
const FEDFEHeader * sistrip::FEDBuffer::feHeader ( ) const
inline

Definition at line 136 of file SiStripFEDBuffer.h.

References feHeader_.

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

137  {
138  return feHeader_.get();
139  }
std::auto_ptr< FEDFEHeader > feHeader_
bool sistrip::FEDBuffer::fePresent ( uint8_t  internalFEUnitNum) const
inline

Definition at line 151 of file SiStripFEDBuffer.h.

References fePresent_.

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

152  {
153  return fePresent_[internalFEUnitNum];
154  }
bool fePresent_[FEUNITS_PER_FED]
void sistrip::FEDBuffer::findChannels ( )
private

Definition at line 71 of file SiStripFEDBuffer.cc.

References sistrip::FEDBufferBase::channels_, edm::hlt::Exception, SiStripFedKey::feChan(), sistrip::FEDCH_PER_FED, sistrip::FEDCH_PER_FEUNIT, sistrip::FEDBufferBase::feEnabled(), fePresent(), SiStripFedKey::feUnit(), i, combine::key, payloadLength_, payloadPointer_, sistrip::READOUT_MODE_ZERO_SUPPRESSED, sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE, sistrip::FEDBufferBase::readoutMode(), 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;
80  minLength = 2;
81  break;
82  default:
83  minLength = 3;
84  break;
85  }
86  size_t offsetBeginningOfChannel = 0;
87  for (size_t i = 0; i < FEDCH_PER_FED; i++) {
88  //if FE unit is not enabled then skip rest of FE unit adding NULL pointers
90  channels_.insert(channels_.end(),size_t(FEDCH_PER_FEUNIT),FEDChannel(payloadPointer_,0,0));
91  i += FEDCH_PER_FEUNIT-1;
93  continue;
94  }
95  //if FE unit is enabled
96  //check that channel length bytes fit into buffer
97  if unlikely(offsetBeginningOfChannel+1 >= payloadLength_) {
98  std::ostringstream ss;
100  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
101  << " does not fit into buffer. "
102  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
103  << "Payload length is " << uint16_t(payloadLength_) << ". ";
104  throw cms::Exception("FEDBuffer") << ss.str();
105  }
106 
107  channels_.push_back(FEDChannel(payloadPointer_,offsetBeginningOfChannel));
108  //get length and check that whole channel fits into buffer
109  uint16_t channelLength = channels_.back().length();
110 
111  //check that the channel length is long enough to contain the header
112  if unlikely(channelLength < minLength) {
114  std::ostringstream ss;
115  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
116  << " is too short. "
117  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
118  << "Channel length is " << uint16_t(channelLength) << ". "
119  << "Min length is " << uint16_t(minLength) << ". ";
120  throw cms::Exception("FEDBuffer") << ss.str();
121  }
122  if unlikely(offsetBeginningOfChannel+channelLength > payloadLength_) {
124  std::ostringstream ss;
125  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
126  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
127  << "Channel length is " << uint16_t(channelLength) << ". "
128  << "Payload length is " << uint16_t(payloadLength_) << ". ";
129  throw cms::Exception("FEDBuffer") << ss.str();
130  }
131 
132  validChannels_++;
133  const size_t offsetEndOfChannel = offsetBeginningOfChannel+channelLength;
134  //add padding if necessary and calculate offset for begining of next channel
135  if (!( (i+1) % FEDCH_PER_FEUNIT )) {
136  uint8_t numPaddingBytes = 8 - (offsetEndOfChannel % 8);
137  if (numPaddingBytes == 8) numPaddingBytes = 0;
138  offsetBeginningOfChannel = offsetEndOfChannel + numPaddingBytes;
139  } else {
140  offsetBeginningOfChannel = offsetEndOfChannel;
141  }
142  }
143  }
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)
Definition: Likely.h:21
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
list key
Definition: combine.py:13
static const uint16_t FEDCH_PER_FED
uint8_t sistrip::FEDBuffer::getCorrectPacketCode ( ) const
private

Definition at line 381 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_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().

382  {
383  switch(readoutMode()) {
384  case READOUT_MODE_SCOPE:
385  return PACKET_CODE_SCOPE;
386  break;
388  return PACKET_CODE_VIRGIN_RAW;
389  break;
391  return PACKET_CODE_PROC_RAW;
392  break;
395  break;
397  case READOUT_MODE_SPY:
399  default:
400  return 0;
401  }
402  }
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 404 of file SiStripFEDBuffer.cc.

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

Referenced by print().

405  {
406  uint8_t result = 0;
407  for (uint8_t iFE = 0; iFE < FEUNITS_PER_FED; iFE++) {
408  if (fePresent(iFE)) result++;
409  }
410  return result;
411  }
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 413 of file SiStripFEDBuffer.cc.

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

414  {
417  os << "FE units with data: " << uint16_t(nFEUnitsPresent()) << std::endl;
418  os << "BE status register flags: ";
419  dynamic_cast<const FEDFullDebugHeader*>(feHeader())->beStatusRegister().printFlags(os);
420  os << std::endl;
421  }
422  }
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