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();
75 uint32_t bcid = rob->rod_bc_id();
76 uint32_t trigType = rob->rod_lvl1_trigger_type();
77 uint32_t runNum = rob->rod_run_no();
78 uint32_t evtType = rob->rod_detev_type();
92 catch (std::exception
const & ex) {
100 catch (std::exception
const & ex) {
107 rob->rod_status(status);
108 uint32_t nstatus = rob->rod_nstatus();
109 if (msgLvl(MSG::VERBOSE)) {
111 for (uint32_t i=0; i<nstatus; ++i, ++status) {
112 ATH_MSG_VERBOSE(
" Status word: 0x" << MSG::hex << std::setw(8) << std::setfill(
'0') << *status);
115 rob->rod_status(status);
117 if(nstatus > 0) dataStatus.
status_word =
static_cast<uint32_t
>(*status);
120 dataStatus.
status_info =
static_cast<uint32_t
>(*status);
129 std::vector<uint32_t> vDataWords;
130 vDataWords.reserve(ndata);
131 if (msgLvl(MSG::VERBOSE)) {
134 ATH_MSG_VERBOSE(
" 0x" << MSG::hex << std::setfill(
'0') << std::setw(8) << word << MSG::dec);
139 uint32_t nExtraWords=0;
140 nExtraWords=CTPfragment::numberExtraPayloadWords(rob);
141 unsigned int ctpVersionNumber = CTPfragment::ctpFormatVersion(rob);
146 auto result = std::make_unique<xAOD::CTPResult>();
147 auto resultAux = std::make_unique<xAOD::CTPResultAuxInfo>();
148 result->setStore(resultAux.get());
154 result->setHeader(headerMarker, formatVersion, sourceID, L1ID, runNum, bcid, trigType, evtType);
155 result->setTrailer(ndata, errStatus, statInfo);
156 result->setL1AcceptBunchPosition(CTPfragment::lvl1AcceptBunch(rob));
157 result->setTurnCounter(CTPfragment::turnCounter(rob));
162 ATH_CHECK( ctpResultWriteHandle.
record( std::move(result), std::move(resultAux) ));
165 return StatusCode::SUCCESS;
179 unsigned int ctpVersionNumber = result->ctpVersionNumber();
180 CTPdataformatVersion ctpDataFormat(ctpVersionNumber);
183 size_t totalPerBunchWords = 0;
184 for (uint32_t bunch = 0; bunch < result->numberOfBunches(); ++bunch) {
185 totalPerBunchWords += result->getTIPWords(bunch).size();
186 totalPerBunchWords += result->getTBPWords(bunch).size();
187 totalPerBunchWords += result->getTAPWords(bunch).size();
188 totalPerBunchWords += result->getTAVWords(bunch).size();
191 size_t rodSize = ctpDataFormat.getNumberTimeWords()
193 + result->additionalWords().size();
196 clearCache(eventContext);
197 uint32_t*
data = newRodData(eventContext, rodSize);
198 std::vector<uint32_t> vDataWords(rodSize, 0);
203 if (ctpDataFormat.getNumberTimeWords() >= 2) {
204 vDataWords[idx++] = result->timeNanoSec();
205 vDataWords[idx++] = result->timeSec();
207 ATH_MSG_WARNING(
"Unexpected number of time words: " << ctpDataFormat.getNumberTimeWords());
211 for (uint32_t bunch = 0; bunch < result->numberOfBunches(); ++bunch) {
214 auto copyWords = [&](
const std::vector<uint32_t>& words,
const char* tag) -> StatusCode {
215 for (
size_t i = 0; i < words.size(); ++i) {
216 if (idx >= vDataWords.size()) {
217 ATH_MSG_ERROR(tag <<
" write out-of-bounds: idx = " << idx <<
" >= ROD size = " << vDataWords.size());
218 return StatusCode::FAILURE;
220 vDataWords[idx++] = words[i];
222 return StatusCode::SUCCESS;
225 ATH_CHECK(copyWords(result->getTIPWords(bunch),
"TIP"));
226 ATH_CHECK(copyWords(result->getTBPWords(bunch),
"TBP"));
227 ATH_CHECK(copyWords(result->getTAPWords(bunch),
"TAP"));
228 ATH_CHECK(copyWords(result->getTAVWords(bunch),
"TAV"));
232 for (
size_t i = 0; i < result->additionalWords().
size(); ++i) {
233 if (idx >= vDataWords.size()) {
234 ATH_MSG_ERROR(
"Additional word write out-of-bounds at idx = " << idx);
235 return StatusCode::FAILURE;
237 vDataWords[idx++] = result->additionalWords()[i];
244 for (
size_t i = 0; i < rodSize; ++i) {
245 data[i] = vDataWords[i];
249 vrobf.push_back(newRobFragment(eventContext, result->sourceID(), rodSize,
data,
m_detEvType));
251 rob->rod_minor_version(result->headerFormatVersion() & 0xffffu);
252 rob->rod_bc_id(result->BCID());
253 rob->rod_lvl1_type(result->triggerType());
254 rob->rod_run_no(result->runNumber());
255 rob->rod_lvl1_id(result->L1ID());
259 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.