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