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