Back to home page

sPhenix code displayed by LXR

 
 

    


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   // find the matches between the svtx_keys and phg4_keys
0116   // also keep track of the sum of the comparison between then
0117 
0118   // ---------------------------------
0119   // set aliases for notation cleaness
0120   // use A for PHG4 and B for SVTX
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.;  // DEPRECATED
0128 
0129   // matches will say, cluster by cluster, which clusters are matched
0130   matchesA = std::vector<bool>(vA.size(), false);
0131   matchesB = std::vector<bool>(vB.size(), false);
0132 
0133   // user iterators to access the vectors
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       // must compare ALL sets of iA and iB with this same hitset
0152       auto sAend = iA + 1;  // search A end
0153       while (sAend != iA1 && sAend->first == hitset)
0154       {
0155         ++sAend;
0156       }
0157 
0158       auto sBend = iB + 1;  // search B end
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 }