Back to home page

sPhenix code displayed by LXR

 
 

    


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   // find the matches between the svtx_keys and phg4_keys
0112   // also keep track of the sum of the comparison between then
0113 
0114   // ---------------------------------
0115   // set aliases for notation cleaness
0116   // use A for PHG4 and B for SVTX
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.;  // DEPRECATED
0124 
0125   // matches will say, cluster by cluster, which clusters are matched
0126   matchesA = std::vector<bool>(vA.size(), false);
0127   matchesB = std::vector<bool>(vB.size(), false);
0128 
0129   // user iterators to access the vectors
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       // must compare ALL sets of iA and iB with this same hitset
0148       auto sAend = iA + 1;  // search A end
0149       while (sAend != iA1 && sAend->first == hitset)
0150       {
0151         ++sAend;
0152       }
0153 
0154       auto sBend = iB + 1;  // search B end
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 }