60 const uint32_t* stripClusters,
62 const EventContext &ctx)
const {
68 ATH_CHECK(stripClustersHandle.
record(std::make_unique<xAOD::StripClusterContainer>(), std::make_unique<xAOD::StripClusterAuxContainer>()));
71 for (
unsigned int i = 0; i < metadata->numOfStripClusters; i++)
74 auto stripCl = stripClustersHandle->push_back(std::make_unique<xAOD::StripCluster>());
77 Eigen::Matrix<float, 1, 1> localPosition;
78 Eigen::Matrix<float, 1, 1> localCovariance;
84 std::vector<Identifier> RDOs;
107 Eigen::Matrix<float, 3, 1> globalPosition(globalX, globalY, globalZ);
108 stripCl->setMeasurement<1>(idHash, localPosition, localCovariance);
110 stripCl->setIdentifier(
id);
111 stripCl->setRDOlist(RDOs);
112 stripCl->globalPosition() = globalPosition;
113 stripCl->setChannelsInPhi(channelsinPhi);
116 return StatusCode::SUCCESS;
123 const size_t nClusters = metadata->numOfStripClusters;
129 stripCl->push_new(nClusters, [&stripPool]() {
return stripPool.
nextElementPtr(); });
131 auto stripClAux = std::make_unique<xAOD::StripClusterAuxContainer>();
132 stripClAux->resize(nClusters);
133 stripCl->setStore(stripClAux.get());
138 const size_t offset = 16;
141 const uint32_t*
base = stripClusters;
143 auto load_u64 = [&](
size_t row,
size_t idx) -> uint64_t {
144 const uint32_t* p32 =
base + row * N + offset + 2 * idx;
145 return *
reinterpret_cast<const uint64_t*
>(p32);
147 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
148 return std::bit_cast<float>(*(
base + row * N + offset + idx));
150 auto load_u32 = [&](
size_t row,
size_t idx) -> uint32_t {
151 return *(
base + row * N + offset + idx);
155 constexpr size_t ROW_idHash = 0;
156 constexpr size_t ROW_identifier = 1;
158 constexpr size_t ROW_rdo_w1 = 3;
159 constexpr size_t ROW_rdo_w2 = 5;
160 constexpr size_t ROW_localPosX = 7;
161 constexpr size_t ROW_localCovXX = 8;
162 constexpr size_t ROW_gpX = 9;
163 constexpr size_t ROW_gpY = 10;
164 constexpr size_t ROW_gpZ = 11;
165 constexpr size_t ROW_channelsPhi = 12;
170 unsigned int totalStripRDOs = 0;
171 for (
size_t i = 0; i < nClusters; ++i) {
172 uint64_t rdo1 = load_u64(ROW_rdo_w1, i);
173 uint64_t rdo2 = load_u64(ROW_rdo_w2, i);
174 if (rdo1) ++totalStripRDOs;
175 if (rdo2) ++totalStripRDOs;
191 auto locPosXSpan = locPosXAcc.
getDataSpan(*stripCl);
192 auto locCovXXSpan = locCovXXAcc.
getDataSpan(*stripCl);
194 auto channelsPhiSpan = channelsPhiAcc.
getDataSpan(*stripCl);
205 for (
size_t i = 0; i < nClusters; ++i) {
207 idHashSpan[i] =
static_cast<unsigned int>(load_u32(ROW_idHash, i));
210 idSpan[i] =
static_cast<unsigned long long>(load_u64(ROW_identifier, i));
213 locPosXSpan[i][0] = load_f32(ROW_localPosX, i);
214 locCovXXSpan[i][0] = load_f32(ROW_localCovXX, i);
217 gpSpan[i][0] = load_f32(ROW_gpX, i);
218 gpSpan[i][1] = load_f32(ROW_gpY, i);
219 gpSpan[i][2] = load_f32(ROW_gpZ, i);
222 channelsPhiSpan[i] =
static_cast<int>(load_u32(ROW_channelsPhi, i));
226 uint64_t rdo1 = load_u64(ROW_rdo_w1, i);
227 uint64_t rdo2 = load_u64(ROW_rdo_w2, i);
229 rdoListCache.
setValue(rdoIdx,
static_cast<Identifier::value_type
>(rdo1));
233 rdoListCache.
setValue(rdoIdx,
static_cast<Identifier::value_type
>(rdo2));
243 ATH_CHECK(stripClustersHandle.
record(std::move(stripCl), std::move(stripClAux)));
246 return StatusCode::SUCCESS;
254 const EventContext &ctx)
const {
261 std::make_unique<xAOD::StripClusterContainer>(),
262 std::make_unique<xAOD::StripClusterAuxContainer>()));
264 int rdoIndexCounter = 0;
266 for (
unsigned int i = 0; i < metadata->numOfStripClusters; i++) {
269 stripClustersHandle->push_back(std::make_unique<xAOD::StripCluster>());
272 Eigen::Matrix<float, 1, 1> localPosition;
273 Eigen::Matrix<float, 1, 1> localCovariance;
278 Eigen::Matrix<float, 3, 1> globalPosition(
282 std::vector<Identifier> RDOs;
283 RDOs.reserve(metadata->scRdoIndex[i]);
285 for (
unsigned int j = 0; j < metadata->scRdoIndex[i]; ++j) {
289 rdoIndexCounter += metadata->scRdoIndex[i];
291 stripCl->setMeasurement<1>(scAux.
idHash.at(i), localPosition,
293 stripCl->setIdentifier(scAux.
id.at(i));
294 stripCl->setRDOlist(RDOs);
295 stripCl->globalPosition() = globalPosition;
298 return StatusCode::SUCCESS;
303 const uint32_t* pixelClusters,
305 const EventContext &ctx)
const {
315 ATH_CHECK(pixelClustersHandle.
record(std::make_unique<xAOD::PixelClusterContainer>(),std::make_unique<xAOD::PixelClusterAuxContainer>()));
319 for (
unsigned int i = 0; i < metadata->numOfPixelClusters; i++)
322 auto pixelCl = pixelClustersHandle->push_back(std::make_unique<xAOD::PixelCluster>());
329 std::vector<Identifier> RDOs;
346 Eigen::Matrix<float, 2, 1> localPosition;
347 Eigen::Matrix<float, 2, 2> localCovariance;
348 localCovariance.setZero();
379 Eigen::Matrix<float, 3, 1> globalPosition(globalX, globalY, globalZ);
381 pixelCl->setMeasurement<2>(idHash, localPosition,localCovariance);
382 pixelCl->setIdentifier(
id);
383 pixelCl->setRDOlist(RDOs);
384 pixelCl->globalPosition() = globalPosition;
385 pixelCl->setChannelsInPhiEta(channelsInPhi, channelsInEta);
386 pixelCl->setWidthInEta(widthInEta);
388 return StatusCode::SUCCESS;
395 const size_t nClusters = metadata->numOfPixelClusters;
401 pixelCl->push_new(nClusters, [&pixelPool]() {
return pixelPool.
nextElementPtr(); });
403 auto pixelClAux = std::make_unique<xAOD::PixelClusterAuxContainer>();
404 pixelClAux->resize(nClusters);
405 pixelCl->setStore(pixelClAux.get());
411 const size_t offset = 16;
414 const uint32_t*
base = pixelClusters;
416 auto load_u64 = [&](
size_t row,
size_t idx) -> uint64_t {
417 const uint32_t* p32 =
base + row * N + offset + 2 * idx;
418 return *
reinterpret_cast<const uint64_t*
>(p32);
420 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
421 return std::bit_cast<float>(*(
base + row * N + offset + idx));
423 auto load_u32 = [&](
size_t row,
size_t idx) -> uint32_t {
424 return *(
base + row * N + offset + idx);
428 constexpr size_t ROW_idHash = 0;
429 constexpr size_t ROW_identifier = 1;
430 constexpr size_t ROW_rdo_w1 = 3;
431 constexpr size_t ROW_rdo_w2 = 5;
432 constexpr size_t ROW_rdo_w3 = 7;
433 constexpr size_t ROW_rdo_w4 = 9;
434 constexpr size_t ROW_localX = 11;
435 constexpr size_t ROW_localY = 12;
436 constexpr size_t ROW_covXX = 13;
437 constexpr size_t ROW_covYY = 14;
438 constexpr size_t ROW_gpX = 15;
439 constexpr size_t ROW_gpY = 16;
440 constexpr size_t ROW_gpZ = 17;
441 constexpr size_t ROW_channelsPhi = 18;
442 constexpr size_t ROW_channelsEta = 19;
443 constexpr size_t ROW_widthEta = 20;
444 constexpr size_t ROW_totalToT = 21;
449 unsigned int totalPixelRDOs = 0;
450 for (
size_t i = 0; i < nClusters; ++i) {
451 if (load_u64(ROW_rdo_w1, i)) ++totalPixelRDOs;
452 if (load_u64(ROW_rdo_w2, i)) ++totalPixelRDOs;
453 if (load_u64(ROW_rdo_w3, i)) ++totalPixelRDOs;
454 if (load_u64(ROW_rdo_w4, i)) ++totalPixelRDOs;
476 auto totalToTSpan = totalToTAcc.
getDataSpan(*pixelCl);
477 auto channelsPhiSpan = channelsPhiAcc.
getDataSpan(*pixelCl);
478 auto channelsEtaSpan = channelsEtaAcc.
getDataSpan(*pixelCl);
479 auto widthEtaSpan = widthEtaAcc.
getDataSpan(*pixelCl);
489 for (
size_t i = 0; i < nClusters; ++i) {
491 idHashSpan[i] =
static_cast<unsigned int>(load_u32(ROW_idHash, i));
492 idSpan[i] =
static_cast<unsigned long long>(load_u64(ROW_identifier, i));
495 locPosSpan[i][0] = load_f32(ROW_localX, i);
496 locPosSpan[i][1] = load_f32(ROW_localY, i);
499 locCovSpan[i][0] = load_f32(ROW_covXX, i);
500 locCovSpan[i][3] = load_f32(ROW_covYY, i);
503 gpSpan[i][0] = load_f32(ROW_gpX, i);
504 gpSpan[i][1] = load_f32(ROW_gpY, i);
505 gpSpan[i][2] = load_f32(ROW_gpZ, i);
508 channelsPhiSpan[i] =
static_cast<int>(load_u32(ROW_channelsPhi, i));
509 channelsEtaSpan[i] =
static_cast<int>(load_u32(ROW_channelsEta, i));
510 widthEtaSpan[i] = load_f32(ROW_widthEta, i);
511 totalToTSpan[i] =
static_cast<int>(load_u32(ROW_totalToT, i));
515 uint64_t r1 = load_u64(ROW_rdo_w1, i);
516 uint64_t r2 = load_u64(ROW_rdo_w2, i);
517 uint64_t r3 = load_u64(ROW_rdo_w3, i);
518 uint64_t r4 = load_u64(ROW_rdo_w4, i);
520 clusterVars.
rdoList.
setValue(rdoIdx,
static_cast<Identifier::value_type
>(r1));
524 clusterVars.
rdoList.
setValue(rdoIdx,
static_cast<Identifier::value_type
>(r2));
528 clusterVars.
rdoList.
setValue(rdoIdx,
static_cast<Identifier::value_type
>(r3));
532 clusterVars.
rdoList.
setValue(rdoIdx,
static_cast<Identifier::value_type
>(r4));
542 ATH_CHECK(pixelClustersHandle.
record(std::move(pixelCl), std::move(pixelClAux)));
545 return StatusCode::SUCCESS;
549 return StatusCode::SUCCESS;
557 const EventContext &ctx)
const {
567 ATH_MSG_DEBUG(
"You are running the element-wise container creation method.");
571 std::make_unique<xAOD::PixelClusterContainer>(),
572 std::make_unique<xAOD::PixelClusterAuxContainer>()));
577 int rdoIndexCounter = 0;
579 for (
unsigned int i = 0; i < metadata->numOfPixelClusters; i++) {
581 auto pixelCl = pixelClustersHandle->push_back(
582 std::make_unique<xAOD::PixelCluster>());
584 Eigen::Matrix<float, 2, 1> localPosition(
586 Eigen::Matrix<float, 2, 2> localCovariance;
587 localCovariance.setZero();
590 Eigen::Matrix<float, 3, 1> globalPosition(
594 std::vector<Identifier> RDOs;
595 RDOs.reserve(metadata->pcRdoIndex[i]);
597 for (
unsigned int j = 0; j < metadata->pcRdoIndex[i]; ++j) {
601 rdoIndexCounter += metadata->pcRdoIndex[i];
603 pixelCl->setMeasurement<2>(pxAux.
idHash[i], localPosition,
605 pixelCl->setIdentifier(pxAux.
id[i]);
606 pixelCl->setRDOlist(RDOs);
607 pixelCl->globalPosition() = globalPosition;
613 return StatusCode::SUCCESS;
620 ATH_MSG_DEBUG(
"You are running the bulk copy container creation method.");
626 auto pixelCl = std::make_unique<xAOD::PixelClusterContainer>();
627 auto pixelClAux = std::make_unique<xAOD::PixelClusterAuxContainer>();
628 pixelCl->setStore(pixelClAux.get());
632 const size_t nClusters = metadata->numOfPixelClusters;
633 pixelClAux->resize(nClusters);
634 pixelCl->reserve(nClusters);
640 for (
size_t i = 0; i < nClusters; ++i) {
641 pixelCl->push_back(std::make_unique<xAOD::PixelCluster>());
649 std::vector<long unsigned int> identifierBuffer(nClusters);
650 std::vector<unsigned int> idHashBuffer(nClusters);
651 std::vector<std::array<float, 3>> gpBuffer(nClusters);
652 std::vector<float> localPosX(nClusters);
653 std::vector<float> localPosY(nClusters);
654 std::vector<float> localCovXX(nClusters);
655 std::vector<float> localCovYY(nClusters);
656 std::vector<int> totalToTBuffer(nClusters);
657 std::vector<float> widthInEtaBuffer(nClusters);
658 std::vector<int> channelsInPhiBuffer(nClusters);
659 std::vector<int> channelsInEtaBuffer(nClusters);
661 for (
size_t i = 0; i < nClusters; ++i) {
664 identifierBuffer[i] = pxAux.
id[i];
667 idHashBuffer[i] = pxAux.
idHash[i];
685 totalToTBuffer[i] = pxAux.
totalToT[i];
719 auto locPosXSpan = localPosXAcc.
getDataSpan(*pixelCl);
720 auto locPosYSpan = localPosYAcc.
getDataSpan(*pixelCl);
721 auto locCovXXSpan = localCovXXAcc.
getDataSpan(*pixelCl);
722 auto locCovYYSpan = localCovYYAcc.
getDataSpan(*pixelCl);
726 auto channelsInPhiSpan = channelsInPhiAcc.
getDataSpan(*pixelCl);
727 auto channelsInEtaSpan = channelsInEtaAcc.
getDataSpan(*pixelCl);
752 int rdoIndexCounter = 0;
754 for (
size_t i = 0; i < nClusters; ++i) {
755 size_t nRDOs = metadata->pcRdoIndex[i];
758 std::vector<unsigned long long> &rdosForThisCluster = rdoSpan[i];
761 rdosForThisCluster.resize(nRDOs);
764 for (
size_t j = 0; j < nRDOs; ++j) {
765 rdosForThisCluster[j] = pxAux.
rdoList[rdoIndexCounter + j];
767 rdoIndexCounter += nRDOs;
774 ATH_CHECK(pixelClustersHandle.
record(std::move(pixelCl), std::move(pixelClAux)));
777 return StatusCode::SUCCESS;