26 return StatusCode::SUCCESS;
34 return StatusCode::SUCCESS;
42 using PrdType =
typename ContType::const_value_type;
43 using PrdVec = std::vector<PrdType>;
47 for (
const PrdType prd : *readHandle) {
48 fillContainer[prd->readoutElement()->getChamber()].etaHits.emplace_back(*gctx, prd,
nullptr);
52 using EtaPhiHits = std::pair<PrdVec, PrdVec>;
57 using EtaPhiHitsPerChamber = std::array<EtaPhiHits, 6>;
58 std::map<const MuonGMR4::MuonReadoutElement*, EtaPhiHitsPerChamber> collectedPrds{};
59 for (
const PrdType prd : *readHandle) {
60 EtaPhiHitsPerChamber& hitsPerChamb = collectedPrds[prd->readoutElement()];
62 unsigned int gapIdx = prd->gasGap() -1;
65 gapIdx = 2*gapIdx + (prd->doubletPhi() - 1);
70 if (prd->channelType() == sTgcIdHelper::sTgcChannelTypes::Pad) {
71 fillContainer[prd->readoutElement()->getChamber()].etaHits.emplace_back(*gctx, prd,
nullptr);
74 measPhi = prd->channelType() == sTgcIdHelper::sTgcChannelTypes::Wire;
76 measPhi = prd->measuresPhi();
78 EtaPhiHits& hitsPerLayer = hitsPerChamb[gapIdx];
80 hitsPerLayer.first.push_back(prd);
82 hitsPerLayer.second.push_back(prd);
86 for (
auto& [reEle, hitsPerChamb] : collectedPrds) {
89 for (
auto& [etaHits, phiHits]: hitsPerChamb) {
91 if (etaHits.empty() || phiHits.empty()) {
92 fillInto.etaHits.reserve(fillInto.etaHits.size() + etaHits.size());
93 fillInto.phiHits.reserve(fillInto.phiHits.size() + phiHits.size());
94 for (
const PrdType etaPrd : etaHits) {
95 fillInto.etaHits.emplace_back(*gctx, etaPrd);
97 for (
const PrdType phiPrd : phiHits) {
98 fillInto.phiHits.emplace_back(*gctx, phiPrd);
103 fillInto.etaHits.reserve(fillInto.etaHits.size() + etaHits.size() * phiHits.size());
104 for (
const PrdType etaPrd : etaHits) {
105 for (
const PrdType phiPrd: phiHits) {
106 fillInto.etaHits.emplace_back(*gctx, etaPrd, phiPrd);
112 return StatusCode::SUCCESS;
123 std::unique_ptr<MuonSpacePointContainer> outContainer = std::make_unique<MuonSpacePointContainer>();
125 for (
auto &[
chamber, hitsPerChamber] : preSortedContainer){
130 ATH_CHECK(writeHandle.record(std::move(outContainer)));
131 return StatusCode::SUCCESS;
138 splittedHits.emplace_back();
143 if (bucket.size() > 1)
144 finalContainer.
push_back(std::make_unique<MuonSpacePointBucket>(std::move(bucket)));
149 std::vector<MuonSpacePoint>&& spacePoints,
152 if (spacePoints.empty())
return;
154 const bool defineBuckets = splittedHits[0].empty();
155 const bool hasEtaMeas{spacePoints[0].measuresEta()};
157 auto pointPos = [hasEtaMeas, defineBuckets] (
const MuonSpacePoint&
p) {
158 return hasEtaMeas || !defineBuckets ?
p.positionInChamber().y() :
p.positionInChamber().x();
162 auto channelDir = [hasEtaMeas, defineBuckets, &gctx](
const MuonSpacePoint &
p) {
164 return std::abs(hasEtaMeas || !defineBuckets ?
d.y() :
d.z());
167 std::sort(spacePoints.begin(), spacePoints.end(),
169 return pointPos(a) < pointPos(b);
173 double lastPoint = pointPos(spacePoints[0]);
175 auto newBucket = [
this, &lastPoint, &splittedHits, &pointPos, &channelDir] (
const double currPos) {
176 splittedHits.emplace_back();
177 splittedHits.back().setBucketId(splittedHits.size() -1);
181 for (
const std::shared_ptr<MuonSpacePoint>& pointInBucket : overlap) {
182 const double overlapPos = pointPos(*pointInBucket) + pointInBucket->uncertainty()[1] * channelDir(*pointInBucket);
184 newContainer.push_back(pointInBucket);
187 lastPoint = newContainer.empty() ? currPos : pointPos(**newContainer.begin());
188 overlap.setCoveredRange(pointPos(**overlap.begin()), pointPos(**overlap.rbegin()));
192 const double currPoint = pointPos(toSort);
194 if (!defineBuckets) {
195 std::shared_ptr<MuonSpacePoint> madePoint = std::make_shared<MuonSpacePoint>(std::move(toSort));
197 const double measDir = channelDir(toSort);
198 const double posMin = currPoint - toSort.uncertainty()[1] * measDir;
199 const double posMax = currPoint + toSort.uncertainty()[1] * measDir;
201 if (posMax >= bucket.coveredMin() && bucket.coveredMax() >= posMin) {
202 bucket.push_back(madePoint);
209 newBucket(currPoint);
211 std::shared_ptr<MuonSpacePoint> spacePoint = std::make_shared<MuonSpacePoint>(std::move(toSort));
212 splittedHits.back().emplace_back(spacePoint);
213 if (splittedHits.size() > 1) {
215 const double overlapPos = currPoint - spacePoint->uncertainty()[1] * channelDir(*spacePoint);
217 overlap.push_back(spacePoint);
222 newBucket(pointPos(*lastBucket.back()));
224 splittedHits.pop_back();