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();
359 Eigen::Matrix<float, 3, 1> globalPosition(globalX, globalY, globalZ);
361 pixelCl->setMeasurement<2>(idHash, localPosition,localCovariance);
362 pixelCl->setIdentifier(
id);
363 pixelCl->setRDOlist(RDOs);
364 pixelCl->globalPosition() = globalPosition;
365 pixelCl->setChannelsInPhiEta(channelsInPhi, channelsInEta);
366 pixelCl->setWidthInEta(widthInEta);
368 return StatusCode::SUCCESS;
375 const size_t nClusters = metadata->numOfPixelClusters;
381 pixelCl->push_new(nClusters, [&pixelPool]() {
return pixelPool.
nextElementPtr(); });
383 auto pixelClAux = std::make_unique<xAOD::PixelClusterAuxContainer>();
384 pixelClAux->resize(nClusters);
385 pixelCl->setStore(pixelClAux.get());
391 const size_t offset = 16;
394 const uint32_t*
base = pixelClusters;
396 auto load_u64 = [&](
size_t row,
size_t idx) -> uint64_t {
397 const uint32_t* p32 =
base + row * N + offset + 2 * idx;
398 return *
reinterpret_cast<const uint64_t*
>(p32);
400 auto load_f32 = [&](
size_t row,
size_t idx) ->
float {
401 return std::bit_cast<float>(*(
base + row * N + offset + idx));
403 auto load_u32 = [&](
size_t row,
size_t idx) -> uint32_t {
404 return *(
base + row * N + offset + idx);
408 constexpr size_t ROW_idHash = 0;
409 constexpr size_t ROW_identifier = 1;
410 constexpr size_t ROW_rdo_w1 = 3;
411 constexpr size_t ROW_rdo_w2 = 5;
412 constexpr size_t ROW_rdo_w3 = 7;
413 constexpr size_t ROW_rdo_w4 = 9;
414 constexpr size_t ROW_localX = 11;
415 constexpr size_t ROW_localY = 12;
416 constexpr size_t ROW_covXX = 13;
417 constexpr size_t ROW_covYY = 14;
418 constexpr size_t ROW_gpX = 15;
419 constexpr size_t ROW_gpY = 16;
420 constexpr size_t ROW_gpZ = 17;
421 constexpr size_t ROW_channelsPhi = 18;
422 constexpr size_t ROW_channelsEta = 19;
423 constexpr size_t ROW_widthEta = 20;
424 constexpr size_t ROW_totalToT = 21;
447 auto totalToTSpan = totalToTAcc.
getDataSpan(*pixelCl);
448 auto channelsPhiSpan = channelsPhiAcc.
getDataSpan(*pixelCl);
449 auto channelsEtaSpan = channelsEtaAcc.
getDataSpan(*pixelCl);
450 auto widthEtaSpan = widthEtaAcc.
getDataSpan(*pixelCl);
451 auto rdoSpan =
rdoListAcc.getDataSpan(*pixelCl);
458 for (
size_t i = 0; i < nClusters; ++i) {
460 idHashSpan[i] =
static_cast<unsigned int>(load_u32(ROW_idHash, i));
461 idSpan[i] =
static_cast<unsigned long long>(load_u64(ROW_identifier, i));
464 locPosSpan[i][0] = load_f32(ROW_localX, i);
465 locPosSpan[i][1] = load_f32(ROW_localY, i);
468 locCovSpan[i][0] = load_f32(ROW_covXX, i);
469 locCovSpan[i][3] = load_f32(ROW_covYY, i);
472 gpSpan[i][0] = load_f32(ROW_gpX, i);
473 gpSpan[i][1] = load_f32(ROW_gpY, i);
474 gpSpan[i][2] = load_f32(ROW_gpZ, i);
477 channelsPhiSpan[i] =
static_cast<int>(load_u32(ROW_channelsPhi, i));
478 channelsEtaSpan[i] =
static_cast<int>(load_u32(ROW_channelsEta, i));
479 widthEtaSpan[i] = load_f32(ROW_widthEta, i);
480 totalToTSpan[i] =
static_cast<int>(load_u32(ROW_totalToT, i));
483 auto& rdoList = rdoSpan[i];
485 uint64_t r1 = load_u64(ROW_rdo_w1, i);
486 uint64_t r2 = load_u64(ROW_rdo_w2, i);
487 uint64_t r3 = load_u64(ROW_rdo_w3, i);
488 uint64_t r4 = load_u64(ROW_rdo_w4, i);
489 if (r1) rdoList.emplace_back(r1);
490 if (r2) rdoList.emplace_back(r2);
491 if (r3) rdoList.emplace_back(r3);
492 if (r4) rdoList.emplace_back(r4);
499 ATH_CHECK(pixelClustersHandle.
record(std::move(pixelCl), std::move(pixelClAux)));
502 return StatusCode::SUCCESS;
506 return StatusCode::SUCCESS;
514 const EventContext &ctx)
const {
524 ATH_MSG_DEBUG(
"You are running the element-wise container creation method.");
528 std::make_unique<xAOD::PixelClusterContainer>(),
529 std::make_unique<xAOD::PixelClusterAuxContainer>()));
534 int rdoIndexCounter = 0;
536 for (
unsigned int i = 0; i < metadata->numOfPixelClusters; i++) {
538 auto pixelCl = pixelClustersHandle->push_back(
539 std::make_unique<xAOD::PixelCluster>());
541 Eigen::Matrix<float, 2, 1> localPosition(
543 Eigen::Matrix<float, 2, 2> localCovariance;
544 localCovariance.setZero();
547 Eigen::Matrix<float, 3, 1> globalPosition(
551 std::vector<Identifier> RDOs;
552 RDOs.reserve(metadata->pcRdoIndex[i]);
554 for (
unsigned int j = 0; j < metadata->pcRdoIndex[i]; ++j) {
558 rdoIndexCounter += metadata->pcRdoIndex[i];
560 pixelCl->setMeasurement<2>(pxAux.
idHash[i], localPosition,
562 pixelCl->setIdentifier(pxAux.
id[i]);
563 pixelCl->setRDOlist(RDOs);
564 pixelCl->globalPosition() = globalPosition;
570 return StatusCode::SUCCESS;
577 ATH_MSG_DEBUG(
"You are running the bulk copy container creation method.");
583 auto pixelCl = std::make_unique<xAOD::PixelClusterContainer>();
584 auto pixelClAux = std::make_unique<xAOD::PixelClusterAuxContainer>();
585 pixelCl->setStore(pixelClAux.get());
589 const size_t nClusters = metadata->numOfPixelClusters;
590 pixelClAux->resize(nClusters);
591 pixelCl->reserve(nClusters);
597 for (
size_t i = 0; i < nClusters; ++i) {
598 pixelCl->push_back(std::make_unique<xAOD::PixelCluster>());
606 std::vector<long unsigned int> identifierBuffer(nClusters);
607 std::vector<unsigned int> idHashBuffer(nClusters);
608 std::vector<std::array<float, 3>> gpBuffer(nClusters);
609 std::vector<float> localPosX(nClusters);
610 std::vector<float> localPosY(nClusters);
611 std::vector<float> localCovXX(nClusters);
612 std::vector<float> localCovYY(nClusters);
613 std::vector<int> totalToTBuffer(nClusters);
614 std::vector<float> widthInEtaBuffer(nClusters);
615 std::vector<int> channelsInPhiBuffer(nClusters);
616 std::vector<int> channelsInEtaBuffer(nClusters);
618 for (
size_t i = 0; i < nClusters; ++i) {
621 identifierBuffer[i] = pxAux.
id[i];
624 idHashBuffer[i] = pxAux.
idHash[i];
642 totalToTBuffer[i] = pxAux.
totalToT[i];
676 auto locPosXSpan = localPosXAcc.
getDataSpan(*pixelCl);
677 auto locPosYSpan = localPosYAcc.
getDataSpan(*pixelCl);
678 auto locCovXXSpan = localCovXXAcc.
getDataSpan(*pixelCl);
679 auto locCovYYSpan = localCovYYAcc.
getDataSpan(*pixelCl);
683 auto channelsInPhiSpan = channelsInPhiAcc.
getDataSpan(*pixelCl);
684 auto channelsInEtaSpan = channelsInEtaAcc.
getDataSpan(*pixelCl);
707 auto rdoSpan =
rdoListAcc.getDataSpan(*pixelCl);
709 int rdoIndexCounter = 0;
711 for (
size_t i = 0; i < nClusters; ++i) {
712 size_t nRDOs = metadata->pcRdoIndex[i];
715 std::vector<unsigned long long> &rdosForThisCluster = rdoSpan[i];
718 rdosForThisCluster.resize(nRDOs);
721 for (
size_t j = 0; j < nRDOs; ++j) {
722 rdosForThisCluster[j] = pxAux.
rdoList[rdoIndexCounter + j];
724 rdoIndexCounter += nRDOs;
731 ATH_CHECK(pixelClustersHandle.
record(std::move(pixelCl), std::move(pixelClAux)));
734 return StatusCode::SUCCESS;