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