diff --git a/DataFormats/OnlineMetaData/interface/DCSRecord.h b/DataFormats/OnlineMetaData/interface/DCSRecord.h index 5b8a5460b69c9..cda8d33cdbdd2 100644 --- a/DataFormats/OnlineMetaData/interface/DCSRecord.h +++ b/DataFormats/OnlineMetaData/interface/DCSRecord.h @@ -54,6 +54,7 @@ class DCSRecord { DCSRecord(); explicit DCSRecord(const online::DCS_v1&); + explicit DCSRecord(const online::DCS_v2&); virtual ~DCSRecord(); /// Return the time of the last change @@ -69,6 +70,9 @@ class DCSRecord { /// Return true if the high voltage of the given parition is ready bool highVoltageReady(const uint8_t partitionNumber) const { return highVoltageReady_.test(partitionNumber); } + /// Return true if the high voltage bit of the given partition is valid + bool highVoltageValid(const uint8_t partitionNumber) const { return highVoltageValid_.test(partitionNumber); } + /// Return the current of the CMS magnet in A float magnetCurrent() const { return magnetCurrent_; } @@ -79,6 +83,7 @@ class DCSRecord { private: edm::Timestamp timestamp_; std::bitset highVoltageReady_; + std::bitset highVoltageValid_; float magnetCurrent_; static const ParitionNames partitionNames_; }; diff --git a/DataFormats/OnlineMetaData/interface/OnlineMetaDataRaw.h b/DataFormats/OnlineMetaData/interface/OnlineMetaDataRaw.h index 77ab40ef454dd..ba36cfed38fe3 100644 --- a/DataFormats/OnlineMetaData/interface/OnlineMetaDataRaw.h +++ b/DataFormats/OnlineMetaData/interface/OnlineMetaDataRaw.h @@ -51,6 +51,13 @@ namespace online { const float magnetCurrent; }; + struct DCS_v2 { + const uint64_t timestamp; + const uint32_t highVoltageReady; + const uint32_t highVoltageValid; + const float magnetCurrent; + }; + struct Data_v1 { const uint8_t version; const Luminosity_v1 luminosity; @@ -66,6 +73,14 @@ namespace online { const DCS_v1 dcs; }; + struct Data_v3 { + const uint8_t version; + const Luminosity_v1 luminosity; + const BeamSpot_v1 beamSpot; + const CTPPS_v1 ctpps; + const DCS_v2 dcs; + }; + } // namespace online #endif // DATAFORMATS_ONLINEMETADATA_ONLINEMETADATARAW_H diff --git a/DataFormats/OnlineMetaData/src/DCSRecord.cc b/DataFormats/OnlineMetaData/src/DCSRecord.cc index 2d112aa28c55d..19019c7a46bd2 100644 --- a/DataFormats/OnlineMetaData/src/DCSRecord.cc +++ b/DataFormats/OnlineMetaData/src/DCSRecord.cc @@ -16,6 +16,18 @@ DCSRecord::DCSRecord(const online::DCS_v1& dcs) { const uint32_t microseconds = (dcs.timestamp % 1000) * 1000; timestamp_ = edm::Timestamp((seconds << 32) | microseconds); highVoltageReady_ = dcs.highVoltageReady; + //bit always valid for V1 + highVoltageValid_ = 0xffffffff; + magnetCurrent_ = dcs.magnetCurrent; +} + +DCSRecord::DCSRecord(const online::DCS_v2& dcs) { + // DIP timestamp is in milliseconds + const uint64_t seconds = dcs.timestamp / 1000; + const uint32_t microseconds = (dcs.timestamp % 1000) * 1000; + timestamp_ = edm::Timestamp((seconds << 32) | microseconds); + highVoltageReady_ = dcs.highVoltageReady; + highVoltageValid_ = dcs.highVoltageValid; magnetCurrent_ = dcs.magnetCurrent; } @@ -37,7 +49,7 @@ std::ostream& operator<<(std::ostream& s, const DCSRecord& dcs) { for (unsigned int i = 0; i < DCSRecord::Partition::Last; ++i) { s << " " << std::setw(7) << std::left << dcs.partitionName(i) << ": " - << (dcs.highVoltageReady(i) ? "READY" : "OFF") << std::endl; + << (!dcs.highVoltageValid(i) ? "N/A" : (dcs.highVoltageReady(i) ? "READY" : "OFF")) << std::endl; } return s; diff --git a/DataFormats/OnlineMetaData/src/classes_def.xml b/DataFormats/OnlineMetaData/src/classes_def.xml index 68e648ac990d8..ea8f3e6d2b49b 100644 --- a/DataFormats/OnlineMetaData/src/classes_def.xml +++ b/DataFormats/OnlineMetaData/src/classes_def.xml @@ -4,7 +4,8 @@ - + + diff --git a/DataFormats/OnlineMetaData/test/dump_run000001_event1350583585_fed1022.txt b/DataFormats/OnlineMetaData/test/dump_run000001_event1350583585_fed1022.txt new file mode 100644 index 0000000000000..979cec608a303 --- /dev/null +++ b/DataFormats/OnlineMetaData/test/dump_run000001_event1350583585_fed1022.txt @@ -0,0 +1,13 @@ +==================== DUMP ====================== +Reason for dump: Requested by user +00000000 : 0003fe00 50804521 00000003 00000000 | human readable swapped : 50804521 0003fe00 00000000 00000003 : 00000000 +00000010 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000010 +00000020 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000020 +00000030 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000030 +00000040 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000040 +00000050 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000050 +00000060 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000060 +00000070 : 00000000 00000000 00000000 00000000 | human readable swapped : 00000000 00000000 00000000 00000000 : 00000070 +00000080 : 6fae1ad6 0000017d 00000000 07fe7fff | human readable swapped : 0000017d 6fae1ad6 07fe7fff 00000000 : 00000080 +00000090 : 3d69f92e 00000000 eb290000 a0000014 | human readable swapped : 00000000 3d69f92e a0000014 eb290000 : 00000090 +================ END OF DUMP =================== diff --git a/DataFormats/OnlineMetaData/test/onlineMetaDataRecord_t.cpp b/DataFormats/OnlineMetaData/test/onlineMetaDataRecord_t.cpp index 25366ec43f9a5..9a4993e591574 100644 --- a/DataFormats/OnlineMetaData/test/onlineMetaDataRecord_t.cpp +++ b/DataFormats/OnlineMetaData/test/onlineMetaDataRecord_t.cpp @@ -17,6 +17,7 @@ class TestOnlineMetaDataRecord : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestOnlineMetaDataRecord); CPPUNIT_TEST(testDCSRecord_v1); CPPUNIT_TEST(testDCSRecord_v2); + CPPUNIT_TEST(testDCSRecord_v3); CPPUNIT_TEST(testOnlineLuminosityRecord_v1); CPPUNIT_TEST(testOnlineLuminosityRecord_v2); CPPUNIT_TEST(testCTPPSRecord_v2); @@ -28,6 +29,7 @@ class TestOnlineMetaDataRecord : public CppUnit::TestFixture { void testDCSRecord_v1(); void testDCSRecord_v2(); + void testDCSRecord_v3(); void testOnlineLuminosityRecord_v1(); void testOnlineLuminosityRecord_v2(); void testCTPPSRecord_v2(); @@ -109,6 +111,25 @@ void TestOnlineMetaDataRecord::testDCSRecord_v2() { CPPUNIT_ASSERT_EQUAL(castToFloat(0x3ccd2785), dcs.magnetCurrent()); } +void TestOnlineMetaDataRecord::testDCSRecord_v3() { + const unsigned char* payload = readPayload("dump_run000001_event1350583585_fed1022.txt"); + const online::Data_v3* data_v3 = reinterpret_cast(payload + FEDHeader::length); + DCSRecord dcs(data_v3->dcs); + + // DIP timestamp is in milliseconds + const uint64_t ts = dcs.timestamp().unixTime() * 1000UL + dcs.timestamp().microsecondOffset() / 1000; + CPPUNIT_ASSERT_EQUAL(static_cast(0x17d6fae1ad6), ts); + CPPUNIT_ASSERT(dcs.highVoltageValid(DCSRecord::Partition::CSCp)); + CPPUNIT_ASSERT(!dcs.highVoltageReady(DCSRecord::Partition::CSCp)); + CPPUNIT_ASSERT(dcs.highVoltageValid(DCSRecord::Partition::BPIX)); + CPPUNIT_ASSERT(!dcs.highVoltageReady(DCSRecord::Partition::BPIX)); + CPPUNIT_ASSERT(dcs.highVoltageValid(DCSRecord::Partition::TOB)); + CPPUNIT_ASSERT(!dcs.highVoltageReady(DCSRecord::Partition::TOB)); + CPPUNIT_ASSERT(!dcs.highVoltageValid(DCSRecord::Partition::ZDC)); + CPPUNIT_ASSERT(!dcs.highVoltageValid(DCSRecord::Partition::CASTOR)); + CPPUNIT_ASSERT_EQUAL(castToFloat(0x3D69F92E), dcs.magnetCurrent()); +} + void TestOnlineMetaDataRecord::testOnlineLuminosityRecord_v1() { const unsigned char* payload = readPayload("dump_run000001_event00057185_fed1022.txt"); const online::Data_v1* data_v1 = reinterpret_cast(payload + FEDHeader::length); diff --git a/EventFilter/OnlineMetaDataRawToDigi/plugins/OnlineMetaDataRawToDigi.cc b/EventFilter/OnlineMetaDataRawToDigi/plugins/OnlineMetaDataRawToDigi.cc index ee2a7639247b2..4b53d1bbc3a7f 100644 --- a/EventFilter/OnlineMetaDataRawToDigi/plugins/OnlineMetaDataRawToDigi.cc +++ b/EventFilter/OnlineMetaDataRawToDigi/plugins/OnlineMetaDataRawToDigi.cc @@ -101,6 +101,12 @@ void OnlineMetaDataRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& dcsRecord = DCSRecord(onlineMetaData->dcs); onlineLuminosityRecord = OnlineLuminosityRecord(onlineMetaData->luminosity); onlineBeamSpot = getBeamSpot(onlineMetaData->beamSpot); + } else if (version == 3 && onlineMetaDataRaw.size() >= FEDHeader::length + sizeof(online::Data_v3)) { + online::Data_v3 const* onlineMetaData = reinterpret_cast(payload); + ctppsRecord = CTPPSRecord(onlineMetaData->ctpps); + dcsRecord = DCSRecord(onlineMetaData->dcs); + onlineLuminosityRecord = OnlineLuminosityRecord(onlineMetaData->luminosity); + onlineBeamSpot = getBeamSpot(onlineMetaData->beamSpot); } } }