File indexing completed on 2023-03-17 10:56:53
0001 #include "DQM/SiStripMonitorHardware/interface/SiStripFEDSpyBuffer.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003
0004 namespace sistrip {
0005
0006 const uint8_t FEDSpyBuffer::channelPositionsInData_[FEDCH_PER_DELAY_CHIP] = {0, 3, 2, 1};
0007
0008 FEDSpyBuffer::FEDSpyBuffer(const FEDRawData& fedBuffer)
0009 : FEDBufferBase(fedBuffer),
0010 payloadPointer_(getPointerToDataAfterTrackerSpecialHeader() + 16),
0011 payloadLength_(getPointerToByteAfterEndOfPayload() - payloadPointer_),
0012 versionId_(*(getPointerToDataAfterTrackerSpecialHeader() + 3)) {
0013
0014 if (versionId_ == 0x00) {
0015 payloadPointer_ = payloadPointer_ - 8;
0016 }
0017
0018 findChannels();
0019 }
0020
0021 FEDSpyBuffer::~FEDSpyBuffer() {}
0022
0023 void FEDSpyBuffer::findChannels() {
0024 size_t delayChipStartByteIndex = 0;
0025
0026 for (uint8_t iDelayChip = 0; iDelayChip < DELAY_CHIPS_PER_FED; ++iDelayChip) {
0027 if (delayChipStartByteIndex + SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES > payloadLength_) {
0028 throw cms::Exception("FEDSpyBuffer") << "Delay chip " << uint16_t(iDelayChip) << " does not fit into buffer. "
0029 << "Buffer size is " << bufferSize() << " delay chip data starts at "
0030 << delayChipStartByteIndex + 8 + 8 + 8 + 8 << ". ";
0031 }
0032 for (uint8_t i = 0; i < FEDCH_PER_DELAY_CHIP; i++) {
0033 const uint8_t chanelIndexInDataOrder = channelPositionsInData_[i];
0034 const uint8_t fedCh = iDelayChip * FEDCH_PER_DELAY_CHIP + i;
0035 const size_t channelOffsetInBits = SPY_DELAYCHIP_DATA_OFFSET_IN_BITS + 10 * chanelIndexInDataOrder;
0036 channels_[fedCh] =
0037 FEDChannel(payloadPointer_ + delayChipStartByteIndex, channelOffsetInBits, SPY_SAMPLES_PER_CHANNEL);
0038 }
0039 delayChipStartByteIndex += SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES;
0040 }
0041 }
0042
0043 uint32_t FEDSpyBuffer::globalRunNumber() const {
0044 if (versionId_ < 0x02) {
0045 return 0;
0046 }
0047 const uint8_t* runNumberPointer = getPointerToDataAfterTrackerSpecialHeader() + 4;
0048 uint32_t result = 0;
0049 result |= runNumberPointer[0];
0050 result |= (uint32_t(runNumberPointer[1]) << 8);
0051 result |= (uint32_t(runNumberPointer[2]) << 16);
0052 result |= (uint32_t(runNumberPointer[3]) << 24);
0053 return result;
0054 }
0055
0056 uint32_t FEDSpyBuffer::spyHeaderL1ID() const {
0057 if (versionId_ == 0x00) {
0058 return delayChipL1ID(0);
0059 }
0060 uint32_t result = 0;
0061 const uint8_t* spyCounters = payloadPointer_ - 8;
0062 result |= spyCounters[4];
0063 result |= (uint32_t(spyCounters[5]) << 8);
0064 result |= (uint32_t(spyCounters[6]) << 16);
0065 result |= (uint32_t(spyCounters[7]) << 24);
0066 return result;
0067 }
0068
0069 uint32_t FEDSpyBuffer::spyHeaderTotalEventCount() const {
0070 if (versionId_ == 0x00) {
0071 return delayChipTotalEventCount(0);
0072 }
0073 uint32_t result = 0;
0074 const uint8_t* spyCounters = payloadPointer_ - 8;
0075 result |= spyCounters[0];
0076 result |= (uint32_t(spyCounters[1]) << 8);
0077 result |= (uint32_t(spyCounters[2]) << 16);
0078 result |= (uint32_t(spyCounters[3]) << 24);
0079 return result;
0080 }
0081
0082 uint32_t FEDSpyBuffer::delayChipL1ID(const uint8_t delayChip) const {
0083 const uint8_t* delayChipCounters = payloadPointer_ + ((SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES) * (delayChip + 1) - 8);
0084 uint32_t result = 0;
0085 result |= delayChipCounters[4];
0086 result |= (uint32_t(delayChipCounters[5]) << 8);
0087 result |= (uint32_t(delayChipCounters[6]) << 16);
0088 result |= (uint32_t(delayChipCounters[7]) << 24);
0089 return result;
0090 }
0091
0092 uint32_t FEDSpyBuffer::delayChipTotalEventCount(const uint8_t delayChip) const {
0093 const uint8_t* delayChipCounters = payloadPointer_ + ((SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES) * (delayChip + 1) - 8);
0094 uint32_t result = 0;
0095 result |= delayChipCounters[0];
0096 result |= (uint32_t(delayChipCounters[1]) << 8);
0097 result |= (uint32_t(delayChipCounters[2]) << 16);
0098 result |= (uint32_t(delayChipCounters[3]) << 24);
0099 return result;
0100 }
0101
0102 void FEDSpyBuffer::print(std::ostream& os) const {
0103 FEDBufferBase::print(os);
0104
0105 }
0106
0107 bool FEDSpyBuffer::delayChipGood(const uint8_t delayChip) const {
0108 if (versionId_ == 0x00) {
0109 if (delayChip == 0)
0110 return true;
0111 }
0112 uint32_t l1CountBefore = 0;
0113 uint32_t totalEventCountBefore = 0;
0114 if (delayChip == 0) {
0115 l1CountBefore = spyHeaderL1ID();
0116 totalEventCountBefore = spyHeaderTotalEventCount();
0117 } else {
0118 l1CountBefore = delayChipL1ID(delayChip - 1);
0119 totalEventCountBefore = delayChipTotalEventCount(delayChip - 1);
0120 }
0121 const uint32_t l1CountAfter = delayChipL1ID(delayChip);
0122 const uint32_t totalEventCountAfter = delayChipTotalEventCount(delayChip);
0123 const bool eventMatches = ((l1CountBefore == l1CountAfter) && (totalEventCountBefore == totalEventCountAfter));
0124 if (!eventMatches) {
0125 std::ostringstream ss;
0126 ss << "Delay chip data was overwritten on chip " << uint16_t(delayChip) << " L1A before: " << l1CountBefore
0127 << " after: " << l1CountAfter << " Total event count before: " << totalEventCountBefore
0128 << " after: " << totalEventCountAfter << std::endl;
0129 dump(ss);
0130 edm::LogInfo("FEDSpyBuffer") << ss.str();
0131 }
0132 return eventMatches;
0133 }
0134
0135 bool FEDSpyBuffer::channelGood(const uint8_t internalFEDChannelNum) const {
0136 return delayChipGood(internalFEDChannelNum / FEDCH_PER_DELAY_CHIP);
0137 }
0138
0139 uint16_t FEDSpyChannelUnpacker::adc() const {
0140 const size_t offsetWords = currentOffset_ / 32;
0141 const uint8_t offsetBits = currentOffset_ % 32;
0142 if (offsetBits < 23) {
0143 return ((data_[offsetWords] >> (32 - 10 - offsetBits)) & 0x3FF);
0144 } else {
0145 return (((data_[offsetWords] << (10 - 32 + offsetBits)) & 0x3FF) |
0146 ((data_[offsetWords + 1] & (0xFFC00000 << (32 - offsetBits))) >> (64 - 10 - offsetBits)));
0147 }
0148 }
0149
0150 }