00001 #include "mu2e-artdaq-core/Overlays/DetectorFragment.hh"
00002
00003 #if 0
00004 namespace {
00005 unsigned int pop_count (unsigned int n) {
00006 unsigned int c;
00007 for (c = 0; n; c++) n &= n - 1;
00008 return c;
00009 }
00010 }
00011 #endif
00012
00013 void mu2e::DetectorFragment::checkADCData(int daq_adc_bits) const {
00014 mu2e::DetectorFragment::adc_t const *adcPtr(findBadADC(daq_adc_bits));
00015 if (adcPtr != dataEnd()) {
00016 throw cet::exception("IllegalADCVal")
00017 << "Illegal value of ADC word #" << (adcPtr - dataBegin()) << ": 0x" << std::hex << *adcPtr << ".";
00018 }
00019 }
00020
00021 std::ostream &mu2e::operator<<(std::ostream &os, DetectorFragment const &f) {
00022 os << "DetectorFragment event size: " << f.hdr_event_size() << ", run number: " << f.hdr_run_number() << "\n";
00023
00024 return os;
00025 }
00026
00027
00028 std::bitset<128> mu2e::DetectorFragment::bitArray(mu2e::DetectorFragment::adc_t const *beginning) const {
00029
00030 std::bitset<128> theArray;
00031 for (int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
00032 for (int offset = 0; offset < 16; offset++) {
00033 if (((*((adc_t const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
00034 theArray.set(bitIdx);
00035 } else {
00036 theArray.reset(bitIdx);
00037 }
00038 bitIdx--;
00039 }
00040 }
00041 return theArray;
00042 }
00043
00044 void mu2e::DetectorFragment::fillBitArray(std::bitset<128> &theArray, adc_t const *beginning) {
00045
00046 for (int bitIdx = 127, adcIdx = 0; adcIdx < 8; adcIdx++) {
00047 for (int offset = 0; offset < 16; offset++) {
00048 if (((*((adc_t const *)(beginning + adcIdx))) & (1 << offset)) != 0) {
00049 theArray.set(bitIdx);
00050 } else {
00051 theArray.reset(bitIdx);
00052 }
00053 bitIdx--;
00054 }
00055 }
00056 }
00057
00058 void mu2e::DetectorFragment::printBitArray(std::bitset<128> theArray) {
00059
00060 std::cout << "\t\t"
00061 << "Packet Bits (128): ";
00062 for (int i = 0; i < 128; i++) {
00063 std::cout << theArray[i];
00064 }
00065 std::cout << std::endl;
00066 }
00067
00068 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::convertFromBinary(std::bitset<128> theArray, int minIdx,
00069 int maxIdx) const {
00070 std::bitset<16> retVal;
00071 for (int i = minIdx + 1; i <= maxIdx; i++) {
00072 retVal.set(maxIdx - i, theArray[i]);
00073 }
00074 return retVal.to_ulong();
00075 }
00076
00077 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::byteCount() {
00078 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 16, 127 - 0);
00079 }
00080
00081 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::rocID() {
00082 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 20, 127 - 16);
00083 }
00084
00085 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetType() {
00086 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 24, 127 - 20);
00087 }
00088
00089 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::valid() {
00090 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 32, 127 - 31);
00091 }
00092
00093 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::packetCount() {
00094 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 43, 127 - 32);
00095 }
00096
00097 mu2e::DetectorFragment::adc_t mu2e::DetectorFragment::status() {
00098 return mu2e::DetectorFragment::convertFromBinary(bitArray(dataBlockBegin()), 127 - 104, 127 - 96);
00099 }
00100
00101 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::timestampVector() {
00102 std::vector<adc_t> theVector;
00103 std::bitset<128> bitarray;
00104 fillBitArray(bitarray, dataBlockBegin());
00105
00106 for (int i = 0; i < 6; i++) {
00107 theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (6 + i + 1), 127 - 8 * (6 + i)));
00108 }
00109
00110 return theVector;
00111 }
00112
00113 std::vector<mu2e::DetectorFragment::adc_t> mu2e::DetectorFragment::dataVector() {
00114 std::vector<adc_t> theVector;
00115 std::bitset<128> bitarray;
00116 fillBitArray(bitarray, dataBlockBegin());
00117
00118 for (int i = 0; i < 3; i++) {
00119 theVector.push_back(convertFromBinary(bitarray, 127 - 8 * (13 + i + 1), 127 - 8 * (13 + i)));
00120 }
00121
00122 return theVector;
00123 }
00124
00125 void mu2e::DetectorFragment::printDTCHeader() {
00126
00127
00128 std::cout << "\t\t"
00129 << "ROC ID: " << (int)rocID() << std::endl;
00130 std::cout << "\t\t"
00131 << "Byte Count: " << (int)byteCount() << std::endl;
00132 std::cout << "\t\t"
00133 << "Packet Type: " << (int)packetType() << std::endl;
00134 std::cout << "\t\t"
00135 << "Valid: " << (int)valid() << std::endl;
00136 std::cout << "\t\t"
00137 << "Packet Count: " << (int)packetCount() << std::endl;
00138 std::cout << "\t\t"
00139 << "Status: " << (int)status() << std::endl;
00140 std::cout << "\t\t"
00141 << "Timestamp: {[";
00142
00143 std::vector<mu2e::DetectorFragment::adc_t> tsVec = timestampVector();
00144 for (size_t i = 0; i < tsVec.size(); i++) {
00145 std::cout << (int)tsVec[i];
00146 if (i < tsVec.size() - 1) {
00147 std::cout << ",";
00148 }
00149 }
00150 std::cout << "]}" << std::endl;
00151
00152 std::cout << "\t\t"
00153 << "Data: {[";
00154 std::vector<mu2e::DetectorFragment::adc_t> dVec = dataVector();
00155 for (size_t i = 0; i < dVec.size(); i++) {
00156 std::cout << (int)dVec[i];
00157 if (i < dVec.size() - 1) {
00158 std::cout << ",";
00159 }
00160 }
00161 std::cout << "]}" << std::endl;
00162 }
00163
00164 void mu2e::DetectorFragment::printAll() { printDTCHeader(); }