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