1 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
3 #include "cetlib/exception.h"
7 unsigned int pop_count (
unsigned int n) {
9 for (c = 0; n; c++) n &= n - 1;
15 void mu2e::DetectorFragment::checkADCData(
int daq_adc_bits)
const {
16 mu2e::DetectorFragment::adc_t
const * adcPtr(findBadADC(daq_adc_bits));
17 if (adcPtr != dataEnd()) {
18 throw cet::exception(
"IllegalADCVal")
19 <<
"Illegal value of ADC word #"
20 << (adcPtr - dataBegin())
28 std::ostream & mu2e::operator << (std::ostream & os, DetectorFragment
const & f) {
29 os <<
"DetectorFragment event size: "
39 std::bitset<128> mu2e::DetectorFragment::bitArray(mu2e::DetectorFragment::adc_t
const *beginning)
const {
41 std::bitset<128> theArray;
42 for(
int bitIdx=127, adcIdx = 0; adcIdx<8; adcIdx++) {
43 for(
int offset = 0; offset<16; offset++) {
44 if( ( (*((adc_t
const *)(beginning+adcIdx))) & (1<<offset) ) != 0) {
47 theArray.reset(bitIdx);
55 void mu2e::DetectorFragment::fillBitArray(std::bitset<128> &theArray, adc_t
const * beginning) {
57 for(
int bitIdx=127, adcIdx = 0; adcIdx<8; adcIdx++) {
58 for(
int offset = 0; offset<16; offset++) {
59 if( ( (*((adc_t
const *)(beginning+adcIdx))) & (1<<offset) ) != 0) {
62 theArray.reset(bitIdx);
69 void mu2e::DetectorFragment::printBitArray(std::bitset<128> theArray) {
71 std::cout <<
"\t\t" <<
"Packet Bits (128): ";
72 for(
int i=0; i<128; i++) {
73 std::cout << theArray[i];
75 std::cout << std::endl;
78 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::convertFromBinary(std::bitset<128> theArray,
int minIdx,
int maxIdx)
const {
79 std::bitset<16> retVal;
80 for(
int i=minIdx+1; i<=maxIdx; i++) {
81 retVal.set(maxIdx-i,theArray[i]);
83 return retVal.to_ulong();
86 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::byteCount() {
87 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-16,127-0);
90 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::rocID() {
91 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-20,127-16);
94 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetType() {
95 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-24,127-20);
98 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::ringID() {
99 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-28,127-24);
102 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::valid() {
103 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-32,127-31);
106 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetCount() {
107 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-43,127-32);
110 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::status() {
111 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()),127-104,127-96);
114 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::timestampVector() {
116 std::vector<adc_t> theVector;
117 std::bitset<128> bitarray;
118 fillBitArray(bitarray,dataBlockBegin());
120 for(
int i=0; i<6; i++) {
121 theVector.push_back(convertFromBinary(bitarray,127-8*(6+i + 1),127-8*(6+i)));
127 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::dataVector() {
129 std::vector<adc_t> theVector;
130 std::bitset<128> bitarray;
131 fillBitArray(bitarray,dataBlockBegin());
133 for(
int i=0; i<3; i++) {
134 theVector.push_back(convertFromBinary(bitarray,127-8*(13+i + 1),127-8*(13+i)));
140 void mu2e::DetectorFragment::printDTCHeader() {
143 std::cout <<
"\t\t" <<
"Ring ID: " << (int)ringID() << std::endl;
144 std::cout <<
"\t\t" <<
"ROC ID: " << (int)rocID() << std::endl;
145 std::cout <<
"\t\t" <<
"Byte Count: " << (int)byteCount() << std::endl;
146 std::cout <<
"\t\t" <<
"Packet Type: " << (int)packetType() << std::endl;
147 std::cout <<
"\t\t" <<
"Valid: " << (int)valid() << std::endl;
148 std::cout <<
"\t\t" <<
"Packet Count: " << (int)packetCount() << std::endl;
149 std::cout <<
"\t\t" <<
"Status: " << (int)status() << std::endl;
150 std::cout <<
"\t\t" <<
"Timestamp: {[";
152 std::vector<mu2e::DetectorFragment::adc_t> tsVec = timestampVector();
153 for(
size_t i=0; i<tsVec.size(); i++) {
154 std::cout << (int)tsVec[i];
155 if(i<tsVec.size()-1) {
159 std::cout <<
"]}" << std::endl;
161 std::cout <<
"\t\t" <<
"Data: {[";
162 std::vector<mu2e::DetectorFragment::adc_t> dVec = dataVector();
163 for(
size_t i=0; i<dVec.size(); i++) {
164 std::cout << (int)dVec[i];
165 if(i<dVec.size()-1) {
169 std::cout <<
"]}" << std::endl;
174 void mu2e::DetectorFragment::printAll() {