Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#include "EventFilter/L1TRawToDigi/interface/MP7PacketReader.h"

#include <iostream>

using std::cout;
using std::endl;

MP7PacketReader::MP7PacketReader(const std::string& path, uint32_t striphdr, uint32_t stripftr, uint32_t ikey)
    : reader_(path), header_(striphdr), footer_(stripftr), ikey_(ikey) {
  if (!reader_.valid())
    return;
  load();
}

//MP7PacketReader::MP7PacketReader(MP7FileReader rdr,
//				 uint32_t striphdr,
//				 uint32_t stripftr) :
//  reader_( rdr ),
//  header_(striphdr),
//  footer_(stripftr)
//{
//  if ( !reader_.valid() ) return;
//  load();
//}

MP7PacketReader::~MP7PacketReader() {}

void MP7PacketReader::load() {
  buffers_.reserve(reader_.size());
  MP7FileReader::const_iterator it = reader_.begin();
  for (; it != reader_.end(); ++it) {
    const FileData& raw = *it;

    // Check channel alignment
    std::set<std::vector<PacketRange> > rangeSet;

    for (size_t k(0); k < raw.size(); ++k) {
      std::vector<PacketRange> ranges = findPackets(raw.link(ikey_));
      rangeSet.insert(ranges);
    }
    //cout << "Number of different patterns: " << rangeSet.size() << endl;
    if (rangeSet.size() != 1)
      throw std::runtime_error("Links are not aligned!");

    std::vector<PacketRange> pr = *(rangeSet.begin());

    // Create the container
    PacketData data;
    data.name_ = raw.name();

    data.packets_.reserve(pr.size());

    // loop over the ranges to build packets
    for (auto const& p : pr) {
      // Check if the header/footer zeroed the packet
      if (p.second - p.first - header_ - footer_ <= 0) {
        // Turn this into an error message
        //cout << "Error: packet length is zero (or less) after header/footer stripping. Skipping." << endl;
        continue;
      }

      Packet pkt;
      FileData::const_iterator lIt = raw.begin();
      for (; lIt != raw.end(); ++lIt) {
        // Here the 64 bit uint is converted into a 32 bit uint, the data valid bit is stripped in the 64->32 bit conversion.
        pkt.links_[lIt->first] = std::vector<uint32_t>(lIt->second.begin() + p.first + header_,
                                                       lIt->second.begin() + p.second - footer_ + 1);
      }
      pkt.first_ = p.first + header_;
      pkt.last_ = p.second - footer_;

      data.packets_.push_back(pkt);
    }

    buffers_.push_back(data);
  }
}

std::vector<PacketRange> MP7PacketReader::findPackets(std::vector<uint64_t> data) {
  std::vector<PacketRange> ranges;
  bool v = false;
  int32_t begin(-1), end(-1);
  for (size_t i(0); i < data.size(); ++i) {
    uint64_t x = data[i];
    if (not v) {
      if ((x >> 32) & 1) {
        v = true;
        begin = i;
      }
      continue;
    } else {
      if (not((x >> 32) & 1)) {
        v = false;
        end = i - 1;
        ranges.push_back(std::make_pair(begin, end));
      }
      continue;
    }
  }

  if (v && (begin != -1)) {
    end = data.size() - 1;
    ranges.push_back(std::make_pair(begin, end));
  }

  return ranges;
}