00001
00002
00003
00004
00005 #include "EventFilter/CSCRawToDigi/interface/CSCDCCEventData.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007 #include <iostream>
00008 #include <cstdio>
00009 #include "EventFilter/CSCRawToDigi/src/bitset_append.h"
00010
00011 bool CSCDCCEventData::debug = false;
00012
00013 CSCDCCEventData::CSCDCCEventData(int sourceId, int nDDUs, int bx, int l1a)
00014 : theDCCHeader(bx, l1a, sourceId)
00015 {
00016 theDDUData.reserve(nDDUs);
00017 }
00018
00019 CSCDCCEventData::CSCDCCEventData(unsigned short *buf, CSCDCCExaminer* examiner)
00020 {
00021 unpack_data(buf, examiner);
00022 }
00023
00024 CSCDCCEventData::~CSCDCCEventData()
00025 {
00026 }
00027
00028
00029 void CSCDCCEventData::unpack_data(unsigned short *buf, CSCDCCExaminer* examiner)
00030 {
00031
00032
00033
00034
00035 theDDUData.clear();
00036 if (debug)
00037 LogTrace ("CSCDCCEventData|CSCRawToDigi") << "CSCDCCEventData::unpack_data() is called";
00038
00039
00040 if (debug)
00041 LogTrace ("CSCDCCEventData|CSCRawToDigi") << "unpacking dcc header...";
00042 memcpy(&theDCCHeader, buf, theDCCHeader.sizeInWords()*2);
00043
00044 buf += theDCCHeader.sizeInWords();
00045
00046
00047
00049 while ( (buf[7]==0x8000)&&(buf[6]==0x0001)&&(buf[5]==0x8000))
00050 {
00051 CSCDDUEventData dduEventData(buf, examiner);
00052
00053
00054 if (debug) LogTrace ("CSCDCCEventData|CSCRawToDigi") << " checking ddu data integrity ";
00055 if (dduEventData.check())
00056 {
00057 theDDUData.push_back(dduEventData);
00058 buf += dduEventData.sizeInWords();
00059 }
00060 else
00061 {
00062 if (debug) LogTrace("CSCDCCEventData|CSCRawToDigi") <<"DDU Data Check failed! ";
00063 break;
00064 }
00065
00066 }
00067
00068 if (debug)
00069 {
00070 LogTrace ("CSCDCCEventData|CSCRawToDigi") << "unpacking dcc trailer ";
00071 LogTrace ("CSCDCCEventData|CSCRawToDigi") << std::hex << buf[3] <<" "
00072 << buf[2]<<" " << buf[1]<<" " << buf[0];
00073 }
00074
00075
00076 if (debug) LogTrace ("CSCDCCEventData|CSCRawToDigi") <<"decoding DCC trailer";
00077 memcpy(&theDCCTrailer, buf, theDCCTrailer.sizeInWords()*2);
00078 if (debug) LogTrace("CSCDCCEventData|CSCRawToDigi") << "checking DDU Trailer" << theDCCTrailer.check();
00079 buf += theDCCTrailer.sizeInWords();
00080
00081 }
00082
00083
00084 bool CSCDCCEventData::check() const
00085 {
00086
00087 if (debug)
00088 {
00089 LogTrace ("CSCDCCEventData|CSCRawToDigi") << "size in Words () = " << std::dec << sizeInWords();
00090 }
00091
00092 return theDCCHeader.check() && theDCCTrailer.check();
00093 }
00094
00095
00096 void CSCDCCEventData::addChamber(CSCEventData & chamber, int dduID, int dduSlot, int dmbID)
00097 {
00098
00099 std::vector<CSCDDUEventData>::iterator dduItr;
00100 int dduIndex = -1;
00101 int nDDUs = theDDUData.size();
00102 for(int i = 0; dduIndex == -1 && i < nDDUs; ++i)
00103 {
00104 if(theDDUData[i].header().source_id() == dduID) dduIndex = i;
00105 }
00106 if(dduIndex == -1)
00107 {
00108
00109 CSCDDUHeader newDDUHeader(dccHeader().getCDFBunchCounter(),
00110 dccHeader().getCDFEventNumber(), dduID);
00111 theDDUData.push_back(CSCDDUEventData(newDDUHeader));
00112 dduIndex = nDDUs;
00113 dccHeader().setDAV(dduSlot);
00114 }
00115 theDDUData[dduIndex].add(chamber, dmbID);
00116 }
00117
00118
00119 boost::dynamic_bitset<> CSCDCCEventData::pack()
00120 {
00121 boost::dynamic_bitset<> result( theDCCHeader.sizeInWords()*16);
00122 result = bitset_utilities::ushortToBitset(theDCCHeader.sizeInWords()*16, theDCCHeader.data());
00123
00124
00125
00126
00127
00128
00129
00130 for(size_t i = 0; i < theDDUData.size(); ++i)
00131 {
00132 result = bitset_utilities::append(result,theDDUData[i].pack());
00133
00134
00135
00136
00137 }
00138
00139
00140
00141
00142
00143
00144
00145 boost::dynamic_bitset<> dccTrailer = bitset_utilities::ushortToBitset(theDCCTrailer.sizeInWords()*16,
00146 theDCCTrailer.data());
00147 result = bitset_utilities::append(result,dccTrailer);
00148
00149 return result;
00150 }
00151