9 #include "eformat/SourceIdentifier.h"
10 #include "CTPfragment/CTPfragment.h"
11 #include "CTPfragment/CTPdataformat.h"
12 #include "CTPfragment/CTPdataformatVersion.h"
34 ATH_MSG_DEBUG((
mode==ConversionMode::Encoding ?
"Encoding" :
"Decoding") <<
" ROB IDs: "
35 << MSG::hex <<
m_robIds.value() << MSG::dec);
37 ATH_MSG_ERROR(
"This tool implementation assumes there is exactly one CTP ROB, but "
38 <<
m_robIds.size() <<
" were configured");
39 return StatusCode::SUCCESS;
41 return StatusCode::SUCCESS;
52 const eformat::helper::SourceIdentifier sid(
m_robIds.value().at(0));
53 auto it = std::find_if(vrobf.begin(), vrobf.end(), [&sid](
const ROBF* rob){return rob->rob_source_id() == sid.code();});
54 if (
it == vrobf.end()) {
55 ATH_MSG_ERROR(
"No CTP ROB fragment with ID 0x" << std::hex << sid.code() << std::dec <<
" was found!");
56 return StatusCode::FAILURE;
58 ATH_MSG_VERBOSE(
"Found CTP ROD with source ID 0x" << MSG::hex << sid.code() << MSG::dec);
65 rob->rod_data( it_data );
66 const uint32_t ndata = rob->rod_ndata();
71 uint32_t headerMarker = eformat::ROD;
72 uint32_t formatVersion = rob->rod_version();
74 uint32_t sourceID = rob->rod_source_id();
104 uint32_t nstatus = rob->rod_nstatus();
125 std::vector<uint32_t> vDataWords;
126 vDataWords.reserve(ndata);
130 ATH_MSG_VERBOSE(
" 0x" << MSG::hex << std::setfill(
'0') << std::setw(8) << word << MSG::dec);
142 auto result = std::make_unique<xAOD::CTPResult>();
143 auto resultAux = std::make_unique<xAOD::CTPResultAuxInfo>();
144 result->setStore(resultAux.get());
150 result->setHeader(headerMarker, formatVersion, sourceID, L1ID);
151 result->setTrailer(ndata, errStatus, statInfo);
153 result->setTurnCounter(CTPfragment::turnCounter(rob));
160 return StatusCode::SUCCESS;
174 unsigned int ctpVersionNumber =
result->ctpVersionNumber();
175 CTPdataformatVersion ctpDataFormat(ctpVersionNumber);
178 size_t totalPerBunchWords = 0;
179 for (
uint32_t bunch = 0; bunch <
result->numberOfBunches(); ++bunch) {
180 totalPerBunchWords +=
result->getTIPWords(bunch).size();
181 totalPerBunchWords +=
result->getTBPWords(bunch).size();
182 totalPerBunchWords +=
result->getTAPWords(bunch).size();
183 totalPerBunchWords +=
result->getTAVWords(bunch).size();
186 size_t rodSize = ctpDataFormat.getNumberTimeWords()
188 +
result->additionalWords().size();
191 clearCache(eventContext);
193 std::vector<uint32_t> vDataWords(rodSize, 0);
198 if (ctpDataFormat.getNumberTimeWords() >= 2) {
199 vDataWords[
idx++] =
result->timeNanoSec();
202 ATH_MSG_WARNING(
"Unexpected number of time words: " << ctpDataFormat.getNumberTimeWords());
206 for (
uint32_t bunch = 0; bunch <
result->numberOfBunches(); ++bunch) {
209 auto copyWords = [&](
const std::vector<uint32_t>&
words,
const char*
tag) ->
StatusCode {
210 for (
size_t i = 0;
i <
words.size(); ++
i) {
211 if (
idx >= vDataWords.size()) {
212 ATH_MSG_ERROR(
tag <<
" write out-of-bounds: idx = " <<
idx <<
" >= ROD size = " << vDataWords.size());
213 return StatusCode::FAILURE;
217 return StatusCode::SUCCESS;
227 for (
size_t i = 0;
i <
result->additionalWords().
size(); ++
i) {
228 if (
idx >= vDataWords.size()) {
230 return StatusCode::FAILURE;
232 vDataWords[
idx++] =
result->additionalWords()[
i];
239 for (
size_t i = 0;
i < rodSize; ++
i) {
246 rob->rod_minor_version(
result->headerFormatVersion() & 0xffffu);
250 return StatusCode::SUCCESS;