CMS 3D CMS Logo

CSCDCCEventData.cc

Go to the documentation of this file.
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   //for (int i=0;i<200;i++) {
00032   //  printf("%04x %04x %04x %04x\n",buf[i+3],buf[i+2],buf[i+1],buf[i]); 
00033   //  i+=3;
00034   //}
00035   theDDUData.clear();
00036   if (debug) 
00037     LogTrace ("CSCDCCEventData|CSCRawToDigi") << "CSCDCCEventData::unpack_data() is called";
00038 
00039   // decode DCC header (128 bits)
00040   if (debug) 
00041     LogTrace ("CSCDCCEventData|CSCRawToDigi") << "unpacking dcc header...";
00042   memcpy(&theDCCHeader, buf, theDCCHeader.sizeInWords()*2);
00043   //theDCCHeader = CSCDCCHeader(buf); // direct unpacking instead of bitfields
00044   buf += theDCCHeader.sizeInWords();
00045 
00046   //std::cout <<"Sandrik DCC Id = " << theDCCHeader.getCDFSourceId()  << std::endl;
00047  
00049   while ( (buf[7]==0x8000)&&(buf[6]==0x0001)&&(buf[5]==0x8000))
00050     {
00051        CSCDDUEventData dduEventData(buf, examiner);
00052 //      CSCDDUEventData dduEventData(buf);
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   //decode dcc trailer (128 bits)
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   // the trailer counts in 64-bit words
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   // first, find this DDU
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     // make a new one
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   //std::cout <<"SANDRIK DCC size of header  in words"<< theDCCHeader.sizeInWords()*16 <<std::endl;  
00124   //std::cout <<"SANDRIK DCC size of header in bits"<< result.size()<<std::endl;
00125   //for(size_t i = 0; i < result.size(); ++i) {
00126   //  std::cout<<result[i];
00127   //  if (((i+1)%32)==0) std::cout<<std::endl;
00128   //}
00129   
00130   for(size_t i = 0; i < theDDUData.size(); ++i) 
00131     {
00132       result = bitset_utilities::append(result,theDDUData[i].pack());
00133       //std::cout <<"SANDRIK here is ddu data check ";
00134       //theDDUData[i].header().check();
00135       //std::cout <<std::endl;
00136       //bitset_utilities::printWords(result);
00137     }
00138   
00139   //std::cout <<"SANDRIK packed dcc size is "<<result.size()<<std::endl;
00140   //for(size_t i = 0; i < result.size(); ++i) {
00141   //  std::cout<<result[i];
00142   //  if (((i+1)%32)==0) std::cout<<std::endl;
00143   //}
00144 
00145   boost::dynamic_bitset<> dccTrailer = bitset_utilities::ushortToBitset(theDCCTrailer.sizeInWords()*16,
00146                                                                         theDCCTrailer.data());
00147   result = bitset_utilities::append(result,dccTrailer);
00148   //  bitset_utilities::printWords(result);
00149   return result;
00150 }
00151 

Generated on Tue Jun 9 17:34:23 2009 for CMSSW by  doxygen 1.5.4