18 return StatusCode::SUCCESS;
22 ATH_MSG_DEBUG(
"Executing StripClustering for event slot: " << ctx.slot());
26 if (!stripRDOHandle.isValid()) {
28 return StatusCode::FAILURE;
31 std::vector<uint64_t> outputData;
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) {
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);
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) {
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(
' '));
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++)
229 for (
unsigned int i = 0;
i < numStripClusters;
i++)
247 return StatusCode::SUCCESS;