- // Boost
- #include "boost/format.hpp"
-
- // Local
- #include "TbHeaderDecoder.h"
-
- DECLARE_TOOL_FACTORY(TbHeaderDecoder)
-
- //=============================================================================
- // Standard constructor, initializes variables
- //=============================================================================
- TbHeaderDecoder::TbHeaderDecoder(const std::string& type,
- const std::string& name,
- const IInterface* parent)
- : GaudiTool(type, name, parent),
- m_print(true), m_geomSvc(nullptr), m_pixelSvc(nullptr) {
-
- declareInterface<TbHeaderDecoder>(this);
- }
-
- //=============================================================================
- // Destructor
- //=============================================================================
- TbHeaderDecoder::~TbHeaderDecoder() {}
-
- //=============================================================================
- // Initialisation
- //=============================================================================
- StatusCode TbHeaderDecoder::initialize() {
-
- StatusCode sc = GaudiTool::initialize();
- if (sc.isFailure()) return sc;
-
- return StatusCode::SUCCESS;
- }
-
- //=============================================================================
- // Read the first fields of the Spidr header from a given file.
- //=============================================================================
- bool TbHeaderDecoder::readCommon(const char* data, unsigned int& size,
- unsigned int& fmt) {
-
- struct CommonHeader {
- uint32_t headerId;
- uint32_t headerSizeTotal;
- uint32_t headerSize;
- uint32_t format;
- };
- CommonHeader* hdr = (CommonHeader*)data;
- size = hdr->headerSizeTotal;
- if (size > 66304) size = 66304;
- fmt = hdr->format;
- return true;
- }
-
- //=============================================================================
- // Read the Spidr header from a given file.
- //=============================================================================
- bool TbHeaderDecoder::read(const char* data, const unsigned int& fmt,
- std::string& deviceId) {
-
- if (fmt == 0x30 || fmt == 0x1) {
- return readV1(data, deviceId);
- }
- error() << format("Unknown format (0x%x)", fmt) << endmsg;
- return false;
- }
-
-
- //=============================================================================
- // Read version 1 of the Spidr header.
- //=============================================================================
- bool TbHeaderDecoder::readV1(const char* data, std::string& deviceId) {
-
- struct Tpx3Header {
- uint32_t headerId;
- uint32_t headerSizeTotal;
- uint32_t headerSize;
- uint32_t format;
- uint32_t deviceId;
- uint32_t genConfig;
- uint32_t outblockConfig;
- uint32_t pllConfig;
- uint32_t testPulseConfig;
- uint32_t slvsConfig;
- uint32_t pwrPulseConfig;
- uint32_t dac[32];
- uint8_t ctpr[256 / 8];
- uint32_t unused[64 - 11 - 32 - (256 / 8) / 4];
- };
-
- struct SpidrTpx3Header {
- uint32_t headerId;
- uint32_t headerSizeTotal;
- uint32_t headerSize;
- uint32_t format;
- uint32_t spidrId;
- uint32_t libVersion;
- uint32_t softwVersion;
- uint32_t firmwVersion;
- uint32_t ipAddress;
- uint32_t ipPort;
- uint32_t yyyyMmDd;
- uint32_t hhMmSsMs;
- uint32_t runNr;
- uint32_t seqNr;
- uint32_t spidrConfig; // Trigger mode, decoder on/off
- uint32_t spidrFilter;
- uint32_t spidrBiasVoltage;
- // Spare
- uint32_t unused[128 - 17 - 128 / 4];
- // Description string
- char descr[128];
- // Device header
- Tpx3Header devHeader;
- };
-
- SpidrTpx3Header* hdr = (SpidrTpx3Header*)data;
- Tpx3Header devHdr = hdr->devHeader;
- // Get the chip id.
- const int devid0 = (hdr->devHeader.deviceId >> 8) & 0xFFF;
- const int devid1 = (hdr->devHeader.deviceId >> 4) & 0xF;
- const int devid2 = (hdr->devHeader.deviceId >> 0) & 0xF;
- const char devidchar = (char)(devid2 + 64);
- deviceId = str(boost::format("W%04d_%d%02d") % devid0 % devidchar % devid1);
-
- // Transfer the header information to the pixel configuration service.
- const unsigned int deviceIndex = geomSvc()->deviceIndex(deviceId);
- if (deviceIndex == 999) {
- error() << deviceId << " is not listed in the alignment file." << endmsg;
- return false;
- }
- pixelSvc()->setPhase(deviceIndex, devHdr.pllConfig);
- if (devHdr.headerSizeTotal - devHdr.headerSize == 65536) {
- const char* trimDac = data + (hdr->headerSize + devHdr.headerSize);
- pixelSvc()->setTrim(deviceIndex, trimDac);
- }
- if (!m_print) return true;
-
- boost::format fmts(" %|-30.30s|%|32t| %s ");
- boost::format fmtx(" %|-30.30s|%|32t| 0x%x ");
- boost::format fmt8x(" %|-30.30s|%|32t| 0x%08x ");
- boost::format fmtd(" %|-30.30s|%|32t| %d ");
- info() << std::string(70, '-') << endmsg;
- info() << " File header " << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmtx % "ID" % hdr->headerId << endmsg;
- info() << fmtd % "Total size" % hdr->headerSizeTotal << endmsg;
- info() << fmtd % "Size" % hdr->headerSize << endmsg;
- info() << fmt8x % "Format" % hdr->format << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmtx % "SPIDR ID" % hdr->spidrId << endmsg;
- info() << fmtx % "Library version" % hdr->libVersion << endmsg;
- info() << fmtx % "Software version" % hdr->softwVersion << endmsg;
- info() << fmtx % "Firmware version" % hdr->firmwVersion << endmsg;
- info() << std::string(70, '-') << endmsg;
- const int ip0 = (hdr->ipAddress >> 24) & 0xFF;
- const int ip1 = (hdr->ipAddress >> 16) & 0xFF;
- const int ip2 = (hdr->ipAddress >> 8) & 0xFF;
- const int ip3 = (hdr->ipAddress >> 0) & 0xFF;
- const std::string ip = std::to_string(ip0) + "." + std::to_string(ip1) + "." +
- std::to_string(ip2) + "." + std::to_string(ip3);
- info() << fmts % "IP address" % ip << endmsg;
- info() << fmtd % "IP port" % hdr->ipPort << endmsg;
- info() << std::string(70, '-') << endmsg;
- const int date0 = (hdr->yyyyMmDd >> 16) & 0xFFFF;
- const int date1 = (hdr->yyyyMmDd >> 8) & 0xFF;
- const int date2 = (hdr->yyyyMmDd >> 0) & 0xFF;
- const int time0 = (hdr->hhMmSsMs >> 24) & 0xFF;
- const int time1 = (hdr->hhMmSsMs >> 16) & 0xFF;
- const int time2 = (hdr->hhMmSsMs >> 8) & 0xFF;
- const int time3 = (hdr->hhMmSsMs >> 0) & 0xFF;
- info() << boost::format(" %|-30.30s|%|32t| %04x-%02x-%02x") % "Date" % date0 %
- date1 % date2 << endmsg;
- info() << boost::format(" %|-30.30s|%|32t| %02x:%02x:%02x.%02x") % "Time" %
- time0 % time1 % time2 % time3 << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmtd % "Run number" % hdr->runNr << endmsg;
- info() << fmtd % "Sequence number" % hdr->seqNr << endmsg;
- info() << fmts % "Run info" % hdr->descr << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmt8x % "Spidr configuration" % hdr->spidrConfig << endmsg;
- info() << fmt8x % "Data filter" % hdr->spidrFilter << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << " Device header" << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmtx % "Type ID" % devHdr.headerId << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmtx % "Device ID" % devHdr.deviceId << endmsg;
- info() << fmts % "" % deviceId << endmsg;
- info() << std::string(70, '-') << endmsg;
- info() << fmt8x % "General config" % devHdr.genConfig << endmsg;
- info() << fmt8x % "Output block config" % devHdr.outblockConfig << endmsg;
- info() << fmt8x % "PLL config" % devHdr.pllConfig << endmsg;
- info() << fmt8x % "Testpulse config" % devHdr.testPulseConfig << endmsg;
- info() << fmt8x % "SLVS config" % devHdr.slvsConfig << endmsg;
- info() << fmt8x % "Power pulsing config" % devHdr.pwrPulseConfig << endmsg;
- info() << std::string(70, '-') << endmsg;
- boost::format fmt(" %|-30.30s|%|32t| %03d %03d %03d %03d");
- std::string title = "DAC values";
- for (unsigned int i = 0; i < 5; ++i) {
- const unsigned int offset = 4 * i;
- info() << fmt % title % devHdr.dac[offset] % devHdr.dac[offset + 1] %
- devHdr.dac[offset + 2] % devHdr.dac[offset + 3] << endmsg;
- title = "";
- }
- info() << std::string(70, '-') << endmsg;
- return true;
- }