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