mu2e_artdaq_core  v1_02_11
 All Classes Functions
DetectorFragment.cc
1 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
2 
3 #if 0
4 namespace {
5  unsigned int pop_count (unsigned int n) {
6  unsigned int c;
7  for (c = 0; n; c++) n &= n - 1;
8  return c;
9  }
10 }
11 #endif
12 
13 void mu2e::DetectorFragment::checkADCData(int daq_adc_bits) const {
14  mu2e::DetectorFragment::adc_t const *adcPtr(findBadADC(daq_adc_bits));
15  if (adcPtr != dataEnd()) {
16  throw cet::exception("IllegalADCVal")
17  << "Illegal value of ADC word #" << (adcPtr - dataBegin()) << ": 0x" << std::hex << *adcPtr << ".";
18  }
19 }
20 
21 std::ostream &mu2e::operator<<(std::ostream &os, DetectorFragment const &f) {
22  os << "DetectorFragment event size: " << f.hdr_event_size() << ", run number: " << f.hdr_run_number() << "\n";
23 
24  return os;
25 }
26 
27 // std::bitset<128> mu2e::DetectorFragment::bitArray(adc_t const * beginning) {
28 std::bitset<128> mu2e::DetectorFragment::bitArray(mu2e::DetectorFragment::adc_t const *beginning) const {
29  // Return 128 bit bitset filled with bits starting at the indicated position in the fragment
30  std::bitset<128> theArray;
31  for (int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
32  for (int offset = 0; offset < 16; offset++) {
33  if (((*((adc_t const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
34  theArray.set(bitIdx);
35  } else {
36  theArray.reset(bitIdx);
37  }
38  bitIdx--;
39  }
40  }
41  return theArray;
42 }
43 
44 void mu2e::DetectorFragment::fillBitArray(std::bitset<128> &theArray, adc_t const *beginning) {
45  // Fill bitset using the 128 bits starting at the indicated position in the fragment
46  for (int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
47  for (int offset = 0; offset < 16; offset++) {
48  if (((*((adc_t const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
49  theArray.set(bitIdx);
50  } else {
51  theArray.reset(bitIdx);
52  }
53  bitIdx--;
54  }
55  }
56 }
57 
58 void mu2e::DetectorFragment::printBitArray(std::bitset<128> theArray) {
59  // Print all 128 bits in the packet
60  std::cout << "\t\t"
61  << "Packet Bits (128): ";
62  for (int i = 0; i < 128; i++) {
63  std::cout << theArray[i];
64  }
65  std::cout << std::endl;
66 }
67 
68 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::convertFromBinary(std::bitset<128> theArray, int minIdx,
69  int maxIdx) const {
70  std::bitset<16> retVal;
71  for (int i = minIdx + 1; i <= maxIdx; i++) {
72  retVal.set(maxIdx - i, theArray[i]);
73  }
74  return retVal.to_ulong();
75 }
76 
77 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::byteCount() {
78  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 16, 127 - 0);
79 }
80 
81 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::rocID() {
82  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 20, 127 - 16);
83 }
84 
85 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetType() {
86  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 24, 127 - 20);
87 }
88 
89 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::valid() {
90  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 32, 127 - 31);
91 }
92 
93 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetCount() {
94  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 43, 127 - 32);
95 }
96 
97 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::status() {
98  return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 104, 127 - 96);
99 }
100 
101 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::timestampVector() {
102  std::vector<adc_t> theVector;
103  std::bitset<128> bitarray;
104  fillBitArray(bitarray, dataBlockBegin());
105 
106  for (int i = 0; i < 6; i++) {
107  theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (6 + i + 1), 127 - 8 * (6 + i)));
108  }
109 
110  return theVector;
111 }
112 
113 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::dataVector() {
114  std::vector<adc_t> theVector;
115  std::bitset<128> bitarray;
116  fillBitArray(bitarray, dataBlockBegin());
117 
118  for (int i = 0; i < 3; i++) {
119  theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (13 + i + 1), 127 - 8 * (13 + i)));
120  }
121 
122  return theVector;
123 }
124 
125 void mu2e::DetectorFragment::printDTCHeader() {
126  // std::cout << "\t\t" << "Binary Representation: ";
127  // printBitArray(bitArray(dataBlockBegin()));
128  std::cout << "\t\t"
129  << "ROC ID: " << (int)rocID() << std::endl;
130  std::cout << "\t\t"
131  << "Byte Count: " << (int)byteCount() << std::endl;
132  std::cout << "\t\t"
133  << "Packet Type: " << (int)packetType() << std::endl;
134  std::cout << "\t\t"
135  << "Valid: " << (int)valid() << std::endl;
136  std::cout << "\t\t"
137  << "Packet Count: " << (int)packetCount() << std::endl;
138  std::cout << "\t\t"
139  << "Status: " << (int)status() << std::endl;
140  std::cout << "\t\t"
141  << "Timestamp: {[";
142 
143  std::vector<mu2e::DetectorFragment::adc_t> tsVec = timestampVector();
144  for (size_t i = 0; i < tsVec.size(); i++) {
145  std::cout << (int)tsVec[i];
146  if (i < tsVec.size() - 1) {
147  std::cout << ",";
148  }
149  }
150  std::cout << "]}" << std::endl;
151 
152  std::cout << "\t\t"
153  << "Data: {[";
154  std::vector<mu2e::DetectorFragment::adc_t> dVec = dataVector();
155  for (size_t i = 0; i < dVec.size(); i++) {
156  std::cout << (int)dVec[i];
157  if (i < dVec.size() - 1) {
158  std::cout << ",";
159  }
160  }
161  std::cout << "]}" << std::endl;
162 }
163 
164 void mu2e::DetectorFragment::printAll() { printDTCHeader(); }