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);
125 uint32_t statPos = rob->rod_status_position();
130 std::vector<uint32_t> vDataWords;
131 vDataWords.reserve(ndata);
132 if (msgLvl(MSG::VERBOSE)) {
135 ATH_MSG_VERBOSE(
" 0x" << MSG::hex << std::setfill(
'0') << std::setw(8) << word << MSG::dec);
140 uint32_t nExtraWords=0;
141 nExtraWords=CTPfragment::numberExtraPayloadWords(rob);
142 unsigned int ctpVersionNumber = CTPfragment::ctpFormatVersion(rob);
147 auto result = std::make_unique<xAOD::CTPResult>();
148 auto resultAux = std::make_unique<xAOD::CTPResultAuxInfo>();
149 result->setStore(resultAux.get());
155 result->setHeader(headerMarker, formatVersion, sourceID, L1ID, runNum, bcid, trigType, evtType);
156 result->setTrailer(ndata, errStatus, statInfo, nstatus, statPos);
157 result->setL1AcceptBunchPosition(CTPfragment::lvl1AcceptBunch(rob));
158 result->setTurnCounter(CTPfragment::turnCounter(rob));
161 std::vector<std::string> ctpResultIssues = result->checkForIssues();
162 if (!ctpResultIssues.empty()) {
163 ATH_MSG_WARNING(
"Found " << ctpResultIssues.size() <<
" CTPResult issues");
164 for (
const auto& issue : ctpResultIssues) {
172 ATH_CHECK( ctpResultWriteHandle.
record( std::move(result), std::move(resultAux) ));
175 return StatusCode::SUCCESS;
184 const EventContext& eventContext) {
191 unsigned int ctpVersionNumber = result->ctpVersionNumber();
192 CTPdataformatVersion ctpDataFormat(ctpVersionNumber);
195 size_t totalPerBunchWords = 0;
196 for (uint32_t bunch = 0; bunch < result->numberOfBunches(); ++bunch) {
197 totalPerBunchWords += result->getTIPWords(bunch).size();
198 totalPerBunchWords += result->getTBPWords(bunch).size();
199 totalPerBunchWords += result->getTAPWords(bunch).size();
200 totalPerBunchWords += result->getTAVWords(bunch).size();
203 size_t rodSize = ctpDataFormat.getNumberTimeWords()
205 + result->additionalWords().size();
208 clearCache(eventContext);
209 uint32_t*
data = newRodData(eventContext, rodSize);
210 std::vector<uint32_t> vDataWords(rodSize, 0);
215 if (ctpDataFormat.getNumberTimeWords() >= 2) {
216 vDataWords[idx++] = result->timeNanoSec();
217 vDataWords[idx++] = result->timeSec();
219 ATH_MSG_WARNING(
"Unexpected number of time words: " << ctpDataFormat.getNumberTimeWords());
223 for (uint32_t bunch = 0; bunch < result->numberOfBunches(); ++bunch) {
226 auto copyWords = [&](
const std::vector<uint32_t>& words,
const char* tag) -> StatusCode {
227 for (
size_t i = 0; i < words.size(); ++i) {
228 if (idx >= vDataWords.size()) {
229 ATH_MSG_ERROR(tag <<
" write out-of-bounds: idx = " << idx <<
" >= ROD size = " << vDataWords.size());
230 return StatusCode::FAILURE;
232 vDataWords[idx++] = words[i];
234 return StatusCode::SUCCESS;
237 ATH_CHECK(copyWords(result->getTIPWords(bunch),
"TIP"));
238 ATH_CHECK(copyWords(result->getTBPWords(bunch),
"TBP"));
239 ATH_CHECK(copyWords(result->getTAPWords(bunch),
"TAP"));
240 ATH_CHECK(copyWords(result->getTAVWords(bunch),
"TAV"));
244 for (
size_t i = 0; i < result->additionalWords().
size(); ++i) {
245 if (idx >= vDataWords.size()) {
246 ATH_MSG_ERROR(
"Additional word write out-of-bounds at idx = " << idx);
247 return StatusCode::FAILURE;
249 vDataWords[idx++] = result->additionalWords()[i];
256 for (
size_t i = 0; i < rodSize; ++i) {
257 data[i] = vDataWords[i];
261 vrobf.push_back(newRobFragment(eventContext, result->sourceID(), rodSize,
data,
m_detEvType));
263 rob->rod_minor_version(result->headerFormatVersion() & 0xffffu);
264 rob->rod_bc_id(result->BCID());
265 rob->rod_lvl1_type(result->triggerType());
266 rob->rod_run_no(result->runNumber());
267 rob->rod_lvl1_id(result->L1ID());
271 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.