45 const EventContext& ctx)
const {
50 if (input ==
nullptr) {
52 return StatusCode::FAILURE;
56 const std::size_t nTracks = input->size();
61 auto output = std::make_unique<xAOD::TrackParticleContainer>();
62 auto outputAux = std::make_unique<xAOD::AuxContainerBase>();
64 ATH_CHECK(outputHandle.record(std::move(output), std::move(outputAux)));
65 return StatusCode::SUCCESS;
69 vecmem::cuda::copy copy;
72 TrackParticleContainer::buffer inputHostBuffer(input->size(),
m_hostMR->mr());
73 TrackParticleContainer::buffer inputDeviceBuffer(input->size(),
77 static const SG::AuxElement::ConstAccessor<float> thetaAcc(
"theta");
78 static const SG::AuxElement::ConstAccessor<float> phiAcc(
"phi");
79 static const SG::AuxElement::ConstAccessor<float> qOverPAcc(
"qOverP");
80 std::memcpy(inputHostBuffer.get<0>().ptr(), thetaAcc.getDataArray(*input),
81 nTracks *
sizeof(
float));
82 std::memcpy(inputHostBuffer.get<1>().ptr(), phiAcc.getDataArray(*input),
83 nTracks *
sizeof(
float));
84 std::memcpy(inputHostBuffer.get<2>().ptr(), qOverPAcc.getDataArray(*input),
85 nTracks *
sizeof(
float));
88 copy(inputHostBuffer, inputDeviceBuffer)->wait();
91 TrackParticleContainer::buffer outputDeviceBuffer(input->size(),
93 TrackParticleContainer::buffer outputHostBuffer(input->size(),
100 copy(outputDeviceBuffer, outputHostBuffer)->wait();
103 auto outputAux = std::make_unique<xAOD::AuxContainerBase>();
105 std::memcpy(outputAux->getData(thetaAcc.auxid(), nTracks, nTracks),
106 outputHostBuffer.get<0>().ptr(), nTracks *
sizeof(
float));
107 std::memcpy(outputAux->getData(phiAcc.auxid(), nTracks, nTracks),
108 outputHostBuffer.get<1>().ptr(), nTracks *
sizeof(
float));
109 std::memcpy(outputAux->getData(qOverPAcc.auxid(), nTracks, nTracks),
110 outputHostBuffer.get<2>().ptr(), nTracks *
sizeof(
float));
111 auto output = std::make_unique<xAOD::TrackParticleContainer>();
112 for (std::size_t i = 0; i < nTracks; ++i) {
115 output->setStore(outputAux.get());
119 ATH_CHECK(outputHandle.record(std::move(output), std::move(outputAux)));
122 return StatusCode::SUCCESS;
ToolHandle< AthDevice::IMemoryResourceTool > m_deviceMR
Device memory resource tool to use.
virtual StatusCode execute(const EventContext &ctx) const override
Function executing the algorithm.
ToolHandle< AthDevice::IMemoryResourceTool > m_hostMR
Host memory resource tool to use.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_inputKey
The input container.
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_outputKey
The output container.
virtual StatusCode initialize() override
Function initialising the algorithm.
void copyAuxStoreThinned(const SG::IConstAuxStore &orig, SG::IAuxStore ©, const SG::ThinningInfo *info)
Helper to copy an aux store while applying thinning.