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 {
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 <<
".";
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";
28 std::bitset<128> mu2e::DetectorFragment::bitArray(mu2e::DetectorFragment::adc_t
const *beginning)
const {
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) {
36 theArray.reset(bitIdx);
44 void mu2e::DetectorFragment::fillBitArray(std::bitset<128> &theArray, adc_t
const *beginning) {
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) {
51 theArray.reset(bitIdx);
58 void mu2e::DetectorFragment::printBitArray(std::bitset<128> theArray) {
61 <<
"Packet Bits (128): ";
62 for (
int i = 0; i < 128; i++) {
63 std::cout << theArray[i];
65 std::cout << std::endl;
68 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::convertFromBinary(std::bitset<128> theArray,
int minIdx,
70 std::bitset<16> retVal;
71 for (
int i = minIdx + 1; i <= maxIdx; i++) {
72 retVal.set(maxIdx - i, theArray[i]);
74 return retVal.to_ulong();
77 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::byteCount() {
78 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 16, 127 - 0);
81 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::rocID() {
82 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 20, 127 - 16);
85 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetType() {
86 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 24, 127 - 20);
89 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::valid() {
90 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 32, 127 - 31);
93 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetCount() {
94 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 43, 127 - 32);
97 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::status() {
98 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 104, 127 - 96);
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());
106 for (
int i = 0; i < 6; i++) {
107 theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (6 + i + 1), 127 - 8 * (6 + i)));
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());
118 for (
int i = 0; i < 3; i++) {
119 theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (13 + i + 1), 127 - 8 * (13 + i)));
125 void mu2e::DetectorFragment::printDTCHeader() {
129 <<
"ROC ID: " << (int)rocID() << std::endl;
131 <<
"Byte Count: " << (int)byteCount() << std::endl;
133 <<
"Packet Type: " << (int)packetType() << std::endl;
135 <<
"Valid: " << (int)valid() << std::endl;
137 <<
"Packet Count: " << (int)packetCount() << std::endl;
139 <<
"Status: " << (int)status() << std::endl;
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) {
150 std::cout <<
"]}" << std::endl;
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) {
161 std::cout <<
"]}" << std::endl;
164 void mu2e::DetectorFragment::printAll() { printDTCHeader(); }