40 const EventContext& ctx)
const {
45 if (input ==
nullptr) {
47 return StatusCode::FAILURE;
51 const std::size_t nTracks = input->size();
56 auto output = std::make_unique<xAOD::TrackParticleContainer>();
57 auto outputAux = std::make_unique<xAOD::AuxContainerBase>();
59 ATH_CHECK(outputHandle.record(std::move(output), std::move(outputAux)));
60 return StatusCode::SUCCESS;
72 const std::vector<unsigned int> bufferSize(input->size(), 0u);
75 auto inputHostBuffer =
77 ? traccc::edm::track_collection<
78 traccc::default_algebra>::buffer{bufferSize,
80 : traccc::edm::track_collection<traccc::default_algebra>::buffer{
82 auto inputDeviceBuffer =
84 ? traccc::edm::track_collection<
85 traccc::default_algebra>::buffer{bufferSize,
m_mrTool->mainMR(),
87 : traccc::edm::track_collection<traccc::default_algebra>::buffer{};
88 hostCopy->setup(inputHostBuffer)->wait();
89 deviceCopy->setup(inputDeviceBuffer)->ignore();
92 traccc::edm::track_collection<traccc::default_algebra>::device inputHost{
94 for (
unsigned int i = 0; i < input->size(); ++i) {
95 inputHost[i].params().set_theta(input->at(i)->theta());
96 inputHost[i].params().set_phi(input->at(i)->phi());
97 inputHost[i].params().set_qop(input->at(i)->qOverP());
102 (*deviceCopy)(inputHostBuffer, inputDeviceBuffer)->ignore();
106 traccc::edm::track_collection<traccc::default_algebra>::buffer
109 deviceCopy->setup(outputDeviceBuffer)->ignore();
111 hostCopy->setup(outputDeviceBuffer)->ignore();
113 traccc::edm::track_collection<traccc::default_algebra>::host
119 stream,
m_mrTool->hostMR() ? inputDeviceBuffer : inputHostBuffer,
120 outputDeviceBuffer));
124 (*deviceCopy)(outputDeviceBuffer, outputHostCollection)->wait();
126 (*hostCopy)(outputDeviceBuffer, outputHostCollection)->wait();
130 auto outputAux = std::make_unique<xAOD::AuxContainerBase>();
132 auto output = std::make_unique<xAOD::TrackParticleContainer>();
133 for (std::size_t i = 0; i < nTracks; ++i) {
134 output->push_back(std::make_unique<xAOD::TrackParticle>());
136 output->setStore(outputAux.get());
137 for (std::size_t i = 0; i < nTracks; ++i) {
139 track->setDefiningParameters(input->at(i)->d0(), input->at(i)->z0(),
140 outputHostCollection[i].params().phi(),
141 outputHostCollection[i].params().theta(),
142 outputHostCollection[i].params().qop());
147 ATH_CHECK(outputHandle.record(std::move(output), std::move(outputAux)));
150 return StatusCode::SUCCESS;
virtual StatusCode execute(const EventContext &ctx) const override
Function executing the algorithm.
ToolHandle< AthDevice::ICopyTool > m_deviceCopyTool
Device copy tool to use.
ToolHandle< AthCUDA::IStreamTool > m_streamTool
Stream tool to use.
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_inputKey
The input container.
ToolHandle< AthDevice::IMemoryResourcesTool > m_mrTool
Host memory resource tool to use.
ToolHandle< AthDevice::ICopyTool > m_hostCopyTool
Host copy tool to use.
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_outputKey
The output container.
virtual StatusCode initialize() override
Function initialising the algorithm.
StatusCode calibrateOnGPU(cudaStream_t stream, const traccc::edm::track_collection< traccc::default_algebra >::const_view &input, traccc::edm::track_collection< traccc::default_algebra >::view &output)
Perform the transformation on an NVIDIA GPU.