Skip to content

Commit

Permalink
Added changes introduced in #12157 to fix HI data unpacking issues
Browse files Browse the repository at this point in the history
  • Loading branch information
forthommel committed Nov 9, 2015
1 parent 4130b86 commit 74e87c0
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 12 deletions.
38 changes: 29 additions & 9 deletions EventFilter/SiStripRawToDigi/interface/SiStripFEDBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "EventFilter/SiStripRawToDigi/interface/SiStripFEDBufferComponents.h"

#include "FWCore/Utilities/interface/GCC11Compatibility.h"
#include <iostream> //FIXME

namespace sistrip {

Expand Down Expand Up @@ -149,9 +148,11 @@ namespace sistrip {
FEDBSChannelUnpacker& operator ++ (int);
private:
//pointer to beginning of FED or FE data, offset of start of channel payload in data and length of channel payload
FEDBSChannelUnpacker(const uint8_t* payload, const uint16_t channelPayloadOffset, const int16_t channelPayloadLength, const uint16_t offsetIncrement=10);
FEDBSChannelUnpacker(const uint8_t* payload, const uint16_t channelPayloadOffset, const int16_t channelPayloadLength, const uint16_t offsetIncrement, bool useZS);
void readNewClusterInfo();
static void throwBadChannelLength(const uint16_t length);
static void throwBadWordLength(const uint16_t word_length);
static void throwUnorderedData(const uint8_t currentStrip, const uint8_t firstStripOfNewCluster);
const uint8_t* data_;
uint16_t oldWordOffset_;
uint16_t currentWordOffset_;
Expand All @@ -161,6 +162,8 @@ namespace sistrip {
uint8_t currentStrip_;
uint16_t channelPayloadOffset_;
uint16_t channelPayloadLength_;
bool useZS_;
uint8_t valuesLeftInCluster_;
};

//
Expand Down Expand Up @@ -207,16 +210,18 @@ namespace sistrip {
currentBitOffset_(0), currentLocalBitOffset_(0),
bitOffsetIncrement_(10),
currentStrip_(0),
channelPayloadOffset_(0), channelPayloadLength_(0)
channelPayloadOffset_(0), channelPayloadLength_(0),
useZS_(false), valuesLeftInCluster_(0)
{ }

inline FEDBSChannelUnpacker::FEDBSChannelUnpacker(const uint8_t* payload, const uint16_t channelPayloadOffset, const int16_t channelPayloadLength, const uint16_t offsetIncrement)
inline FEDBSChannelUnpacker::FEDBSChannelUnpacker(const uint8_t* payload, const uint16_t channelPayloadOffset, const int16_t channelPayloadLength, const uint16_t offsetIncrement, bool useZS)
: data_(payload),
oldWordOffset_(0), currentWordOffset_(channelPayloadOffset),
currentBitOffset_(0), currentLocalBitOffset_(0),
bitOffsetIncrement_(offsetIncrement),
channelPayloadOffset_(channelPayloadOffset),
channelPayloadLength_(channelPayloadLength)
channelPayloadLength_(channelPayloadLength),
useZS_(useZS), valuesLeftInCluster_(0)
{
if (bitOffsetIncrement_>16) throwBadWordLength(bitOffsetIncrement_); // more than 2 words... still to be implemented
}
Expand All @@ -226,23 +231,23 @@ namespace sistrip {
uint16_t length = channel.length();
if (length & 0xF000) throwBadChannelLength(length);
if (num_bits<=0 or num_bits>16) throwBadWordLength(num_bits);
FEDBSChannelUnpacker result(channel.data(), channel.offset()+3, length-3, num_bits);
FEDBSChannelUnpacker result(channel.data(), channel.offset()+3, length-3, num_bits, false);
return result;
}

inline FEDBSChannelUnpacker FEDBSChannelUnpacker::zeroSuppressedModeUnpacker(const FEDChannel& channel, uint16_t num_bits)
{
uint16_t length = channel.length();
if (length & 0xF000) throwBadChannelLength(length);
FEDBSChannelUnpacker result(channel.data(), channel.offset()+7, length-7, num_bits);
FEDBSChannelUnpacker result(channel.data(), channel.offset()+7, length-7, num_bits, true);
return result;
}

inline FEDBSChannelUnpacker FEDBSChannelUnpacker::zeroSuppressedLiteModeUnpacker(const FEDChannel& channel, uint16_t num_bits)
{
uint16_t length = channel.length();
if (length & 0xF000) throwBadChannelLength(length);
FEDBSChannelUnpacker result(channel.data(), channel.offset()+2, length-2, num_bits);
FEDBSChannelUnpacker result(channel.data(), channel.offset()+2, length-2, num_bits, true);
return result;
}

Expand Down Expand Up @@ -275,7 +280,16 @@ namespace sistrip {
currentWordOffset_++;
currentLocalBitOffset_ -= 8;
}
currentStrip_++;
if (useZS_) {
if (valuesLeftInCluster_) { currentStrip_++; valuesLeftInCluster_--; }
else {
if (hasData()) {
const uint8_t oldStrip = currentStrip_;
readNewClusterInfo();
if ( !(currentStrip_ > oldStrip) ) throwUnorderedData(oldStrip,currentStrip_);
}
}
} else { currentStrip_++; }
return (*this);
}

Expand All @@ -284,6 +298,12 @@ namespace sistrip {
++(*this); return *this;
}

inline void FEDBSChannelUnpacker::readNewClusterInfo()
{
currentStrip_ = data_[(currentWordOffset_++)^7];
valuesLeftInCluster_ = data_[(currentWordOffset_++)^7]-1;
}


//FEDRawChannelUnpacker

Expand Down
10 changes: 10 additions & 0 deletions EventFilter/SiStripRawToDigi/src/SiStripFEDBuffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,16 @@ namespace sistrip {
throw cms::Exception("FEDBuffer") << ss.str();
}

void FEDBSChannelUnpacker::throwUnorderedData(const uint8_t currentStrip, const uint8_t firstStripOfNewCluster)
{
std::ostringstream ss;
ss << "First strip of new cluster is not greater than last strip of previous cluster. "
<< "Last strip of previous cluster is " << uint16_t(currentStrip) << ". "
<< "First strip of new cluster is " << uint16_t(firstStripOfNewCluster) << "."
<< std::endl;
throw cms::Exception("FEDBuffer") << ss.str();
}

void FEDZSChannelUnpacker::throwBadChannelLength(const uint16_t length)
{
std::ostringstream ss;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,9 @@ namespace sistrip {
case READOUT_MODE_ZERO_SUPPRESSED:
os << "Zero suppressed";
break;
case READOUT_MODE_ZERO_SUPPRESSED_FAKE:
os << "Zero suppressed (fake)";
break;
case READOUT_MODE_ZERO_SUPPRESSED_LITE10:
os << "Zero suppressed lite";
break;
Expand Down Expand Up @@ -715,6 +718,7 @@ namespace sistrip {
case READOUT_MODE_VIRGIN_RAW:
case READOUT_MODE_PROC_RAW:
case READOUT_MODE_ZERO_SUPPRESSED:
case READOUT_MODE_ZERO_SUPPRESSED_FAKE:
case READOUT_MODE_ZERO_SUPPRESSED_LITE10:
//case READOUT_MODE_ZERO_SUPPRESSED_CMOVERRIDE:
case READOUT_MODE_ZERO_SUPPRESSED_LITE10_CMOVERRIDE:
Expand Down Expand Up @@ -788,6 +792,7 @@ namespace sistrip {
case READOUT_MODE_PROC_RAW:
case READOUT_MODE_SPY:
case READOUT_MODE_ZERO_SUPPRESSED:
case READOUT_MODE_ZERO_SUPPRESSED_FAKE:
case READOUT_MODE_ZERO_SUPPRESSED_LITE10:
case READOUT_MODE_ZERO_SUPPRESSED_LITE10_CMOVERRIDE:
case READOUT_MODE_ZERO_SUPPRESSED_LITE8:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ try {
const sistrip::FEDReadoutMode mode = buffer->readoutMode();


if likely(mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE8 ) {
if likely(mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE10 ) {

try {
// create unpacker
Expand All @@ -355,9 +355,30 @@ try {
}
continue;
}
} else {
} else if likely(mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED_LITE8 ) {

try {
// create unpacker
//sistrip::FEDZSChannelUnpacker unpacker = static_cast<sistrip::FEDZSChannelUnpacker>(
// sistrip::FEDBSChannelUnpacker::zeroSuppressedLiteModeUnpacker(buffer->channel(fedCh), 8));
sistrip::FEDZSChannelUnpacker unpacker = sistrip::FEDZSChannelUnpacker::zeroSuppressedLiteModeUnpacker(buffer->channel(fedCh));

// unpack
clusterizer.addFed(unpacker,ipair,record);
} catch (edmNew::CapacityExaustedException) {
throw;
} catch (const cms::Exception& e) {
if (edm::isDebugEnabled()) {
std::ostringstream ss;
ss << "Unordered clusters for channel " << fedCh << " on FED " << fedId << ": " << e.what();
edm::LogWarning(sistrip::mlRawToCluster_) << ss.str();
}
continue;
}

} else {

if (mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED ) {
if (mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED or mode == sistrip::READOUT_MODE_ZERO_SUPPRESSED_FAKE ) {
try {
// create unpacker
sistrip::FEDZSChannelUnpacker unpacker = sistrip::FEDZSChannelUnpacker::zeroSuppressedModeUnpacker(buffer->channel(fedCh));
Expand Down

0 comments on commit 74e87c0

Please sign in to comment.