109 {
111
112 const EventContext& ctx = Gaudi::Hive::currentContext();
113
114
117 if (!castSuccessful || !l1TriggerResult) {
118 ATH_MSG_ERROR(
"Failed to convert DataObject to xAOD::TrigCompositeContainer for L1TriggerResult");
119 return StatusCode::FAILURE;
120 }
121
122
125 ATH_MSG_ERROR(
"Failed to obtain a pointer to RawEventWrite");
126 return StatusCode::FAILURE;
127 }
129
130
131
132
134
135
137 std::string ctpKey;
138 l1tr->
getDetail<std::string>(
"CTPResultKey", ctpKey);
139
140
141 SG::ReadHandle<xAOD::CTPResult>
result(ctpKey, ctx);
143
144
145 auto wordsToBitset = [](
const std::vector<uint32_t>&
words) {
146 std::bitset<512>
out;
147 for (
size_t i = 0;
i <
words.size(); ++
i) {
149 for (
size_t b = 0;
b < 32; ++
b) {
150 if (w & (1u << b)) {
152 }
153 }
154 }
156 };
157
158 std::bitset<512> tbp = wordsToBitset(
result->getTBPWords());
159 std::bitset<512>
tap = wordsToBitset(
result->getTAPWords());
160 std::bitset<512> tav = wordsToBitset(
result->getTAVWords());
161
162
163 constexpr size_t wordSize = 32;
164 constexpr size_t wordsPerSet = 512 / wordSize;
165 constexpr size_t numWords = 3 * wordsPerSet;
166
167
168 std::vector<uint32_t> l1BitsData(numWords, 0);
169
170
171 size_t iset{0};
172 for (
const std::bitset<512>& bset : {tbp,
tap, tav}) {
173 const std::string
sbits = bset.to_string();
174 const size_t iWordOutputStart = wordsPerSet * iset;
175 for (size_t iWordInSet = 0; iWordInSet < wordsPerSet; ++iWordInSet) {
176 const size_t bwordPos = 512 - (iWordInSet + 1) * wordSize;
177 std::bitset<wordSize> bword{
sbits.substr(bwordPos, wordSize)};
178 l1BitsData[iWordOutputStart + iWordInSet] =
static_cast<uint32_t>(bword.to_ulong());
179 }
180 ++iset;
181 }
183
184
185 re->lvl1_trigger_info(l1BitsData.size(), l1BitsData.data());
186 re->lvl1_trigger_type(
static_cast<uint8_t>(triggerType & 0xFF));
187
188
189 } else {
191 std::string ctpKey;
192 if (l1tr->
getDetail<std::string>(
"CTPResultKey", ctpKey)) {
193 ATH_MSG_WARNING(
"L1TriggerResult contains CTPResult ReadHandleKey but CTP bytestream encoding tool is not enabled");
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(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.
const T * at(size_type n) const
Access an element, as an rvalue.
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
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_gfexEncoderTool
gFEX tool
ToolHandle< IL1TriggerByteStreamTool > m_muonEncoderToolDaq
bool getDetail(const std::string &name, TYPE &value) const
Get an TYPE detail from the object.
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.
TrigComposite_v1 TrigComposite
Declare the latest version of the class.