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 Reference

#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 () 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
 
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 19 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 275 of file SiStripFEDBuffer.cc.

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

Referenced by checkFEUnitLengths(), and checkSummary().

276  {
277  //get length from channels
278  uint16_t lengthFromChannels = 0;
279  for (uint8_t iCh = 0; iCh < FEDCH_PER_FEUNIT; iCh++) {
280  lengthFromChannels += channels_[internalFEDChannelNum(internalFEUnitNumber,iCh)].length();
281  }
282  return lengthFromChannels;
283  }
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 142 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().

143  {
144  return ( (internalFEDChannelNum < validChannels_) &&
145  ( (doAPVeCheck && feGood(internalFEDChannelNum/FEDCH_PER_FEUNIT)) ||
147  ) &&
149  }
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 172 of file SiStripFEDBuffer.cc.

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

Referenced by checkSummary().

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

References sistrip::FEDCH_PER_FED, and validChannels_.

Referenced by checkChannelLengthsMatchBufferLength().

188  {
189  return (validChannels_ == FEDCH_PER_FED);
190  }
static const uint16_t FEDCH_PER_FED
bool sistrip::FEDBuffer::checkChannelLengthsMatchBufferLength ( ) const

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

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

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

References fePresent(), and sistrip::FEUNITS_PER_FED.

Referenced by checkSummary().

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

Definition at line 242 of file SiStripFEDBuffer.cc.

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

Referenced by checkSummary().

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

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

Referenced by checkSummary(), and doCorruptBufferChecks().

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

References feHeader_.

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

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

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

160  {
161  return checkStatusBits(internalFEDChannelNum(internalFEUnitNum,internalChannelNum));
162  }
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 293 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.

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

Reimplemented from sistrip::FEDBufferBase.

Definition at line 151 of file SiStripFEDBuffer.cc.

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

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

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

Definition at line 162 of file SiStripFEDBuffer.cc.

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

163  {
164  return ( checkCRC() &&
167  //checkClusterLengths() &&
168  checkFEUnitLengths() );
169  //checkFEUnitAPVAddresses() );
170  }
bool checkFEUnitLengths() const
bool checkChannelPacketCodes() const
bool checkChannelLengthsMatchBufferLength() const
bool sistrip::FEDBuffer::feGood ( const uint8_t  internalFEUnitNum) const
inline

Definition at line 139 of file SiStripFEDBuffer.h.

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

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

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

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

Referenced by channelGood().

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

Definition at line 134 of file SiStripFEDBuffer.h.

References feHeader_.

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

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

Definition at line 149 of file SiStripFEDBuffer.h.

References fePresent_.

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

150  {
151  return fePresent_[internalFEUnitNum];
152  }
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(), 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 (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  channels_.push_back(FEDChannel(payloadPointer_,offsetBeginningOfChannel));
107  //get length and check that whole channel fits into buffer
108  uint16_t channelLength = channels_.back().length();
109  //check that the channel length is long enough to contain the header
110  if (channelLength < minLength) {
112  std::ostringstream ss;
113  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
114  << " is too short. "
115  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
116  << "Channel length is " << uint16_t(channelLength) << ". "
117  << "Min length is " << uint16_t(minLength) << ". ";
118  throw cms::Exception("FEDBuffer") << ss.str();
119  }
120  if (offsetBeginningOfChannel+channelLength > payloadLength_) {
122  std::ostringstream ss;
123  ss << "Channel " << uint16_t(i) << " (FE unit " << key.feUnit() << " channel " << key.feChan() << " according to external numbering scheme)"
124  << "Channel starts at " << uint16_t(offsetBeginningOfChannel) << " in payload. "
125  << "Channel length is " << uint16_t(channelLength) << ". "
126  << "Payload length is " << uint16_t(payloadLength_) << ". ";
127  throw cms::Exception("FEDBuffer") << ss.str();
128  }
129  validChannels_++;
130  const size_t offsetEndOfChannel = offsetBeginningOfChannel+channelLength;
131  //add padding if necessary and calculate offset for begining of next channel
132  if (!( (i+1) % FEDCH_PER_FEUNIT )) {
133  uint8_t numPaddingBytes = 8 - (offsetEndOfChannel % 8);
134  if (numPaddingBytes == 8) numPaddingBytes = 0;
135  offsetBeginningOfChannel = offsetEndOfChannel + numPaddingBytes;
136  } else {
137  offsetBeginningOfChannel = offsetEndOfChannel;
138  }
139  }
140  }
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:57
FEDReadoutMode readoutMode() const
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 378 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().

379  {
380  switch(readoutMode()) {
381  case READOUT_MODE_SCOPE:
382  return PACKET_CODE_SCOPE;
383  break;
385  return PACKET_CODE_VIRGIN_RAW;
386  break;
388  return PACKET_CODE_PROC_RAW;
389  break;
392  break;
394  case READOUT_MODE_SPY:
396  default:
397  return 0;
398  }
399  }
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 401 of file SiStripFEDBuffer.cc.

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

Referenced by print().

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

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

411  {
414  os << "FE units with data: " << uint16_t(nFEUnitsPresent()) << std::endl;
415  os << "BE status register flags: ";
416  dynamic_cast<const FEDFullDebugHeader*>(feHeader())->beStatusRegister().printFlags(os);
417  os << std::endl;
418  }
419  }
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 77 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 74 of file SiStripFEDBuffer.h.

Referenced by FEDBuffer(), and findChannels().

uint8_t sistrip::FEDBuffer::validChannels_
private