1 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
5 unsigned int pop_count (
unsigned int n) {
7 for (c = 0; n; c++) n &= n - 1;
13 void mu2e::DetectorFragment::checkADCData(
int daq_adc_bits)
const
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 <<
".";
22 std::ostream &mu2e::operator<<(std::ostream &os, DetectorFragment
const &f)
24 os <<
"DetectorFragment event size: " << f.hdr_event_size() <<
", run number: " << f.hdr_run_number() <<
"\n";
30 std::bitset<128> mu2e::DetectorFragment::bitArray(mu2e::DetectorFragment::adc_t
const *beginning)
const
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) {
41 theArray.reset(bitIdx);
49 void mu2e::DetectorFragment::fillBitArray(std::bitset<128> &theArray, adc_t
const *beginning)
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) {
59 theArray.reset(bitIdx);
66 void mu2e::DetectorFragment::printBitArray(std::bitset<128> theArray)
70 <<
"Packet Bits (128): ";
71 for (
int i = 0; i < 128; i++) {
72 std::cout << theArray[i];
74 std::cout << std::endl;
77 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::convertFromBinary(std::bitset<128> theArray,
int minIdx,
80 std::bitset<16> retVal;
81 for (
int i = minIdx + 1; i <= maxIdx; i++) {
82 retVal.set(maxIdx - i, theArray[i]);
84 return retVal.to_ulong();
87 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::byteCount()
89 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 16, 127 - 0);
92 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::rocID()
94 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 20, 127 - 16);
97 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetType()
99 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 24, 127 - 20);
102 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::valid()
104 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 32, 127 - 31);
107 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetCount()
109 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 43, 127 - 32);
112 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::status()
114 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 104, 127 - 96);
117 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::timestampVector()
119 std::vector<adc_t> theVector;
120 std::bitset<128> bitarray;
121 fillBitArray(bitarray, dataBlockBegin());
123 for (
int i = 0; i < 6; i++) {
124 theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (6 + i + 1), 127 - 8 * (6 + i)));
130 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::dataVector()
132 std::vector<adc_t> theVector;
133 std::bitset<128> bitarray;
134 fillBitArray(bitarray, dataBlockBegin());
136 for (
int i = 0; i < 3; i++) {
137 theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (13 + i + 1), 127 - 8 * (13 + i)));
143 void mu2e::DetectorFragment::printDTCHeader()
148 <<
"ROC ID: " << (int)rocID() << std::endl;
150 <<
"Byte Count: " << (int)byteCount() << std::endl;
152 <<
"Packet Type: " << (int)packetType() << std::endl;
154 <<
"Valid: " << (int)valid() << std::endl;
156 <<
"Packet Count: " << (int)packetCount() << std::endl;
158 <<
"Status: " << (int)status() << std::endl;
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) {
169 std::cout <<
"]}" << std::endl;
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) {
180 std::cout <<
"]}" << std::endl;
183 void mu2e::DetectorFragment::printAll() { printDTCHeader(); }