CMS 3D CMS Logo

MP7PacketReader.cc
Go to the documentation of this file.
2 
3 #include <boost/foreach.hpp>
4 #include <iostream>
5 
6 using std::cout;
7 using std::endl;
8 
9 MP7PacketReader::MP7PacketReader(const std::string& path, uint32_t striphdr, uint32_t stripftr, uint32_t ikey) : reader_( path ), header_(striphdr), footer_(stripftr), ikey_(ikey) {
10  if ( !reader_.valid() ) return;
11  load();
12 }
13 
14 //MP7PacketReader::MP7PacketReader(MP7FileReader rdr,
15 // uint32_t striphdr,
16 // uint32_t stripftr) :
17 // reader_( rdr ),
18 // header_(striphdr),
19 // footer_(stripftr)
20 //{
21 // if ( !reader_.valid() ) return;
22 // load();
23 //}
24 
26 }
27 
28 void
30 
31  buffers_.reserve(reader_.size());
33  for( ; it != reader_.end(); ++it ) {
34  const FileData& raw = *it;
35 
36  // Check channel alignment
37  std::set< std::vector<PacketRange > > rangeSet;
38 
39  for( size_t k(0); k<raw.size(); ++k) {
40  std::vector<PacketRange > ranges = findPackets(raw.link(ikey_));
41  rangeSet.insert(ranges);
42  }
43  //cout << "Number of different patterns: " << rangeSet.size() << endl;
44  if ( rangeSet.size() != 1 )
45  throw std::runtime_error("Links are not aligned!");
46 
47  std::vector<PacketRange > pr = *(rangeSet.begin());
48 
49  // Create the container
51  data.name_ = raw.name();
52 
53  data.packets_.reserve(pr.size());
54 
55  // loop over the ranges to build packets
56  BOOST_FOREACH(PacketRange p, pr) {
57 
58  // Check if the header/footer zeroed the packet
59  if ( p.second-p.first-header_-footer_<= 0 ) {
60  // Turn this into an error message
61  //cout << "Error: packet length is zero (or less) after header/footer stripping. Skipping." << endl;
62  continue;
63  }
64 
65  Packet pkt;
66  FileData::const_iterator lIt = raw.begin();
67  for( ; lIt != raw.end(); ++lIt ) {
68  // Here the 64 bit uint is converted into a 32 bit uint, the data valid bit is stripped in the 64->32 bit conversion.
69  pkt.links_[lIt->first] = std::vector<uint32_t>(
70  lIt->second.begin() + p.first + header_,
71  lIt->second.begin() + p.second - footer_ + 1
72  );
73  }
74  pkt.first_ = p.first + header_;
75  pkt.last_ = p.second - footer_;
76 
77  data.packets_.push_back(pkt);
78  }
79 
80  buffers_.push_back(data);
81 
82 
83  }
84 }
85 
86 std::vector<PacketRange>
87 MP7PacketReader::findPackets( std::vector<uint64_t> data ) {
88  std::vector<PacketRange> ranges;
89  bool v = false;
90  int32_t begin(-1), end(-1);
91  for ( size_t i(0); i < data.size(); ++i) {
92  uint64_t x = data[i];
93  if (not v) {
94  if ((x >> 32) & 1) {
95  v = true;
96  begin = i;
97  }
98  continue;
99  } else {
100  if ( not ((x >> 32 ) & 1 ) ) {
101  v = false;
102  end = i-1;
103  ranges.push_back(std::make_pair(begin,end) );
104  }
105  continue;
106  }
107  }
108 
109  if ( v && (begin != -1 ) ) {
110  end = data.size()-1;
111  ranges.push_back(std::make_pair(begin,end) );
112  }
113 
114  return ranges;
115 
116 }
LinkMap links_
virtual ~MP7PacketReader()
const_iterator end()
vector&#39;s end iterator
Definition: MP7FileReader.h:71
std::string name_
MP7PacketReader(const std::string &path, uint32_t striphdr=0, uint32_t stripftr=0, uint32_t ikey=0)
LinkMap::const_iterator begin() const
Definition: MP7FileReader.h:34
size_t size() const
number of rawdata objects stored
Definition: MP7FileReader.h:74
size_t size() const
Definition: MP7FileReader.h:32
uint32_t last_
MP7FileReader reader_
std::vector< Packet > packets_
std::vector< PacketData > buffers_
const_iterator end() const
std::pair< uint32_t, uint32_t > PacketRange
LinkMap::const_iterator const_iterator
Definition: MP7FileReader.h:26
int k[5][pyjets_maxn]
string ranges
Definition: diffTwoXMLs.py:79
unsigned long long uint64_t
Definition: Time.h:15
const_iterator begin() const
uint32_t first_
const std::string & name() const
Definition: MP7FileReader.h:28
LinkMap::const_iterator end() const
Definition: MP7FileReader.h:35
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
std::vector< FileData >::const_iterator const_iterator
expose vector&#39;s const iterator
Definition: MP7FileReader.h:49
const std::vector< uint64_t > & link(uint32_t i) const
static std::vector< PacketRange > findPackets(std::vector< uint64_t > data)
bool valid() const
reader status. valid() == 1 indicates that data was successfully read from file
Definition: MP7FileReader.h:56
const_iterator begin()
vector&#39;s begin iterator
Definition: MP7FileReader.h:68