File indexing completed on 2025-12-16 09:21:49
0001 #include "TrackClusEvaluator.h"
0002 #include "ClusKeyIter.h"
0003 #include "TrkrClusterIsMatcher.h"
0004 #include "g4evalfn.h"
0005
0006 #include <g4tracking/TrkrTruthTrack.h>
0007
0008 #include <trackbase/TrkrCluster.h>
0009 #include <trackbase/TrkrClusterContainer.h>
0010 #include <trackbase_historic/SvtxTrack.h>
0011
0012 #include <phool/phool.h>
0013 #include <numeric>
0014
0015 TrkrClusterContainer* TrackClusEvaluator::get_PHG4_clusters() const
0016 {
0017 if (ismatcher == nullptr)
0018 {
0019 return nullptr;
0020 }
0021
0022 return ismatcher->m_TruthClusters;
0023 }
0024
0025 TrkrClusterContainer* TrackClusEvaluator::get_SVTX_clusters() const
0026 {
0027 if (ismatcher == nullptr)
0028 {
0029 return nullptr;
0030 }
0031
0032 return ismatcher->m_RecoClusters;
0033 }
0034
0035 std::array<int, 5> TrackClusEvaluator::cntclus(Vector& keys)
0036 {
0037 std::array<int, 5> cnt{0, 0, 0, 0, 0};
0038 for (auto& it : keys)
0039 {
0040 cnt[g4evalfn::trklayer_det(it.first)] += 1;
0041 }
0042 for (int i = 0; i < 4; ++i)
0043 {
0044 cnt[4] += cnt[i];
0045 }
0046 return cnt;
0047 }
0048
0049 int TrackClusEvaluator::addClusKeys(SvtxTrack* track)
0050 {
0051 svtx_keys.clear();
0052 for (auto ckey : ClusKeyIter(track))
0053 {
0054 svtx_keys.emplace_back(TrkrDefs::getHitSetKeyFromClusKey(ckey), ckey);
0055 }
0056 std::sort(svtx_keys.begin(), svtx_keys.end());
0057 return svtx_keys.size();
0058 }
0059
0060 std::array<int, 5> TrackClusEvaluator::cnt_matchedclus(Vector& keys, std::vector<bool>& matches)
0061 {
0062 std::array<int, 5> cnt{0, 0, 0, 0, 0};
0063 if (keys.size() != matches.size())
0064 {
0065 std::cout << PHWHERE << " matching and key vector not the same size. "
0066 << std::endl
0067 << " run find_matches() first." << std::endl;
0068 return cnt;
0069 }
0070 for (unsigned int i = 0; i < keys.size(); ++i)
0071 {
0072 if (matches[i])
0073 {
0074 cnt[g4evalfn::trklayer_det(keys[i].first)] += 1;
0075 }
0076 }
0077 for (int i = 0; i < 4; ++i)
0078 {
0079 cnt[4] += cnt[i];
0080 }
0081 return cnt;
0082 }
0083
0084 int TrackClusEvaluator::addClusKeys(TrkrTruthTrack* track)
0085 {
0086 phg4_keys.clear();
0087 for (auto ckey : track->getClusters())
0088 {
0089 phg4_keys.emplace_back(TrkrDefs::getHitSetKeyFromClusKey(ckey), ckey);
0090 }
0091 std::sort(phg4_keys.begin(), phg4_keys.end());
0092 return phg4_keys.size();
0093 }
0094
0095 void TrackClusEvaluator::reset()
0096 {
0097 phg4_keys.clear();
0098 phg4_matches.clear();
0099 svtx_keys.clear();
0100 svtx_matches.clear();
0101 }
0102
0103 std::array<int, 3> TrackClusEvaluator::find_matches()
0104 {
0105 if (ismatcher == nullptr)
0106 {
0107 std::cout << PHWHERE
0108 << " Won't compare tracks because of missing TrkrClusterIsMatcher" << std::endl;
0109 return {0, 0, 0};
0110 }
0111
0112
0113
0114
0115
0116
0117 auto& vA = phg4_keys;
0118 auto& vB = svtx_keys;
0119
0120 auto& matchesA = phg4_matches;
0121 auto& matchesB = svtx_matches;
0122
0123 match_stat = 0.;
0124
0125
0126 matchesA = std::vector<bool>(vA.size(), false);
0127 matchesB = std::vector<bool>(vB.size(), false);
0128
0129
0130 auto iA0 = vA.begin();
0131 auto iA1 = vA.end();
0132
0133 auto iB0 = vB.begin();
0134 auto iB1 = vB.end();
0135
0136 auto iA = iA0;
0137 auto iB = iB0;
0138
0139 int n_match{0};
0140
0141 while (iA != iA1 && iB != iB1)
0142 {
0143 if (iA->first == iB->first)
0144 {
0145 auto hitset = iA->first;
0146
0147
0148 auto sAend = iA + 1;
0149 while (sAend != iA1 && sAend->first == hitset)
0150 {
0151 ++sAend;
0152 }
0153
0154 auto sBend = iB + 1;
0155 while (sBend != iB1 && sBend->first == hitset)
0156 {
0157 ++sBend;
0158 }
0159
0160 for (auto A_iter = iA; A_iter != sAend; ++A_iter)
0161 {
0162 for (auto B_iter = iB; B_iter != sBend; ++B_iter)
0163 {
0164 auto is_match = ismatcher->operator()(A_iter->second, B_iter->second);
0165 if (is_match)
0166 {
0167 matchesA[A_iter - iA0] = true;
0168 matchesB[B_iter - iB0] = true;
0169 if (collect_match_statistic)
0170 {
0171 match_stat += g4evalfn::calc_match_statistic(ismatcher, A_iter->second, B_iter->second);
0172 }
0173 ++n_match;
0174 }
0175 }
0176 }
0177 iA = sAend;
0178 iB = sBend;
0179 }
0180 else if (iA->first < iB->first)
0181 {
0182 ++iA;
0183 }
0184 else
0185 {
0186 ++iB;
0187 }
0188 }
0189 return {n_match, (int) phg4_keys.size(), (int) svtx_keys.size()};
0190 }
0191
0192 std::array<int, 3> TrackClusEvaluator::find_matches(TrkrTruthTrack* g4_track, SvtxTrack* sv_track)
0193 {
0194 addClusKeys(sv_track);
0195 addClusKeys(g4_track);
0196 return find_matches();
0197 }
0198
0199 int TrackClusEvaluator::phg4_n_matched()
0200 {
0201 return std::accumulate(phg4_matches.begin(), phg4_matches.end(), 0);
0202 }
0203
0204 int TrackClusEvaluator::svtx_n_matched()
0205 {
0206 return std::accumulate(svtx_matches.begin(), svtx_matches.end(), 0);
0207 }
0208
0209 std::vector<TrkrClusLoc> TrackClusEvaluator::phg4_clusloc_all()
0210 {
0211 std::vector<TrkrClusLoc> vec{};
0212 for (auto& cluspair : phg4_keys)
0213 {
0214 vec.push_back(g4evalfn::clusloc_PHG4(ismatcher, cluspair.second));
0215 }
0216 return vec;
0217 }
0218
0219 std::vector<TrkrClusLoc> TrackClusEvaluator::phg4_clusloc_unmatched()
0220 {
0221 std::vector<TrkrClusLoc> vec{};
0222 auto cnt = phg4_keys.size();
0223 for (unsigned int i = 0; i < cnt; ++i)
0224 {
0225 if (!phg4_matches[i])
0226 {
0227 vec.push_back(g4evalfn::clusloc_PHG4(ismatcher, phg4_keys[i].second));
0228 }
0229 }
0230 return vec;
0231 }
0232
0233 std::vector<TrkrClusLoc> TrackClusEvaluator::svtx_clusloc_all()
0234 {
0235 std::vector<TrkrClusLoc> vec{};
0236 for (auto& cluspair : svtx_keys)
0237 {
0238 vec.push_back(g4evalfn::clusloc_SVTX(ismatcher, cluspair.second));
0239 }
0240 return vec;
0241 }
0242
0243 std::vector<TrkrClusLoc> TrackClusEvaluator::svtx_clusloc_unmatched()
0244 {
0245 std::vector<TrkrClusLoc> vec{};
0246 auto cnt = svtx_keys.size();
0247 for (unsigned int i = 0; i < cnt; ++i)
0248 {
0249 if (!svtx_matches[i])
0250 {
0251 vec.push_back(g4evalfn::clusloc_SVTX(ismatcher, svtx_keys[i].second));
0252 }
0253 }
0254 return vec;
0255 }
0256
0257 std::vector<TrkrClusLoc> TrackClusEvaluator::clusloc_matched()
0258 {
0259 std::vector<TrkrClusLoc> vec{};
0260 auto cnt = phg4_keys.size();
0261 for (unsigned int i = 0; i < cnt; ++i)
0262 {
0263 if (phg4_matches[i])
0264 {
0265 vec.push_back(g4evalfn::clusloc_PHG4(ismatcher, phg4_keys[i].second));
0266 }
0267 }
0268 return vec;
0269 }