59 const uint32_t* stripClusters,
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());
137 const size_t offset = 16;
140 const uint32_t*
base = stripClusters;
142 auto load_u64 = [&](
size_t row,
size_t idx) -> uint64_t {
143 const uint32_t* p32 =
base + row * N + offset + 2 * idx;
144 return *
reinterpret_cast<const uint64_t*
>(p32);
146 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
147 return std::bit_cast<float>(*(
base + row * N + offset + idx));
149 auto load_u32 = [&](
size_t row,
size_t idx) -> uint32_t {
150 return *(
base + row * N + offset + idx);
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);
184 auto rdoSpan =
rdoListAcc.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];
213 uint64_t rdo1 = load_u64(ROW_rdo_w1, i);
214 uint64_t rdo2 = load_u64(ROW_rdo_w2, 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;
263 RDOs.reserve(metadata->scRdoIndex[i]);
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;
283 const uint32_t* pixelClusters,
285 const EventContext &ctx)
const {
295 ATH_CHECK(pixelClustersHandle.
record(std::make_unique<xAOD::PixelClusterContainer>(),std::make_unique<xAOD::PixelClusterAuxContainer>()));
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());
395 const size_t offset = 16;
398 const uint32_t*
base = pixelClusters;
400 auto load_u64 = [&](
size_t row,
size_t idx) -> uint64_t {
401 const uint32_t* p32 =
base + row * N + offset + 2 * idx;
402 return *
reinterpret_cast<const uint64_t*
>(p32);
404 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
405 return std::bit_cast<float>(*(
base + row * N + offset + idx));
407 auto load_u32 = [&](
size_t row,
size_t idx) -> uint32_t {
408 return *(
base + row * N + offset + idx);
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);
455 auto rdoSpan =
rdoListAcc.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];
489 uint64_t r1 = load_u64(ROW_rdo_w1, i);
490 uint64_t r2 = load_u64(ROW_rdo_w2, i);
491 uint64_t r3 = load_u64(ROW_rdo_w3, i);
492 uint64_t r4 = load_u64(ROW_rdo_w4, 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>()));
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;
556 RDOs.reserve(metadata->pcRdoIndex[i]);
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;
569 pixelCl->setTotalToT(pxAux.
totalToT[i]);
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];
629 idHashBuffer[i] = pxAux.
idHash[i];
647 totalToTBuffer[i] = pxAux.
totalToT[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);
712 auto rdoSpan =
rdoListAcc.getDataSpan(*pixelCl);
714 int rdoIndexCounter = 0;
716 for (
size_t i = 0; i < nClusters; ++i) {
717 size_t nRDOs = metadata->pcRdoIndex[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;