106 {
108
109 const EventContext& ctx = Gaudi::Hive::currentContext();
110
111
114 if (!castSuccessful || !l1TriggerResult) {
115 ATH_MSG_ERROR(
"Failed to convert DataObject to xAOD::TrigCompositeContainer for L1TriggerResult");
116 return StatusCode::FAILURE;
117 }
118
119
122 ATH_MSG_ERROR(
"Failed to obtain a pointer to RawEventWrite");
123 return StatusCode::FAILURE;
124 }
126
127
128
129
131
132
136
137
138 auto wordsToBitset = [](
const std::vector<uint32_t>&
words) {
139 std::bitset<512>
out;
140 for (
size_t i = 0;
i <
words.size(); ++
i) {
142 for (
size_t b = 0;
b < 32; ++
b) {
143 if (w & (1u << b)) {
145 }
146 }
147 }
149 };
150
151 std::bitset<512> tbp = wordsToBitset(
result->getTBPWords());
152 std::bitset<512>
tap = wordsToBitset(
result->getTAPWords());
153 std::bitset<512> tav = wordsToBitset(
result->getTAVWords());
154
155
156 constexpr size_t wordSize = 32;
157 constexpr size_t wordsPerSet = 512 / wordSize;
158 constexpr size_t numWords = 3 * wordsPerSet;
159
160
161 std::vector<uint32_t> l1BitsData(numWords, 0);
162
163
164 size_t iset{0};
165 for (
const std::bitset<512>& bset : {tbp,
tap, tav}) {
166 const std::string
sbits = bset.to_string();
167 const size_t iWordOutputStart = wordsPerSet * iset;
168 for (size_t iWordInSet = 0; iWordInSet < wordsPerSet; ++iWordInSet) {
169 const size_t bwordPos = 512 - (iWordInSet + 1) * wordSize;
170 std::bitset<wordSize> bword{
sbits.substr(bwordPos, wordSize)};
171 l1BitsData[iWordOutputStart + iWordInSet] =
static_cast<uint32_t>(bword.to_ulong());
172 }
173 ++iset;
174 }
176
177
178 re->lvl1_trigger_info(l1BitsData.size(), l1BitsData.data());
179 re->lvl1_trigger_type(
static_cast<uint8_t>(triggerType & 0xFF));
180
181
182 std::vector<WROBF*> ctpResultROBs;
185 for (
WROBF* rob : ctpResultROBs) {
187
188 rob->rod_lvl1_type(
re->lvl1_trigger_type());
189
190 rob->rod_lvl1_id(
re->lvl1_id());
191
193 ATH_MSG_DEBUG(
"Added ROB fragment 0x" << MSG::hex << rob->source_id() << MSG::dec <<
" to the output raw event");
194 }
195 }
196
197
198
200 if (not
tool.isEnabled()) {
continue;}
201 std::vector<WROBF*> muon_robs;
202 ATH_CHECK(
tool->convertToBS(muon_robs, l1TriggerResult, ctx));
203 ATH_MSG_DEBUG(
tool.name() <<
" created " << muon_robs.size() <<
" L1Muon ROB Fragments");
204 for (
WROBF* rob : muon_robs) {
206
207 rob->rod_lvl1_type(
re->lvl1_trigger_type());
208
209 rob->rod_lvl1_id(
re->lvl1_id());
210
212 ATH_MSG_DEBUG(
"Added ROB fragment 0x" << MSG::hex << rob->source_id() << MSG::dec <<
" to the output raw event");
213 }
214 }
215
216
217
218
219 if ( pAddr != nullptr ) pAddr->release();
220 ByteStreamAddress* bsAddr =
new ByteStreamAddress(
classID(), pObj->registry()->name(),
"");
221 pAddr = static_cast<IOpaqueAddress*>(bsAddr);
222 pAddr->addRef();
223
225 return StatusCode::SUCCESS;
226}
const boost::regex re(r_e)
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
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.
void printRob(const OFFLINE_FRAGMENTS_NAMESPACE_WRITE::ROBFragment &rob) const
Helper method for debug printouts.
ToolHandle< IL1TriggerByteStreamTool > m_ctpResultEncoderTool
Encoder tool for CTP result.
ToolHandle< IL1TriggerByteStreamTool > m_efexEncoderTool
eFEX tool
SG::ReadHandleKey< xAOD::CTPResult > m_inKeyCTPResult
ToolHandle< IL1TriggerByteStreamTool > m_muonEncoderTool
Encoder tools for L1Muon RoIs (one writing RoIB ROB, one writing DAQ ROB).
ToolHandle< IL1TriggerByteStreamTool > m_jfexEncoderTool
jFEX tool
ServiceHandle< IByteStreamEventAccess > m_ByteStreamEventAccess
Helper to obtain the RawEvent pointer.
ToolHandle< IL1TriggerByteStreamTool > m_muonEncoderToolDaq
bool fromStorable(DataObject *pDObj, T *&pTrans, bool quiet=false, IRegisterTransient *irt=0, bool isConst=true)
TrigCompositeContainer_v1 TrigCompositeContainer
Declare the latest version of the container.
CTPResult_v1 CTPResult
Define the latest version of the CTPResult class.