CMS 3D CMS Logo

SiStripFEDSpyBuffer.cc
Go to the documentation of this file.
3 
4 namespace sistrip {
5 
7 
8  FEDSpyBuffer::FEDSpyBuffer(const uint8_t* fedBuffer, const size_t fedBufferSize)
9  : FEDBufferBase(fedBuffer, fedBufferSize, false),
10  payloadPointer_(getPointerToDataAfterTrackerSpecialHeader() + 16),
11  payloadLength_(getPointerToByteAfterEndOfPayload() - payloadPointer_),
12  versionId_(*(getPointerToDataAfterTrackerSpecialHeader() + 3)) {
13  //Check it is spy data
14  if (!(readoutMode() == READOUT_MODE_SPY))
15  throw cms::Exception("FEDSpyBuffer") << "Buffer is not from spy channel";
16  //Check the buffer format version ID and take action for any exceptions
17  if (versionId_ == 0x00) {
19  }
20  //find the channel start positions
21  findChannels();
22  }
23 
25 
27  size_t delayChipStartByteIndex = 0;
28  //Loop over delay chips checking their data fits into buffer and setting up channel objects with correct offset
29  for (uint8_t iDelayChip = 0; iDelayChip < DELAY_CHIPS_PER_FED; ++iDelayChip) {
30  if (delayChipStartByteIndex + SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES > payloadLength_) {
31  throw cms::Exception("FEDSpyBuffer") << "Delay chip " << uint16_t(iDelayChip) << " does not fit into buffer. "
32  << "Buffer size is " << bufferSize() << " delay chip data starts at "
33  << delayChipStartByteIndex + 8 + 8 + 8 + 8 << ". ";
34  }
35  for (uint8_t i = 0; i < FEDCH_PER_DELAY_CHIP; i++) {
36  const uint8_t chanelIndexInDataOrder = channelPositionsInData_[i];
37  const uint8_t fedCh = iDelayChip * FEDCH_PER_DELAY_CHIP + i;
38  const size_t channelOffsetInBits = SPY_DELAYCHIP_DATA_OFFSET_IN_BITS + 10 * chanelIndexInDataOrder;
39  channels_[fedCh] =
40  FEDChannel(payloadPointer_ + delayChipStartByteIndex, channelOffsetInBits, SPY_SAMPLES_PER_CHANNEL);
41  }
42  delayChipStartByteIndex += SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES;
43  }
44  }
45 
46  uint32_t FEDSpyBuffer::globalRunNumber() const {
47  if (versionId_ < 0x02) {
48  return 0;
49  }
50  const uint8_t* runNumberPointer = getPointerToDataAfterTrackerSpecialHeader() + 4;
51  uint32_t result = 0;
52  result |= runNumberPointer[0];
53  result |= (uint32_t(runNumberPointer[1]) << 8);
54  result |= (uint32_t(runNumberPointer[2]) << 16);
55  result |= (uint32_t(runNumberPointer[3]) << 24);
56  return result;
57  }
58 
59  uint32_t FEDSpyBuffer::spyHeaderL1ID() const {
60  if (versionId_ == 0x00) {
61  return delayChipL1ID(0);
62  }
63  uint32_t result = 0;
64  const uint8_t* spyCounters = payloadPointer_ - 8;
65  result |= spyCounters[4];
66  result |= (uint32_t(spyCounters[5]) << 8);
67  result |= (uint32_t(spyCounters[6]) << 16);
68  result |= (uint32_t(spyCounters[7]) << 24);
69  return result;
70  }
71 
73  if (versionId_ == 0x00) {
74  return delayChipTotalEventCount(0);
75  }
76  uint32_t result = 0;
77  const uint8_t* spyCounters = payloadPointer_ - 8;
78  result |= spyCounters[0];
79  result |= (uint32_t(spyCounters[1]) << 8);
80  result |= (uint32_t(spyCounters[2]) << 16);
81  result |= (uint32_t(spyCounters[3]) << 24);
82  return result;
83  }
84 
85  uint32_t FEDSpyBuffer::delayChipL1ID(const uint8_t delayChip) const {
86  const uint8_t* delayChipCounters = payloadPointer_ + ((SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES) * (delayChip + 1) - 8);
87  uint32_t result = 0;
88  result |= delayChipCounters[4];
89  result |= (uint32_t(delayChipCounters[5]) << 8);
90  result |= (uint32_t(delayChipCounters[6]) << 16);
91  result |= (uint32_t(delayChipCounters[7]) << 24);
92  return result;
93  }
94 
95  uint32_t FEDSpyBuffer::delayChipTotalEventCount(const uint8_t delayChip) const {
96  const uint8_t* delayChipCounters = payloadPointer_ + ((SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES) * (delayChip + 1) - 8);
97  uint32_t result = 0;
98  result |= delayChipCounters[0];
99  result |= (uint32_t(delayChipCounters[1]) << 8);
100  result |= (uint32_t(delayChipCounters[2]) << 16);
101  result |= (uint32_t(delayChipCounters[3]) << 24);
102  return result;
103  }
104 
105  void FEDSpyBuffer::print(std::ostream& os) const {
107  //TODO
108  }
109 
110  bool FEDSpyBuffer::delayChipGood(const uint8_t delayChip) const {
111  if (versionId_ == 0x00) {
112  if (delayChip == 0)
113  return true;
114  }
115  uint32_t l1CountBefore = 0;
116  uint32_t totalEventCountBefore = 0;
117  if (delayChip == 0) {
118  l1CountBefore = spyHeaderL1ID();
119  totalEventCountBefore = spyHeaderTotalEventCount();
120  } else {
121  l1CountBefore = delayChipL1ID(delayChip - 1);
122  totalEventCountBefore = delayChipTotalEventCount(delayChip - 1);
123  }
124  const uint32_t l1CountAfter = delayChipL1ID(delayChip);
125  const uint32_t totalEventCountAfter = delayChipTotalEventCount(delayChip);
126  const bool eventMatches = ((l1CountBefore == l1CountAfter) && (totalEventCountBefore == totalEventCountAfter));
127  if (!eventMatches) {
128  std::ostringstream ss;
129  ss << "Delay chip data was overwritten on chip " << uint16_t(delayChip) << " L1A before: " << l1CountBefore
130  << " after: " << l1CountAfter << " Total event count before: " << totalEventCountBefore
131  << " after: " << totalEventCountAfter << std::endl;
132  dump(ss);
133  edm::LogInfo("FEDSpyBuffer") << ss.str();
134  }
135  return eventMatches;
136  }
137 
139  return delayChipGood(internalFEDChannelNum / FEDCH_PER_DELAY_CHIP);
140  }
141 
142  uint16_t FEDSpyChannelUnpacker::adc() const {
143  const size_t offsetWords = currentOffset_ / 32;
144  const uint8_t offsetBits = currentOffset_ % 32;
145  if (offsetBits < 23) {
146  return ((data_[offsetWords] >> (32 - 10 - offsetBits)) & 0x3FF);
147  } else {
148  return (((data_[offsetWords] << (10 - 32 + offsetBits)) & 0x3FF) |
149  ((data_[offsetWords + 1] & (0xFFC00000 << (32 - offsetBits))) >> (64 - 10 - offsetBits)));
150  }
151  }
152 
153 } // namespace sistrip
void print(std::ostream &os) const override
FEDReadoutMode readoutMode() const
uint8_t internalFEDChannelNum(const uint8_t internalFEUnitNum, const uint8_t internalFEUnitChannelNum)
static const uint16_t SPY_SAMPLES_PER_CHANNEL
const uint8_t * getPointerToDataAfterTrackerSpecialHeader() const
sistrip classes
uint32_t globalRunNumber() const
static const uint16_t DELAY_CHIPS_PER_FED
void dump(std::ostream &os) const
uint32_t delayChipTotalEventCount(const uint8_t delayChip) const
uint32_t spyHeaderL1ID() const
std::vector< FEDChannel > channels_
static const uint16_t FEDCH_PER_DELAY_CHIP
static const uint16_t SPY_DELAY_CHIP_BUFFER_SIZE_IN_BYTES
const uint8_t * payloadPointer_
bool channelGood(const uint8_t internalFEDannelNum) const override
static const uint8_t channelPositionsInData_[FEDCH_PER_DELAY_CHIP]
FEDSpyBuffer(const uint8_t *fedBuffer, const size_t fedBufferSize)
uint32_t spyHeaderTotalEventCount() const
virtual void print(std::ostream &os) const
uint32_t delayChipL1ID(const uint8_t delayChip) const
bool delayChipGood(const uint8_t delayChip) const
static const uint16_t SPY_DELAYCHIP_DATA_OFFSET_IN_BITS