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);
63 const ROBF* rob = *it;
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();
73 uint32_t L1ID = rob->rod_lvl1_id();
74 uint32_t sourceID = rob->rod_source_id();
88 catch (std::exception
const & ex) {
96 catch (std::exception
const & ex) {
103 rob->rod_status(status);
104 uint32_t nstatus = rob->rod_nstatus();
105 if (msgLvl(MSG::VERBOSE)) {
107 for (uint32_t i=0; i<nstatus; ++i, ++status) {
108 ATH_MSG_VERBOSE(
" Status word: 0x" << MSG::hex << std::setw(8) << std::setfill(
'0') << *status);
111 rob->rod_status(status);
113 if(nstatus > 0) dataStatus.
status_word =
static_cast<uint32_t
>(*status);
116 dataStatus.
status_info =
static_cast<uint32_t
>(*status);
125 std::vector<uint32_t> vDataWords;
126 vDataWords.reserve(ndata);
127 if (msgLvl(MSG::VERBOSE)) {
130 ATH_MSG_VERBOSE(
" 0x" << MSG::hex << std::setfill(
'0') << std::setw(8) << word << MSG::dec);
135 uint32_t nExtraWords=0;
136 nExtraWords=CTPfragment::numberExtraPayloadWords(rob);
137 unsigned int ctpVersionNumber = CTPfragment::ctpFormatVersion(rob);
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);
152 result->setL1AcceptBunchPosition(CTPfragment::lvl1AcceptBunch(rob));
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);
192 uint32_t*
data = newRodData(eventContext, rodSize);
193 std::vector<uint32_t> vDataWords(rodSize, 0);
198 if (ctpDataFormat.getNumberTimeWords() >= 2) {
199 vDataWords[idx++] =
result->timeNanoSec();
200 vDataWords[idx++] =
result->timeSec();
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;
215 vDataWords[idx++] = words[i];
217 return StatusCode::SUCCESS;
227 for (
size_t i = 0; i <
result->additionalWords().size(); ++i) {
228 if (idx >= vDataWords.size()) {
229 ATH_MSG_ERROR(
"Additional word write out-of-bounds at idx = " << idx);
230 return StatusCode::FAILURE;
232 vDataWords[idx++] =
result->additionalWords()[i];
239 for (
size_t i = 0; i < rodSize; ++i) {
240 data[i] = vDataWords[i];
246 rob->rod_minor_version(
result->headerFormatVersion() & 0xffffu);
250 return StatusCode::SUCCESS;
void initialize(xAOD::CTPResult &ctpRes, const uint32_t ctpVersionNumber, std::vector< uint32_t > &data, const uint32_t nExtraWords)
Initialize the object using xAOD::Header, xAOD::Trailer, and the payload data.