14 #ifdef STANDALONE_FPGA_BENCHMARK
26 #include "Identifier/Identifier.h"
39 return std::bit_cast<uint64_t> (
s);
55 return StatusCode::SUCCESS;
61 const EventContext &ctx)
const {
67 ATH_CHECK(stripClustersHandle.record(std::make_unique<xAOD::StripClusterContainer>(), std::make_unique<xAOD::StripClusterAuxContainer>()));
70 for (
unsigned int i = 0;
i <
metadata->numOfStripClusters;
i++)
73 auto stripCl = stripClustersHandle->push_back(std::make_unique<xAOD::StripCluster>());
76 Eigen::Matrix<float, 1, 1> localPosition;
77 Eigen::Matrix<float, 1, 1> localCovariance;
83 std::vector<Identifier> RDOs;
106 Eigen::Matrix<float, 3, 1> globalPosition(globalX, globalY,
globalZ);
107 stripCl->setMeasurement<1>(idHash, localPosition, localCovariance);
109 stripCl->setIdentifier(
id);
110 stripCl->setRDOlist(RDOs);
111 stripCl->globalPosition() = globalPosition;
112 stripCl->setChannelsInPhi(channelsinPhi);
115 return StatusCode::SUCCESS;
122 const size_t nClusters =
metadata->numOfStripClusters;
128 stripCl->push_new(nClusters, [&stripPool]() {
return stripPool.nextElementPtr(); });
130 auto stripClAux = std::make_unique<xAOD::StripClusterAuxContainer>();
131 stripClAux->resize(nClusters);
132 stripCl->setStore(stripClAux.get());
144 return *
reinterpret_cast<const uint64_t*
>(p32);
146 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
154 constexpr
size_t ROW_idHash = 0;
155 constexpr
size_t ROW_identifier = 1;
157 constexpr
size_t ROW_rdo_w1 = 3;
158 constexpr
size_t ROW_rdo_w2 = 5;
159 constexpr
size_t ROW_localPosX = 7;
160 constexpr
size_t ROW_localCovXX = 8;
161 constexpr
size_t ROW_gpX = 9;
162 constexpr
size_t ROW_gpY = 10;
163 constexpr
size_t ROW_gpZ = 11;
164 constexpr
size_t ROW_channelsPhi = 12;
180 auto locPosXSpan = locPosXAcc.
getDataSpan(*stripCl);
181 auto locCovXXSpan = locCovXXAcc.
getDataSpan(*stripCl);
183 auto channelsPhiSpan = channelsPhiAcc.
getDataSpan(*stripCl);
191 for (
size_t i = 0;
i < nClusters; ++
i) {
193 idHashSpan[
i] =
static_cast<unsigned int>(load_u32(ROW_idHash,
i));
196 idSpan[
i] =
static_cast<unsigned long long>(load_u64(ROW_identifier,
i));
199 locPosXSpan[
i][0] = load_f32(ROW_localPosX,
i);
200 locCovXXSpan[
i][0] = load_f32(ROW_localCovXX,
i);
203 gpSpan[
i][0] = load_f32(ROW_gpX,
i);
204 gpSpan[
i][1] = load_f32(ROW_gpY,
i);
205 gpSpan[
i][2] = load_f32(ROW_gpZ,
i);
208 channelsPhiSpan[
i] =
static_cast<int>(load_u32(ROW_channelsPhi,
i));
211 auto& rdoList = rdoSpan[
i];
215 if (rdo1) rdoList.emplace_back(rdo1);
216 if (rdo2) rdoList.emplace_back(rdo2);
223 ATH_CHECK(stripClustersHandle.record(std::move(stripCl), std::move(stripClAux)));
226 return StatusCode::SUCCESS;
234 const EventContext &ctx)
const {
241 std::make_unique<xAOD::StripClusterContainer>(),
242 std::make_unique<xAOD::StripClusterAuxContainer>()));
244 int rdoIndexCounter = 0;
246 for (
unsigned int i = 0;
i <
metadata->numOfStripClusters;
i++) {
249 stripClustersHandle->push_back(std::make_unique<xAOD::StripCluster>());
252 Eigen::Matrix<float, 1, 1> localPosition;
253 Eigen::Matrix<float, 1, 1> localCovariance;
258 Eigen::Matrix<float, 3, 1> globalPosition(
262 std::vector<Identifier> RDOs;
265 for (
unsigned int j = 0; j <
metadata->scRdoIndex[
i]; ++j) {
269 rdoIndexCounter +=
metadata->scRdoIndex[
i];
271 stripCl->setMeasurement<1>(scAux.
idHash.at(
i), localPosition,
273 stripCl->setIdentifier(scAux.
id.at(
i));
274 stripCl->setRDOlist(RDOs);
275 stripCl->globalPosition() = globalPosition;
278 return StatusCode::SUCCESS;
285 const EventContext &ctx)
const {
295 ATH_CHECK(pixelClustersHandle.record(std::make_unique<xAOD::PixelClusterContainer>(),std::make_unique<xAOD::PixelClusterAuxContainer>()));
297 ATH_CHECK(pixelClustersHandle.isValid());
299 for (
unsigned int i = 0;
i <
metadata->numOfPixelClusters;
i++)
302 auto pixelCl = pixelClustersHandle->push_back(std::make_unique<xAOD::PixelCluster>());
309 std::vector<Identifier> RDOs;
326 Eigen::Matrix<float, 2, 1> localPosition;
327 Eigen::Matrix<float, 2, 2> localCovariance;
328 localCovariance.setZero();
362 Eigen::Matrix<float, 3, 1> globalPosition(globalX, globalY,
globalZ);
364 pixelCl->setMeasurement<2>(idHash, localPosition,localCovariance);
365 pixelCl->setIdentifier(
id);
366 pixelCl->setRDOlist(RDOs);
367 pixelCl->globalPosition() = globalPosition;
368 pixelCl->setTotalToT(totalToT);
369 pixelCl->setChannelsInPhiEta(channelsInPhi, channelsInEta);
370 pixelCl->setWidthInEta(widthInEta);
372 return StatusCode::SUCCESS;
379 const size_t nClusters =
metadata->numOfPixelClusters;
385 pixelCl->push_new(nClusters, [&pixelPool]() {
return pixelPool.nextElementPtr(); });
387 auto pixelClAux = std::make_unique<xAOD::PixelClusterAuxContainer>();
388 pixelClAux->resize(nClusters);
389 pixelCl->setStore(pixelClAux.get());
402 return *
reinterpret_cast<const uint64_t*
>(p32);
404 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
412 constexpr
size_t ROW_idHash = 0;
413 constexpr
size_t ROW_identifier = 1;
414 constexpr
size_t ROW_rdo_w1 = 3;
415 constexpr
size_t ROW_rdo_w2 = 5;
416 constexpr
size_t ROW_rdo_w3 = 7;
417 constexpr
size_t ROW_rdo_w4 = 9;
418 constexpr
size_t ROW_localX = 11;
419 constexpr
size_t ROW_localY = 12;
420 constexpr
size_t ROW_covXX = 13;
421 constexpr
size_t ROW_covYY = 14;
422 constexpr
size_t ROW_gpX = 15;
423 constexpr
size_t ROW_gpY = 16;
424 constexpr
size_t ROW_gpZ = 17;
425 constexpr
size_t ROW_channelsPhi = 18;
426 constexpr
size_t ROW_channelsEta = 19;
427 constexpr
size_t ROW_widthEta = 20;
428 constexpr
size_t ROW_totalToT = 21;
451 auto totalToTSpan = totalToTAcc.
getDataSpan(*pixelCl);
452 auto channelsPhiSpan = channelsPhiAcc.
getDataSpan(*pixelCl);
453 auto channelsEtaSpan = channelsEtaAcc.
getDataSpan(*pixelCl);
454 auto widthEtaSpan = widthEtaAcc.
getDataSpan(*pixelCl);
462 for (
size_t i = 0;
i < nClusters; ++
i) {
464 idHashSpan[
i] =
static_cast<unsigned int>(load_u32(ROW_idHash,
i));
465 idSpan[
i] =
static_cast<unsigned long long>(load_u64(ROW_identifier,
i));
468 locPosSpan[
i][0] = load_f32(ROW_localX,
i);
469 locPosSpan[
i][1] = load_f32(ROW_localY,
i);
472 locCovSpan[
i][0] = load_f32(ROW_covXX,
i);
473 locCovSpan[
i][3] = load_f32(ROW_covYY,
i);
476 gpSpan[
i][0] = load_f32(ROW_gpX,
i);
477 gpSpan[
i][1] = load_f32(ROW_gpY,
i);
478 gpSpan[
i][2] = load_f32(ROW_gpZ,
i);
481 channelsPhiSpan[
i] =
static_cast<int>(load_u32(ROW_channelsPhi,
i));
482 channelsEtaSpan[
i] =
static_cast<int>(load_u32(ROW_channelsEta,
i));
483 widthEtaSpan[
i] = load_f32(ROW_widthEta,
i);
484 totalToTSpan[
i] =
static_cast<int>(load_u32(ROW_totalToT,
i));
487 auto& rdoList = rdoSpan[
i];
493 if (r1) rdoList.emplace_back(r1);
494 if (r2) rdoList.emplace_back(r2);
495 if (r3) rdoList.emplace_back(r3);
496 if (r4) rdoList.emplace_back(r4);
503 ATH_CHECK(pixelClustersHandle.record(std::move(pixelCl), std::move(pixelClAux)));
506 return StatusCode::SUCCESS;
510 return StatusCode::SUCCESS;
518 const EventContext &ctx)
const {
528 ATH_MSG_DEBUG(
"You are running the element-wise container creation method.");
532 std::make_unique<xAOD::PixelClusterContainer>(),
533 std::make_unique<xAOD::PixelClusterAuxContainer>()));
535 ATH_CHECK(pixelClustersHandle.isValid());
538 int rdoIndexCounter = 0;
540 for (
unsigned int i = 0;
i <
metadata->numOfPixelClusters;
i++) {
542 auto pixelCl = pixelClustersHandle->push_back(
543 std::make_unique<xAOD::PixelCluster>());
545 Eigen::Matrix<float, 2, 1> localPosition(
547 Eigen::Matrix<float, 2, 2> localCovariance;
548 localCovariance.setZero();
551 Eigen::Matrix<float, 3, 1> globalPosition(
555 std::vector<Identifier> RDOs;
558 for (
unsigned int j = 0; j <
metadata->pcRdoIndex[
i]; ++j) {
562 rdoIndexCounter +=
metadata->pcRdoIndex[
i];
564 pixelCl->setMeasurement<2>(pxAux.
idHash[
i], localPosition,
566 pixelCl->setIdentifier(pxAux.
id[
i]);
567 pixelCl->setRDOlist(RDOs);
568 pixelCl->globalPosition() = globalPosition;
575 return StatusCode::SUCCESS;
582 ATH_MSG_DEBUG(
"You are running the bulk copy container creation method.");
588 auto pixelCl = std::make_unique<xAOD::PixelClusterContainer>();
589 auto pixelClAux = std::make_unique<xAOD::PixelClusterAuxContainer>();
590 pixelCl->setStore(pixelClAux.get());
594 const size_t nClusters =
metadata->numOfPixelClusters;
595 pixelClAux->resize(nClusters);
596 pixelCl->reserve(nClusters);
602 for (
size_t i = 0;
i < nClusters; ++
i) {
603 pixelCl->push_back(std::make_unique<xAOD::PixelCluster>());
611 std::vector<long unsigned int> identifierBuffer(nClusters);
612 std::vector<unsigned int> idHashBuffer(nClusters);
613 std::vector<std::array<float, 3>> gpBuffer(nClusters);
614 std::vector<float> localPosX(nClusters);
615 std::vector<float> localPosY(nClusters);
616 std::vector<float> localCovXX(nClusters);
617 std::vector<float> localCovYY(nClusters);
618 std::vector<int> totalToTBuffer(nClusters);
619 std::vector<float> widthInEtaBuffer(nClusters);
620 std::vector<int> channelsInPhiBuffer(nClusters);
621 std::vector<int> channelsInEtaBuffer(nClusters);
623 for (
size_t i = 0;
i < nClusters; ++
i) {
626 identifierBuffer[
i] = pxAux.
id[
i];
681 auto locPosXSpan = localPosXAcc.
getDataSpan(*pixelCl);
682 auto locPosYSpan = localPosYAcc.
getDataSpan(*pixelCl);
683 auto locCovXXSpan = localCovXXAcc.
getDataSpan(*pixelCl);
684 auto locCovYYSpan = localCovYYAcc.
getDataSpan(*pixelCl);
688 auto channelsInPhiSpan = channelsInPhiAcc.
getDataSpan(*pixelCl);
689 auto channelsInEtaSpan = channelsInEtaAcc.
getDataSpan(*pixelCl);
714 int rdoIndexCounter = 0;
716 for (
size_t i = 0;
i < nClusters; ++
i) {
720 std::vector<unsigned long long> &rdosForThisCluster = rdoSpan[
i];
723 rdosForThisCluster.resize(nRDOs);
726 for (
size_t j = 0; j < nRDOs; ++j) {
727 rdosForThisCluster[j] = pxAux.
rdoList[rdoIndexCounter + j];
729 rdoIndexCounter += nRDOs;
736 ATH_CHECK(pixelClustersHandle.record(std::move(pixelCl), std::move(pixelClAux)));
739 return StatusCode::SUCCESS;