00001
00002
00003
00004
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
00030
00031
00032 bool HcalTTPData::check() const {
00033 if (m_formatVersion==-1) {
00034
00035
00036 if (m_rawLength<6+12) return false;
00037
00038 if (m_rawLength!=m_rawConst[m_rawLength-3]) return false;
00039
00040 if (m_rawConst[2]&0x20) return false;
00041 } else {
00042
00043
00044 if (m_rawLength<8+4) return false;
00045 if (m_formatVersion<=3) {
00046
00047 if (m_rawLength!=m_rawConst[m_rawLength-3]) {
00048 if (isHistogramEvent() && m_rawConst[m_rawLength-3]==786) {
00049
00050 } else
00051 return false;
00052 }
00053 } else {
00054
00055 }
00056
00057 if (m_rawConst[2]&0x4) return false;
00058 }
00059
00060
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;
00105 if (m_rawLength>4)
00106 dataWords=m_rawConst[m_rawLength-4]&0x7FF;
00107 else dataWords=0;
00108 }
00109