Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:18:11

0001 /**
0002  * @file trackbase/TrkrClusterContainerv3.cc
0003  * @author D. McGlinchey, Hugo Pereira Da Costa
0004  * @date June 2018
0005  * @brief Implementation of TrkrClusterContainerv3
0006  */
0007 #include "TrkrClusterContainerv3.h"
0008 #include "TrkrCluster.h"
0009 #include "TrkrDefs.h"
0010 
0011 #include <algorithm>
0012 
0013 namespace
0014 {
0015   TrkrClusterContainer::Map dummy_map;
0016 }
0017 
0018 //_________________________________________________________________
0019 void TrkrClusterContainerv3::Reset()
0020 {
0021   // delete all clusters
0022   for (auto&& [key, map] : m_clusmap)
0023   {
0024     for (auto&& [cluskey, cluster] : map)
0025     {
0026       delete cluster;
0027     }
0028   }
0029 
0030   // clear the maps
0031   /* using swap ensures that the memory is properly de-allocated */
0032   std::map<TrkrDefs::hitsetkey, Map> empty;
0033   m_clusmap.swap(empty);
0034 }
0035 
0036 //_________________________________________________________________
0037 void TrkrClusterContainerv3::identify(std::ostream& os) const
0038 {
0039   os << "-----TrkrClusterContainerv3-----" << std::endl;
0040   os << "Number of clusters: " << size() << std::endl;
0041 
0042   for (const auto& [hitsetkey, map] : m_clusmap)
0043   {
0044     const unsigned int layer = TrkrDefs::getLayer(hitsetkey);
0045     os << "layer: " << layer << " hitsetkey: " << hitsetkey << std::endl;
0046     for (const auto& [cluskey, cluster] : map)
0047     {
0048       os << "clus key " << cluskey << " layer " << TrkrDefs::getLayer(cluskey) << std::endl;
0049       cluster->identify();
0050     }
0051   }
0052 
0053   os << "------------------------------" << std::endl;
0054 }
0055 
0056 //_________________________________________________________________
0057 void TrkrClusterContainerv3::removeCluster(TrkrDefs::cluskey key)
0058 {
0059   // get hitset key from cluster
0060   const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0061 
0062   // find relevant cluster map if any and remove corresponding cluster
0063   auto iter = m_clusmap.find(hitsetkey);
0064   if (iter != m_clusmap.end())
0065   {
0066     TrkrCluster* clus = findCluster(key);
0067     delete clus;
0068     iter->second.erase(key);
0069   }
0070 }
0071 
0072 //_________________________________________________________________
0073 void TrkrClusterContainerv3::addClusterSpecifyKey(const TrkrDefs::cluskey key, TrkrCluster* newclus)
0074 {
0075   // get hitsetkey from cluster
0076   const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0077 
0078   // find relevant cluster map or create one if not found
0079   Map& map = m_clusmap[hitsetkey];
0080   const auto [iter, success] = map.insert(std::make_pair(key, newclus));
0081   if (!success)
0082   {
0083     std::cout << "TrkrClusterContainerv3::AddClusterSpecifyKey: duplicate key: " << key << " exiting now" << std::endl;
0084     exit(1);
0085   }
0086 }
0087 
0088 //_________________________________________________________________
0089 TrkrClusterContainerv3::ConstRange
0090 TrkrClusterContainerv3::getClusters(TrkrDefs::hitsetkey hitsetkey)
0091 {
0092   // find relevant association map
0093   const auto iter = m_clusmap.find(hitsetkey);
0094   if (iter != m_clusmap.end())
0095   {
0096     return std::make_pair(iter->second.cbegin(), iter->second.cend());
0097   }
0098   else
0099   {
0100     return std::make_pair(dummy_map.cbegin(), dummy_map.cend());
0101   }
0102 }
0103 
0104 //_________________________________________________________________
0105 TrkrCluster* TrkrClusterContainerv3::findCluster(TrkrDefs::cluskey key) const
0106 {
0107   // get hitsetkey from cluster
0108   const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0109 
0110   const auto map_iter = m_clusmap.find(hitsetkey);
0111   if (map_iter != m_clusmap.end())
0112   {
0113     const auto clus_iter = map_iter->second.find(key);
0114     if (clus_iter != map_iter->second.end())
0115     {
0116       return clus_iter->second;
0117     }
0118     else
0119     {
0120       return nullptr;
0121     }
0122   }
0123   else
0124   {
0125     return nullptr;
0126   }
0127 }
0128 
0129 //_________________________________________________________________
0130 TrkrClusterContainer::HitSetKeyList TrkrClusterContainerv3::getHitSetKeys() const
0131 {
0132   HitSetKeyList out;
0133   out.reserve(m_clusmap.size());
0134   std::transform(
0135       m_clusmap.begin(), m_clusmap.end(), std::back_inserter(out),
0136       [](const std::pair<TrkrDefs::hitsetkey, Map>& pair)
0137       { return pair.first; });
0138   return out;
0139 }
0140 
0141 //_________________________________________________________________
0142 TrkrClusterContainer::HitSetKeyList TrkrClusterContainerv3::getHitSetKeys(const TrkrDefs::TrkrId trackerid) const
0143 {
0144   /* copy the logic from TrkrHitSetContainerv1::getHitSets */
0145   const TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid);
0146   const TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid);
0147 
0148   // get relevant range in map
0149   const auto begin = m_clusmap.lower_bound(keylo);
0150   const auto end = m_clusmap.upper_bound(keyhi);
0151 
0152   // transform to a vector
0153   HitSetKeyList out;
0154   out.reserve(m_clusmap.size());
0155   std::transform(
0156       begin, end, std::back_inserter(out),
0157       [](const std::pair<TrkrDefs::hitsetkey, Map>& pair)
0158       { return pair.first; });
0159   return out;
0160 }
0161 
0162 //_________________________________________________________________
0163 TrkrClusterContainer::HitSetKeyList TrkrClusterContainerv3::getHitSetKeys(const TrkrDefs::TrkrId trackerid, const uint8_t layer) const
0164 {
0165   /* copy the logic from TrkrHitSetContainerv1::getHitSets */
0166   TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid, layer);
0167   TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid, layer);
0168 
0169   // get relevant range in map
0170   const auto begin = m_clusmap.lower_bound(keylo);
0171   const auto end = m_clusmap.upper_bound(keyhi);
0172 
0173   // transform to a vector
0174   HitSetKeyList out;
0175   out.reserve(m_clusmap.size());
0176   std::transform(
0177       begin, end, std::back_inserter(out),
0178       [](const std::pair<TrkrDefs::hitsetkey, Map>& pair)
0179       { return pair.first; });
0180   return out;
0181 }
0182 
0183 //_________________________________________________________________
0184 unsigned int TrkrClusterContainerv3::size() const
0185 {
0186   unsigned int size = 0;
0187   for (const auto& map_pair : m_clusmap)
0188   {
0189     size += map_pair.second.size();
0190   }
0191 
0192   return size;
0193 }