22 ATH_MSG_DEBUG(
"Executing StripClustering for event slot: " << ctx.slot());
26 if (!stripRDOHandle.isValid()) {
28 return StatusCode::FAILURE;
30 std::vector<IdentifierHash> listOfIds;
31 std::vector<uint64_t> outputData;
32 if (!
m_FPGADataFormatTool->convertStripHitsToFPGADataFormat(*stripRDOHandle, outputData, listOfIds, ctx)) {
33 ATH_MSG_ERROR(
"Failed to convert input data to FPGA-compatible format.");
34 return StatusCode::FAILURE;
38 ATH_MSG_DEBUG(
"Encoded strip data size: " << outputData.size());
40 for (
const auto& var : outputData) {
41 ATH_MSG_DEBUG(
"EncodedData[" << std::dec << std::setw(4) << line <<
"] = 0x"
42 << std::hex << std::setfill(
'0') << std::setw(16) << var << std::setfill(
' '));
47 std::vector<uint64_t> kernelOutput(outputData.size(), 0);
48 std::vector<uint64_t> kernelEDMOutput(outputData.size()*10, 0);
49 std::vector<uint64_t> kernel_L2GOutput(outputData.size(), 0);
50 std::vector<uint64_t> kernel_L2GEDMOutput(outputData.size()*10, 0);
51 std::vector<uint32_t> kernel_EDMPrepOutputPixel(outputData.size(), 0);
62 cl::Buffer inputBuffer(
m_context, CL_MEM_READ_ONLY,
sizeof(uint64_t) * outputData.size(),
nullptr, &err);
63 cl::Buffer outputBuffer(
m_context, CL_MEM_READ_WRITE,
sizeof(uint64_t) * kernelOutput.size(),
nullptr, &err);
64 cl::Buffer outputEDMBuffer(
m_context, CL_MEM_READ_WRITE,
sizeof(uint64_t) * kernelEDMOutput.size(),
nullptr, &err);
66 cl::Buffer output_L2GBuffer(
m_context, CL_MEM_WRITE_ONLY,
sizeof(uint64_t) * kernel_L2GOutput.size(),
nullptr, &err);
67 cl::Buffer output_L2GEDMBuffer(
m_context, CL_MEM_READ_WRITE,
sizeof(uint64_t) * kernel_L2GEDMOutput.size(),
nullptr, &err);
70 cl::Buffer inputBufferPixel(
m_context, CL_MEM_READ_ONLY,
sizeof(uint64_t) * outputData.size(),
nullptr, &err);
71 cl::Buffer output_EDMPrepBufferPixel(
m_context, CL_MEM_WRITE_ONLY,
sizeof(uint64_t) * kernel_EDMPrepOutputPixel.size(),
nullptr, &err);
73 cl::Buffer stripbuffer(
m_context, CL_MEM_READ_WRITE, stripOutput.size() *
sizeof(uint64_t), NULL, &err);
77 kernel.setArg(0, inputBuffer);
78 kernel.setArg(1, outputBuffer);
79 kernel.setArg(2, outputEDMBuffer);
80 kernel.setArg(3,
static_cast<unsigned int>(outputData.size()));
82 cl::Kernel kernel_L2G(
m_program,
"l2g_strip_tool", &err);
83 kernel_L2G.setArg(0, outputBuffer);
84 kernel_L2G.setArg(1, outputEDMBuffer);
85 kernel_L2G.setArg(2, output_L2GBuffer);
86 kernel_L2G.setArg(3, output_L2GEDMBuffer);
88 cl::Kernel kernel_EMDPrep(
m_program,
"EDMPrep", &err);
89 kernel_EMDPrep.setArg(0, inputBufferPixel);
90 kernel_EMDPrep.setArg(1, output_L2GEDMBuffer);
91 kernel_EMDPrep.setArg(2, output_EDMPrepBufferPixel);
92 kernel_EMDPrep.setArg(3, stripbuffer);
99 queue.enqueueWriteBuffer(inputBuffer, CL_TRUE, 0,
sizeof(uint64_t) * outputData.size(), outputData.data());
100 queue.enqueueTask(kernel);
102 queue.enqueueTask(kernel_L2G);
104 queue.enqueueTask(kernel_EMDPrep);
106 queue.enqueueReadBuffer(outputBuffer, CL_TRUE, 0,
sizeof(uint64_t) * kernelOutput.size(), kernelOutput.data());
107 queue.enqueueReadBuffer(outputEDMBuffer, CL_TRUE, 0,
sizeof(uint64_t) * kernelEDMOutput.size(), kernelEDMOutput.data());
108 queue.enqueueReadBuffer(output_L2GBuffer, CL_TRUE, 0,
sizeof(uint64_t) * kernel_L2GOutput.size(), kernel_L2GOutput.data());
109 queue.enqueueReadBuffer(output_L2GEDMBuffer, CL_TRUE, 0,
sizeof(uint64_t) * kernel_L2GEDMOutput.size(), kernel_L2GEDMOutput.data());
110 queue.enqueueReadBuffer(stripbuffer, CL_TRUE, 0, stripOutput.size() *
sizeof(uint64_t), stripOutput.data());
116 for (
const auto& var : kernelOutput) {
117 if(var != 0)
ATH_MSG_DEBUG(
"Clustering KernelOutput[" << std::dec << std::setw(4) << line <<
"] = 0x"
118 << std::hex << std::setfill(
'0') << std::setw(16) << var << std::setfill(
' '));
122 for (
const auto& var : kernelEDMOutput) {
123 if(var != 0)
ATH_MSG_DEBUG(
"Clustering KernelEDMOutput[" << std::dec << std::setw(4) << line <<
"] = 0x"
124 << std::hex << std::setfill(
'0') << std::setw(16) << var << std::setfill(
' '));
129 for (
const auto& var : kernel_L2GOutput) {
130 if(var != 0)
ATH_MSG_DEBUG(
"L2G KernelOutput[" << std::dec << std::setw(4) << line <<
"] = 0x"
131 << std::hex << std::setfill(
'0') << std::setw(16) << var << std::setfill(
' '));
135 for (
const auto& var : kernel_L2GEDMOutput) {
136 if(var != 0)
ATH_MSG_DEBUG(
"L2g KernelEDMOutput[" << std::dec << std::setw(4) << line <<
"] = 0x"
137 << std::hex << std::setfill(
'0') << std::setw(16) << var << std::setfill(
' '));
141 for (
const auto& var : stripOutput) {
142 if(var != 0)
ATH_MSG_DEBUG(
"EDM Prep kernel_EMDPrep[" << std::dec << std::setw(4) << line <<
"] = 0x"
143 << std::hex << std::setfill(
'0') << std::setw(16) << var << std::setfill(
' '));
153 uint64_t *stripClusters = (uint64_t *)stripOutput.data();
155 unsigned int numStripClusters = stripClusters[0];
159 std::unique_ptr<EFTrackingTransient::Metadata> metadata =
160 std::make_unique<EFTrackingTransient::Metadata>();
162 metadata->numOfStripClusters = numStripClusters;
163 metadata->scRdoIndexSize = numStripClusters;
174 for (
unsigned int i = 0; i < numStripClusters; i++)
224 metadata->scRdoIndex[i] = rdoCounter;
229 for (
unsigned int i = 0; i < numStripClusters; i++)
232 ATH_MSG_DEBUG(
"Strip cluster " << i << std::hex <<
" id: " << scAux.
id[i]);
239 ATH_MSG_DEBUG(
"Strip cluster " << i <<
" rdoList size: " << metadata->scRdoIndex[i]);
247 return StatusCode::SUCCESS;