21 ATH_CHECK(m_truthSegmentKey.initialize(m_isMC));
29 m_recoSegs = std::make_unique<SegmentVariables>(m_tree, m_recoSegmentKey.key(),
"Segments", msgLevel());
33 return m_segSelector->passSeedingQuality(Gaudi::Hive::currentContext(),
38 return m_segSelector->passTrackQuality(Gaudi::Hive::currentContext(),
47 const unsigned linkIdx = truthS ? m_truthSegs->push_back(*truthS) : -1;
50 m_truthSegToRecoLink.push_back(linkIdx, m_recoSegs->push_back(*seg));
54 m_truthMuRecoSegLinks[m_truthTrks->find(
truthMuon)].push_back(m_recoSegs->push_back(*seg));
60 m_truthSegs = std::make_unique<SegmentVariables>(m_tree, m_truthSegmentKey.key(),
"TruthSegments", msgLevel());
66 m_truthTrks->push_back(truthP);
67 unsigned short linkIdx = m_truthTrks->find(truthP);
73 return std::abs(expressAtRefPlane(*seg,
Location::Barrel)) < m_refEndcapDiscZ;
79 return std::abs(expressAtRefPlane(*seg,
Location::Endcap)) < m_refEndcapDiscR;
81 m_tree.addBranch(m_truthSegs);
83 m_truthTrks = std::make_unique<IParticleFourMomBranch>(m_tree,
"TruthMuons");
84 m_tree.addBranch(m_truthTrks);
85 m_trkTruthLinks.emplace_back(m_truthSegmentKey,
"truthParticleLink");
86 m_trkTruthLinks.emplace_back(m_truthKey,
"truthSegmentLinks");
87 m_trkTruthLinks.emplace_back(m_recoSegmentKey,
"truthSegmentLink");
90 m_tree.addBranch(m_recoSegs);
91 m_tree.addBranch(std::make_unique<EventInfoBranch>(m_tree, evOpts));
95 return StatusCode::SUCCESS;
98 const EventContext& ctx{Gaudi::Hive::currentContext()};
103 std::map<const xAOD::TruthParticle*, std::vector<unsigned>> truthToSeedMatchCounter{};
105 unsigned int seedIdx = m_seedPos.size();
106 m_seedPos += seed.position();
107 m_seedType+=
static_cast<char>(seed.location());
110 m_seedRecoSegMatch[seedIdx].push_back(m_recoSegs->push_back(*seg));
115 const double projected = expressAtRefPlane(*seg, seed.location());
116 const double theta = seg->direction().theta();
119 minTheta =
std::min(minTheta, theta);
120 maxTheta =
std::max(maxTheta, theta);
123 if (seedIdx >= matchCounter.size()) matchCounter.resize(seedIdx +1);
124 ++matchCounter[seedIdx];
126 m_seedLength+=(maxL - minL);
127 m_seedThetaCone+=(maxTheta - minTheta);
133 m_recoSegs->push_back(*seg);
140 m_truthSegs->push_back(*seg);
142 if (truthSegs->size()) {
143 m_truthSegToRecoLink[truthSegs->size()-1];
149 if (truthMuons && truthMuons->size()) {
150 m_truthMuToSeedIdx[truthMuons->size() -1];
151 m_truthMuToSeedCounter[truthMuons->size() -1];
152 m_truthMuTruthSegLinks[truthMuons->size() -1];
153 m_truthMuRecoSegLinks[truthMuons->size() -1];
156 m_truthTrks->push_back(*truth);
157 unsigned truthIdx = m_truthTrks->find(truth);
158 std::vector<unsigned>& matchCounter = truthToSeedMatchCounter[truth];
161 while ( (maxSeed = std::ranges::max_element(matchCounter))!=matchCounter.end() && (*maxSeed) > 0) {
162 m_truthMuToSeedIdx[truthIdx].push_back(
std::distance(matchCounter.begin(), maxSeed));
163 m_truthMuToSeedCounter[truthIdx].push_back(*maxSeed);
167 std::vector<unsigned short>& truthSegLinks = m_truthMuTruthSegLinks[truthIdx];
168 for (
const SegLink_t& link : acc_truthSegLinks(*truth)) {
169 truthSegLinks.push_back(m_truthSegs->push_back(**link));
174 return StatusCode::SUCCESS;
187 lambda = Amg::intersect<2>(projPos, projDir, Amg::Vector2D::UnitX(),
188 m_refBarrelR).value_or(0.);
190 lambda = Amg::intersect<2>(projPos, projDir, Amg::Vector2D::UnitY(),
191 (projPos[1] > 0 ? 1. : .1)* m_refEndcapDiscZ).value_or(0.);
199 return StatusCode::SUCCESS;