Skip to content

Commit

Permalink
add DCS v2 record containing validity bits for DCS voltage/status inf…
Browse files Browse the repository at this point in the history
…ormation with the unit test
  • Loading branch information
smorovic committed Nov 30, 2021
1 parent 6da4f66 commit d8bcbd0
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 2 deletions.
5 changes: 5 additions & 0 deletions DataFormats/OnlineMetaData/interface/DCSRecord.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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_; }

Expand All @@ -79,6 +83,7 @@ class DCSRecord {
private:
edm::Timestamp timestamp_;
std::bitset<Partition::Last> highVoltageReady_;
std::bitset<Partition::Last> highVoltageValid_;
float magnetCurrent_;
static const ParitionNames partitionNames_;
};
Expand Down
15 changes: 15 additions & 0 deletions DataFormats/OnlineMetaData/interface/OnlineMetaDataRaw.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
14 changes: 13 additions & 1 deletion DataFormats/OnlineMetaData/src/DCSRecord.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion DataFormats/OnlineMetaData/src/classes_def.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
<field name="romanPotNames_" transient="true"/>
<field name="statusNames_" transient="true"/>
</class>
<class name="DCSRecord" ClassVersion="4">
<class name="DCSRecord" ClassVersion="5">
<version ClassVersion="5" checksum="442670371"/>
<version ClassVersion="4" checksum="920984468"/>
<version ClassVersion="3" checksum="2537350258"/>
<field name="partitionNames_" transient="true"/>
Expand Down
21 changes: 21 additions & 0 deletions DataFormats/OnlineMetaData/test/onlineMetaDataRecord_t.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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();
Expand Down Expand Up @@ -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<online::Data_v3 const*>(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<uint64_t>(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<online::Data_v1 const*>(payload + FEDHeader::length);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<online::Data_v3 const*>(payload);
ctppsRecord = CTPPSRecord(onlineMetaData->ctpps);
dcsRecord = DCSRecord(onlineMetaData->dcs);
onlineLuminosityRecord = OnlineLuminosityRecord(onlineMetaData->luminosity);
onlineBeamSpot = getBeamSpot(onlineMetaData->beamSpot);
}
}
}
Expand Down

0 comments on commit d8bcbd0

Please sign in to comment.