CMS 3D CMS Logo

HcalTTPData.cc

Go to the documentation of this file.
00001 /*  
00002  *  $Date: 2008/06/19 15:43:39 $
00003  *  $Revision: 1.1 $
00004  *  \author J. Mans -- UMN
00005  */
00006 #include "EventFilter/HcalRawToDigi/interface/HcalTTPData.h"
00007 #include <string.h>
00008 #include <stdio.h>
00009 
00010 HcalTTPData::HcalTTPData() {
00011 }
00012 HcalTTPData::HcalTTPData(const unsigned short* data, int length) : HcalHTRData(data,length) {
00013 }
00014 HcalTTPData::HcalTTPData(const HcalTTPData& hd) :HcalHTRData(hd) {
00015 }
00016 
00017 HcalTTPData::HcalTTPData(int version_to_create) : HcalHTRData(version_to_create) {
00018 }
00019 
00020 HcalTTPData& HcalTTPData::operator=(const HcalTTPData& hd) {
00021   if (m_ownData==0) {
00022     m_formatVersion=hd.m_formatVersion;
00023     m_rawLength=hd.m_rawLength;
00024     m_rawConst=hd.m_rawConst;
00025   }
00026   return (*this);
00027 }
00028 
00029 // check :: not EE, length is reasonable, length matches wordcount
00030 //          length required for tp+daq is correct
00031 
00032 bool HcalTTPData::check() const {
00033   if (m_formatVersion==-1) {
00034     // length checks
00035     //  minimum length
00036     if (m_rawLength<6+12) return false;
00037     //  matches wordcount
00038     if (m_rawLength!=m_rawConst[m_rawLength-3]) return false;
00039     // empty event check
00040     if (m_rawConst[2]&0x20) return false;
00041   } else {
00042     // length checks
00043     //  minimum length
00044     if (m_rawLength<8+4) return false;
00045     if (m_formatVersion<=3) {
00046       //  matches wordcount
00047       if (m_rawLength!=m_rawConst[m_rawLength-3]) {
00048         if (isHistogramEvent() && m_rawConst[m_rawLength-3]==786) {
00049           // known bug!
00050         } else
00051           return false;
00052       }
00053     } else { 
00054       // eventually add CRC check
00055     }
00056     // empty event check (redundant...)
00057     if (m_rawConst[2]&0x4) return false;
00058   }
00059 
00060   // daq/tp length check
00061   int daq, header, trailer;
00062   determineSectionLengths(daq,header,trailer);
00063   if (daq+header+trailer>m_rawLength) return false;
00064 
00065   return true;
00066 }
00067 
00068 static void copyBits(const unsigned short val, std::vector<bool>& ib, int from, int n=16, int offset=0) {
00069   for (int i=0; i<n; i++)
00070     ib[from+i]=((val)&(1<<(i+offset)))!=0;
00071 }
00072 
00073 void HcalTTPData::unpack(std::vector<InputBits>& ivs, std::vector<AlgoBits>& avs) const {
00074   ivs.clear();
00075   avs.clear();
00076 
00077   int dw, hw, tw;
00078   InputBits dummy1(TTP_INPUTS);
00079   AlgoBits dummy2(TTP_ALGOBITS);
00080   determineSectionLengths(dw,hw,tw);
00081 
00082   const unsigned short* workptr=m_rawConst+hw;
00083   for (int i=0; i<dw; i++) {   
00084     switch (i%6) {
00085     case 0: 
00086       ivs.push_back(dummy1);
00087       copyBits(workptr[i], ivs.back(),0);
00088       break;
00089     case 1: copyBits(workptr[i], ivs.back(), 16); break;
00090     case 2: copyBits(workptr[i], ivs.back(), 32); break;
00091     case 3: copyBits(workptr[i], ivs.back(), 48); break;
00092     case 4: 
00093       copyBits(workptr[i], ivs.back(), 64,8); 
00094       avs.push_back(dummy2);
00095       copyBits(workptr[i],avs.back(),0,8,8);
00096       break;      
00097     case 5: copyBits(workptr[i], avs.back(), 8); break;
00098     }
00099   }  
00100 }
00101 
00102 void HcalTTPData::determineSectionLengths(int& dataWords, int& headerWords, int& trailerWords) const {
00103   headerWords=8;
00104   trailerWords=4; // minimum, may be more...
00105   if (m_rawLength>4)
00106     dataWords=m_rawConst[m_rawLength-4]&0x7FF; // zero suppression supported
00107   else dataWords=0;
00108 }
00109 

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