diff --git a/DataFormats/HcalDigi/interface/QIE10DataFrame.h b/DataFormats/HcalDigi/interface/QIE10DataFrame.h index be42af89b02ee..63af86591c492 100644 --- a/DataFormats/HcalDigi/interface/QIE10DataFrame.h +++ b/DataFormats/HcalDigi/interface/QIE10DataFrame.h @@ -3,13 +3,12 @@ #include "DataFormats/HcalDetId/interface/HcalDetId.h" #include "DataFormats/Common/interface/DataFrame.h" -#include "DataFormats/Common/interface/DataFrameContainer.h" #include /** Precision readout digi from QIE10 including TDC information */ -class QIE10DataFrame : protected edm::DataFrame { +class QIE10DataFrame { public: static const int WORDS_PER_SAMPLE = 2; @@ -17,8 +16,7 @@ class QIE10DataFrame : protected edm::DataFrame { static const int FLAG_WORDS = 1; QIE10DataFrame() { } - QIE10DataFrame(const edm::DataFrameContainer& c, edm::DataFrame::size_type i) : edm::DataFrame(c,i) { } - QIE10DataFrame(edm::DataFrame df) : edm::DataFrame(df) { } + QIE10DataFrame(edm::DataFrame const & df) : m_data(df) { } class Sample { public: @@ -42,29 +40,49 @@ class QIE10DataFrame : protected edm::DataFrame { edm::DataFrame::size_type i_; }; + void copyContent(const QIE10DataFrame& src); + /// Get the detector id - DetId detid() const { return DetId(id()); } + DetId detid() const { return DetId(m_data.id()); } + edm::DataFrame::id_type id() const { return m_data.id(); } + /// more accessors + edm::DataFrame::size_type size() const { return m_data.size(); } + /// iterators + edm::DataFrame::iterator begin() { return m_data.begin(); } + edm::DataFrame::iterator end() { return m_data.end(); } + edm::DataFrame::const_iterator begin() const { return m_data.begin(); } + edm::DataFrame::const_iterator end() const { return m_data.end(); } /// total number of samples in the digi int samples() const { return (size()-HEADER_WORDS-FLAG_WORDS)/WORDS_PER_SAMPLE; } + /// for backward compatibility + int presamples() const; /// get the flavor of the frame static const int OFFSET_FLAVOR = 12; static const int MASK_FLAVOR = 0x7; - int flavor() const { return ((edm::DataFrame::operator[](0)>>OFFSET_FLAVOR)&MASK_FLAVOR); } + int flavor() const { return ((m_data[0]>>OFFSET_FLAVOR)&MASK_FLAVOR); } /// was there a link error? static const int MASK_LINKERROR = 0x800; - bool linkError() const { return edm::DataFrame::operator[](0)&MASK_LINKERROR; } + bool linkError() const { return m_data[0]&MASK_LINKERROR; } /// was this a mark-and-pass ZS event? static const int MASK_MARKPASS = 0x100; - bool wasMarkAndPass() const {return edm::DataFrame::operator[](0)&MASK_MARKPASS; } + bool zsMarkAndPass() const {return m_data[0]&MASK_MARKPASS; } + /// other ZS functions (TODO: real implementation) + bool zsUnsuppressed() const { return false; } + uint32_t zsCrossingMask() const { return 0; } + /// set ZS params + void setZSInfo(bool unsuppressed, bool markAndPass, uint32_t crossingMask=0); /// get the sample - inline Sample operator[](edm::DataFrame::size_type i) const { return Sample(*this,i*WORDS_PER_SAMPLE+HEADER_WORDS); } + inline Sample operator[](edm::DataFrame::size_type i) const { return Sample(m_data,i*WORDS_PER_SAMPLE+HEADER_WORDS); } /// set the sample contents - void setSample(edm::DataFrame::size_type isample, int adc, int le_tdc, int fe_tdc, int capid, bool soi=false, bool ok=true); + void setSample(edm::DataFrame::size_type isample, int adc, int le_tdc, int te_tdc, int capid, bool soi=false, bool ok=true); /// get the flag word - uint16_t flags() const { return edm::DataFrame::operator[](size()-1); } + uint16_t flags() const { return m_data[size()-1]; } /// set the flag word void setFlags(uint16_t v); + private: + edm::DataFrame m_data; + }; std::ostream& operator<<(std::ostream&, const QIE10DataFrame&); diff --git a/DataFormats/HcalDigi/interface/QIE11DataFrame.h b/DataFormats/HcalDigi/interface/QIE11DataFrame.h index 51b2c13cf01ca..03ecbca3fdc12 100644 --- a/DataFormats/HcalDigi/interface/QIE11DataFrame.h +++ b/DataFormats/HcalDigi/interface/QIE11DataFrame.h @@ -3,13 +3,12 @@ #include "DataFormats/HcalDetId/interface/HcalDetId.h" #include "DataFormats/Common/interface/DataFrame.h" -#include "DataFormats/Common/interface/DataFrameContainer.h" #include /** Precision readout digi from QIE11 including TDC information */ -class QIE11DataFrame : protected edm::DataFrame { +class QIE11DataFrame { public: static const int WORDS_PER_SAMPLE = 1; @@ -17,8 +16,7 @@ class QIE11DataFrame : protected edm::DataFrame { static const int FLAG_WORDS = 1; QIE11DataFrame() { } - QIE11DataFrame(const edm::DataFrameContainer& c, edm::DataFrame::size_type i) : edm::DataFrame(c,i) { } - QIE11DataFrame(edm::DataFrame df) : edm::DataFrame(df) { } + QIE11DataFrame(edm::DataFrame const & df) : m_data(df) { } class Sample { public: @@ -38,32 +36,50 @@ class QIE11DataFrame : protected edm::DataFrame { edm::DataFrame::size_type i_; }; + void copyContent(const QIE11DataFrame&); + /// Get the detector id - DetId detid() const { return DetId(id()); } + DetId detid() const { return DetId(m_data.id()); } + edm::DataFrame::id_type id() const { return m_data.id(); } + /// more accessors + edm::DataFrame::size_type size() const { return m_data.size(); } + /// iterators + edm::DataFrame::iterator begin() { return m_data.begin(); } + edm::DataFrame::iterator end() { return m_data.end(); } + edm::DataFrame::const_iterator begin() const { return m_data.begin(); } + edm::DataFrame::const_iterator end() const { return m_data.end(); } /// total number of samples in the digi int samples() const { return (size()-HEADER_WORDS-FLAG_WORDS)/WORDS_PER_SAMPLE; } + /// for backward compatibility + int presamples() const; /// get the flavor of the frame static const int OFFSET_FLAVOR = 12; static const int MASK_FLAVOR = 0x7; - int flavor() const { return ((edm::DataFrame::operator[](0)>>OFFSET_FLAVOR)&MASK_FLAVOR); } + int flavor() const { return ((m_data[0]>>OFFSET_FLAVOR)&MASK_FLAVOR); } /// was there a link error? static const int MASK_LINKERROR = 0x800; - bool linkError() const { return edm::DataFrame::operator[](0)&MASK_LINKERROR; } + bool linkError() const { return m_data[0]&MASK_LINKERROR; } /// was there a capid rotation error? static const int MASK_CAPIDERROR = 0x400; - bool capidError() const { return edm::DataFrame::operator[](0)&MASK_CAPIDERROR; } + bool capidError() const { return m_data[0]&MASK_CAPIDERROR; } /// was this a mark-and-pass ZS event? - bool wasMarkAndPass() const {return (flavor()==1); } + bool zsMarkAndPass() const {return (flavor()==1); } + /// other ZS functions (TODO: real implementation) + bool zsUnsuppressed() const { return false; } + uint32_t zsCrossingMask() const { return 0; } /// get the sample - inline Sample operator[](edm::DataFrame::size_type i) const { return Sample(*this,i+HEADER_WORDS); } + inline Sample operator[](edm::DataFrame::size_type i) const { return Sample(m_data,i+HEADER_WORDS); } void setCapid0(int cap0); /// set the sample contents void setSample(edm::DataFrame::size_type isample, int adc, int tdc, bool soi=false); /// get the flag word - uint16_t flags() const { return edm::DataFrame::operator[](size()-1); } + uint16_t flags() const { return m_data[size()-1]; } /// set the flag word void setFlags(uint16_t v); + private: + edm::DataFrame m_data; + }; std::ostream& operator<<(std::ostream&, const QIE11DataFrame&); diff --git a/DataFormats/HcalDigi/src/QIE10DataFrame.cc b/DataFormats/HcalDigi/src/QIE10DataFrame.cc index 4c2c2023f663d..6d23091766e76 100644 --- a/DataFormats/HcalDigi/src/QIE10DataFrame.cc +++ b/DataFormats/HcalDigi/src/QIE10DataFrame.cc @@ -1,16 +1,33 @@ #include "DataFormats/HcalDigi/interface/QIE10DataFrame.h" #include "DataFormats/HcalDetId/interface/HcalGenericDetId.h" -void QIE10DataFrame::setSample(edm::DataFrame::size_type isample, int adc, int le_tdc, int fe_tdc, int capid, bool soi, bool ok) { +void QIE10DataFrame::setSample(edm::DataFrame::size_type isample, int adc, int le_tdc, int te_tdc, int capid, bool soi, bool ok) { if (isample>=size()) return; - edm::DataFrame::operator[](isample*WORDS_PER_SAMPLE+HEADER_WORDS)=(adc&Sample::MASK_ADC)|(soi?(Sample::MASK_SOI):(0))|(ok?(Sample::MASK_OK):(0)); - edm::DataFrame::operator[](isample*WORDS_PER_SAMPLE+HEADER_WORDS+1)=(le_tdc&Sample::MASK_LE_TDC)|((fe_tdc&Sample::MASK_TE_TDC)<=size()) return; - edm::DataFrame::operator[](isample+1)=(adc&Sample::MASK_ADC)|(soi?(Sample::MASK_SOI):(0))|((tdc&Sample::MASK_TDC)<* tphoCont; std::vector* ttp; QIE10DigiCollection* qie10; + QIE11DigiCollection* qie11; + }; /// for normal data diff --git a/EventFilter/HcalRawToDigi/plugins/HcalRawToDigi.cc b/EventFilter/HcalRawToDigi/plugins/HcalRawToDigi.cc index 54fb50c99835c..a1ea4433b8d8c 100644 --- a/EventFilter/HcalRawToDigi/plugins/HcalRawToDigi.cc +++ b/EventFilter/HcalRawToDigi/plugins/HcalRawToDigi.cc @@ -60,7 +60,8 @@ HcalRawToDigi::HcalRawToDigi(edm::ParameterSet const& conf): if (unpackTTP_) produces(); produces(); - + produces(); + memset(&stats_,0,sizeof(stats_)); } @@ -194,6 +195,10 @@ void HcalRawToDigi::produce(edm::Event& e, const edm::EventSetup& es) colls.qie10 = new QIE10DigiCollection(); } std::auto_ptr qie10_prod(colls.qie10); + if (colls.qie11 == 0) { + colls.qie11 = new QIE11DigiCollection(); + } + std::auto_ptr qie11_prod(colls.qie11); hbhe_prod->swap_contents(hbhe); if( !cntHFdup ) hf_prod->swap_contents(hf); @@ -221,6 +226,7 @@ void HcalRawToDigi::produce(edm::Event& e, const edm::EventSetup& es) htp_prod->sort(); hotp_prod->sort(); qie10_prod->sort(); + qie11_prod->sort(); e.put(hbhe_prod); e.put(ho_prod); @@ -228,6 +234,7 @@ void HcalRawToDigi::produce(edm::Event& e, const edm::EventSetup& es) e.put(htp_prod); e.put(hotp_prod); e.put(qie10_prod); + e.put(qie11_prod); /// calib if (unpackCalib_) { diff --git a/EventFilter/HcalRawToDigi/src/HcalUHTRData.cc b/EventFilter/HcalRawToDigi/src/HcalUHTRData.cc index e0e3fd02180fd..b9479d1c63769 100644 --- a/EventFilter/HcalRawToDigi/src/HcalUHTRData.cc +++ b/EventFilter/HcalRawToDigi/src/HcalUHTRData.cc @@ -3,7 +3,7 @@ static const int HEADER_LENGTH_16BIT=2*sizeof(uint64_t)/sizeof(uint16_t); -HcalUHTRData::const_iterator::const_iterator(const uint16_t* ptr, const uint16_t* limit) : m_ptr(ptr), m_limit(limit) { +HcalUHTRData::const_iterator::const_iterator(const uint16_t* ptr, const uint16_t* limit) : m_ptr(ptr), m_limit(limit), m_stepclass(0) { if (isHeader()) determineMode(); } diff --git a/EventFilter/HcalRawToDigi/src/HcalUnpacker.cc b/EventFilter/HcalRawToDigi/src/HcalUnpacker.cc index c379ae3577157..8931e325aabbd 100644 --- a/EventFilter/HcalRawToDigi/src/HcalUnpacker.cc +++ b/EventFilter/HcalRawToDigi/src/HcalUnpacker.cc @@ -9,6 +9,8 @@ #include "FWCore/MessageLogger/interface/MessageLogger.h" #include "EventFilter/HcalRawToDigi/interface/HcalTTPUnpacker.h" +//#define DebugLog + namespace HcalUnpacker_impl { template const HcalQIESample* unpack(const HcalQIESample* startPoint, const HcalQIESample* limit, DigiClass& digi, int presamples, const HcalElectronicsId& eid, int startSample, int endSample, int expectedTime, const HcalHTRData& hhd) { @@ -22,7 +24,9 @@ namespace HcalUnpacker_impl { digi.setZSInfo(hhd.isUnsuppressed(),hhd.wasMarkAndPassZS(fiber,fiberchan),zsmask); if (expectedTime>=0 && !hhd.isUnsuppressed()) { - // std::cout << hhd.getFibOrbMsgBCN(fiber) << " " << expectedTime << std::endl; +#ifdef DebugLog + std::cout << hhd.getFibOrbMsgBCN(fiber) << " " << expectedTime << std::endl; +#endif digi.setFiberIdleOffset(hhd.getFibOrbMsgBCN(fiber)-expectedTime); } @@ -63,7 +67,9 @@ namespace HcalUnpacker_impl { digi.setZSInfo(hhd.isUnsuppressed(),hhd.wasMarkAndPassZS(fiber,fiberchan),zsmask); if (expectedTime>=0 && !hhd.isUnsuppressed()) { - // std::cout << hhd.getFibOrbMsgBCN(fiber) << " " << expectedTime << std::endl; +#ifdef DebugLog + std::cout << hhd.getFibOrbMsgBCN(fiber) << " " << expectedTime << std::endl; +#endif digi.setFiberIdleOffset(hhd.getFibOrbMsgBCN(fiber)-expectedTime); } @@ -582,17 +588,71 @@ void HcalUnpacker::unpackUTCA(const FEDRawData& raw, const HcalElectronicsMap& e int nps=(amc13->AMCId(iamc)>>12)&0xF; HcalUHTRData uhtr(amc13->AMCPayload(iamc),amc13->AMCSize(iamc)); +#ifdef DebugLog + //debug printouts + int nwords=uhtr.getRawLengthBytes()/2; + for (int iw=0; iw>3)&0x1F); + int ichan=(i.channelid()&0x7); + HcalElectronicsId eid(crate,slot,ifiber,ichan, false); + DetId did=emap.lookup(eid); + // Count from current position to next header, or equal to end + const uint16_t* head_pos = i.raw(); + int ns = 0; + for (++i; i != iend && !i.isHeader(); ++i) { + ns++; + } + // Check QEI11 container exists + if (colls.qie11 == 0) { + colls.qie11 = new QIE11DigiCollection(ns); + } + else if (colls.qie11->samples() != ns) { + // This is horrible + edm::LogError("Invalid Data") << "Collection has " << colls.qie11->samples() << " samples per digi, raw data has " << ns << "!"; + return; + } + + // Insert data + /////////////////////////////////////////////CODE FROM OLD STYLE DIGIS/////////////////////////////////////////////////////////////// + if (!did.null()) { // unpack and store... + colls.qie11->addDataFrame(did, head_pos); + } else { + report.countUnmappedDigi(eid); + if (unknownIds_.find(eid)==unknownIds_.end()) { + if (!silent) edm::LogWarning("HCAL") << "HcalUnpacker: No match found for electronics id :" << eid; + unknownIds_.insert(eid); +#ifdef DebugLog + std::cout << "HcalUnpacker: No match found for electronics id :" << eid << std::endl; +#endif + } +#ifdef DebugLog + std::cout << "OH NO! detector id is null!" << std::endl; +#endif + } + } + + //////////////////////////////////////////////////HF UNPACKER///////////////////////////////////////////////////////////////////// if (i.flavor() == 2) { - int ifiber=((i.channelid()>>2)&0x1F); - int ichan=(i.channelid()&0x3); + int ifiber=((i.channelid()>>3)&0x1F); + int ichan=(i.channelid()&0x7); HcalElectronicsId eid(crate,slot,ifiber,ichan, false); DetId did=emap.lookup(eid); @@ -614,7 +674,22 @@ void HcalUnpacker::unpackUTCA(const FEDRawData& raw, const HcalElectronicsMap& e } // Insert data - colls.qie10->addDataFrame(did, head_pos); + /////////////////////////////////////////////CODE FROM OLD STYLE DIGIS/////////////////////////////////////////////////////////////// + if (!did.null()) { // unpack and store... + colls.qie10->addDataFrame(did, head_pos); + } else { + report.countUnmappedDigi(eid); + if (unknownIds_.find(eid)==unknownIds_.end()) { + if (!silent) edm::LogWarning("HCAL") << "HcalUnpacker: No match found for electronics id :" << eid; + unknownIds_.insert(eid); +#ifdef DebugLog + std::cout << "HcalUnpacker: No match found for electronics id :" << eid << std::endl; +#endif + } +#ifdef DebugLog + std::cout << "OH NO! HcalUnpacker: No match found for electronics id :" << eid << std::endl; +#endif + } } else if (i.flavor()==0x5) { // Old-style digis int ifiber=((i.channelid()>>2)&0x1F); @@ -672,7 +747,9 @@ void HcalUnpacker::unpackUTCA(const FEDRawData& raw, const HcalElectronicsMap& e int itower=(i.channelid()&0xF); HcalElectronicsId eid(crate,slot,ilink,itower,true); DetId did=emap.lookupTrigger(eid); - //std::cout << "Unpacking " << eid << " " << i.channelid() << std::endl; +#ifdef DebugLog + std::cout << "Unpacking " << eid << " " << i.channelid() << std::endl; +#endif if (did.null()) { report.countUnmappedTPDigi(eid); if (unknownIdsTrig_.find(eid)==unknownIdsTrig_.end()) { @@ -686,7 +763,9 @@ void HcalUnpacker::unpackUTCA(const FEDRawData& raw, const HcalElectronicsMap& e for (++i; i!=iend && !i.isHeader(); ++i); } else { HcalTrigTowerDetId id(did); - //std::cout << "Unpacking " << id << std::endl; +#ifdef DebugLog + std::cout << "Unpacking " << id << std::endl; +#endif colls.tpCont->push_back(HcalTriggerPrimitiveDigi(id)); int j=0; for (++i; i!=iend && !i.isHeader(); ++i) { @@ -715,6 +794,7 @@ HcalUnpacker::Collections::Collections() { calibCont=0; ttp=0; qie10=0; + qie11=0; } void HcalUnpacker::unpack(const FEDRawData& raw, const HcalElectronicsMap& emap, std::vector& histoDigis) {