131 {
135
136 auto addRob = [&](
const eformat::helper::SourceIdentifier& sid,
const size_t ndata,
const uint32_t*
data){
137 vrobf.push_back(newRobFragment(eventContext, sid.code(), ndata,
data,
m_detEvType));
138 return vrobf.back();
139 };
140 auto convertDataToRob = [&](const eformat::helper::SourceIdentifier& sid, const auto& dataVec){
141 uint32_t*
data = newRodData(eventContext, dataVec.size());
143 for (
size_t i=0;
i<dataVec.size(); ++
i) {
144 ATH_MSG_VERBOSE(
" 0x" << MSG::hex << std::setw(8) << dataVec.at(i).roIWord() << MSG::dec);
145 data[
i] = dataVec.at(i).roIWord();
146 }
147 return addRob(sid, dataVec.size(),
data);
148 };
149
150
152 const eformat::helper::SourceIdentifier ctpSID{eformat::TDAQ_CTP,
m_ctpModuleID};
153 const std::vector<ROIB::CTPRoI>& ctpDataVec = roibResult->cTPResult().roIVec();
155
156
157 rob->rod_minor_version(roibResult->cTPResult().header().formatVersion() & 0xffffu);
158
159
160
165 constexpr size_t word_size = 32;
166 constexpr size_t words_per_set = 512 / word_size;
167 constexpr size_t num_words = 3 * words_per_set;
168 uint32_t* l1bits_data = newRodData(eventContext, num_words);
169 size_t iset{0};
170 for (
const std::bitset<512>& bset : {tbp,
tap, tav}) {
171 const std::string
sbits = bset.to_string();
172 const size_t iword_output_start = words_per_set * iset;
173 for (size_t iword_in_set = 0; iword_in_set < words_per_set; ++iword_in_set) {
174 const size_t bword_pos = 512 - (iword_in_set+1) * word_size;
175 std::bitset<word_size> bword{
sbits.substr(bword_pos, word_size)};
176 l1bits_data[iword_output_start + iword_in_set] =
static_cast<uint32_t>(bword.to_ulong());
177 }
178 ++iset;
179 }
180 rawEvent->lvl1_trigger_info(num_words, l1bits_data);
181
182
184 rawEvent->lvl1_trigger_type(
static_cast<uint8_t>(triggerType & 0xFF));
185 }
186
187
189 const eformat::helper::SourceIdentifier muctpiSID{eformat::TDAQ_MUON_CTP_INTERFACE,
m_muCTPIModuleID};
190 const std::vector<ROIB::MuCTPIRoI>& muctpiDataVec = roibResult->muCTPIResult().roIVec();
191 convertDataToRob(muctpiSID, muctpiDataVec);
192 }
193
194
196 const std::vector<ROIB::JetEnergyResult>& jetEnergyResultVec = roibResult->jetEnergyResult();
197 for (size_t slink=0; slink<jetEnergyResultVec.size(); ++slink) {
198 const eformat::helper::SourceIdentifier jetSID{eformat::TDAQ_CALO_JET_PROC_ROI,
m_jetModuleID.value().at(slink)};
199 convertDataToRob(jetSID, jetEnergyResultVec.at(slink).roIVec());
200 }
201 }
202
203
205 const std::vector<ROIB::EMTauResult>& emTauResultVec = roibResult->eMTauResult();
206 for (size_t slink=0; slink<emTauResultVec.size(); ++slink) {
207 const eformat::helper::SourceIdentifier emSID{eformat::TDAQ_CALO_CLUSTER_PROC_ROI,
m_emModuleID.value().at(slink)};
208 convertDataToRob(emSID, emTauResultVec.at(slink).roIVec());
209 }
210 }
211
212
214 const std::vector<ROIB::L1TopoResult>& l1TopoResultVec = roibResult->l1TopoResult();
215 for (size_t slink=0; slink<l1TopoResultVec.size(); ++slink) {
216 eformat::helper::SourceIdentifier topoSID{l1TopoResultVec.at(slink).rdo().getSourceID()};
219 topoSID = eformat::helper::SourceIdentifier(eformat::TDAQ_CALO_TOPO_PROC,
m_l1TopoModuleID.value().at(slink));
220 ATH_MSG_DEBUG(
"Source ID in L1TopoRDO was zero so using Property for slink " << slink <<
": "
222 }
223 else if (topoSID.code() == 0) {
224 topoSID = eformat::helper::SourceIdentifier( eformat::TDAQ_CALO_TOPO_PROC, 0 );
225 ATH_MSG_WARNING(
"Source ID in L1TopoRDO was zero, no properties available for slink counter " << slink
226 << ", so as a fall back, constructed module 0 with source ID "
228 }
229 const std::vector<uint32_t>& dataVec = l1TopoResultVec.at(slink).rdo().getDataWords();
230 uint32_t*
data = newRodData(eventContext, dataVec.size());
231 for (
size_t i=0;
i<dataVec.size(); ++
i) {
232 ATH_MSG_VERBOSE(
" " << MSG::hex << std::setw(8) << std::showbase << dataVec.at(i) << std::noshowbase << MSG::dec);
233 data[
i] = dataVec.at(i);
234 }
235 addRob(topoSID, dataVec.size(),
data);
236 }
237 }
238
239 return StatusCode::SUCCESS;
240}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
char data[hepevt_bytes_allocation_ATLAS]
OFFLINE_FRAGMENTS_NAMESPACE_WRITE::FullEventFragment RawEventWrite
data type for writing raw event
#define sbits(u, n)
Intrinsic functions which do not work correctly due to differences in byte ordering.
std::string formatHex8(uint32_t word)
Helper function to format a 32-bit integer as an 8-digit hex number for printing.
eformat::write::ROBFragment ROBFragment
std::bitset< 512 > convertToBitset(const std::vector< uint32_t > &words)
convert vector of unsigned int into bitset