Back to home page

sPhenix code displayed by LXR

 
 

    


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

0001 /**
0002  * @file trackbase/TrkrClusterContainerv4.cc
0003  * @author D. McGlinchey, Hugo Pereira Da Costa
0004  * @date June 2018
0005  * @brief Implementation of TrkrClusterContainerv4
0006  */
0007 #include "TrkrClusterContainerv4.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 TrkrClusterContainerv4::Reset()
0020 {
0021   // delete all clusters
0022   for (auto&& [key, clus_vector] : m_clusmap)
0023   {
0024     for (auto&& cluster : clus_vector)
0025     {
0026       delete cluster;
0027     }
0028   }
0029 
0030   // clear the maps
0031   /* using swap ensures that the memory is properly de-allocated */
0032   {
0033     std::map<TrkrDefs::hitsetkey, Vector> empty;
0034     m_clusmap.swap(empty);
0035   }
0036 
0037   // also clear temporary map
0038   {
0039     Map empty;
0040     m_tmpmap.swap(empty);
0041   }
0042 }
0043 
0044 //_________________________________________________________________
0045 void TrkrClusterContainerv4::identify(std::ostream& os) const
0046 {
0047   os << "-----TrkrClusterContainerv4-----" << std::endl;
0048   os << "Number of clusters: " << size() << std::endl;
0049 
0050   for (const auto& [hitsetkey, clus_vector] : m_clusmap)
0051   {
0052     const unsigned int layer = TrkrDefs::getLayer(hitsetkey);
0053     os << "layer: " << layer << " hitsetkey: " << hitsetkey << std::endl;
0054 
0055     for (const auto& cluster : clus_vector)
0056     {
0057       if (cluster)
0058       {
0059         cluster->identify(os);
0060       }
0061     }
0062   }
0063 
0064   os << "------------------------------" << std::endl;
0065 }
0066 
0067 //_________________________________________________________________
0068 void TrkrClusterContainerv4::removeCluster(TrkrDefs::cluskey key)
0069 {
0070   // get hitset key from cluster
0071   const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0072 
0073   // find relevant cluster map if any and remove corresponding cluster
0074   auto iter = m_clusmap.find(hitsetkey);
0075   if (iter != m_clusmap.end())
0076   {
0077     // local reference to the vector
0078     auto& clus_vector = iter->second;
0079 
0080     // cluster index in vector
0081     const auto index = TrkrDefs::getClusIndex(key);
0082 
0083     // compare to vector size
0084     if (index < clus_vector.size())
0085     {
0086       // delete corresponding element and set to null
0087       delete clus_vector[index];
0088       clus_vector[index] = nullptr;
0089     }
0090   }
0091 }
0092 
0093 //_________________________________________________________________
0094 void TrkrClusterContainerv4::removeClusters(TrkrDefs::hitsetkey hitsetkey)
0095 {
0096   // find matching vector list
0097   auto iter = m_clusmap.find(hitsetkey);
0098 
0099   // do nothing if not found
0100   if( iter == m_clusmap.end() ) { return; }
0101 
0102   // delete all clusters
0103   for( auto&& cluster:iter->second)
0104   { delete cluster; }
0105 
0106   // remove from map
0107   m_clusmap.erase(iter);
0108 }
0109 
0110 //_________________________________________________________________
0111 void TrkrClusterContainerv4::addClusterSpecifyKey(const TrkrDefs::cluskey key, TrkrCluster* newclus)
0112 {
0113   // get hitsetkey from cluster
0114   const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0115 
0116   // find relevant vector or create one if not found
0117   auto& clus_vector = m_clusmap[hitsetkey];
0118 
0119   // get cluster index in vector
0120   const auto index = TrkrDefs::getClusIndex(key);
0121 
0122   // compare index to vector size
0123   if (index < clus_vector.size())
0124   {
0125     /*
0126      * if index is already contained in vector, check corresponding element
0127      * and assign newclus if null
0128      * print error message and exit otherwise
0129      */
0130     if (!clus_vector[index])
0131     {
0132       clus_vector[index] = newclus;
0133     }
0134     else
0135     {
0136       std::cout << "TrkrClusterContainerv4::AddClusterSpecifyKey: duplicate key: " << key << " exiting now" << std::endl;
0137       exit(1);
0138     }
0139   }
0140   else if (index == clus_vector.size())
0141   {
0142     // if index matches the vector size, just push back the new cluster
0143     clus_vector.push_back(newclus);
0144   }
0145   else
0146   {
0147     // if index exceeds the vector size, resize cluster to the right size with nullptr, and assign
0148     clus_vector.resize(index + 1, nullptr);
0149     clus_vector[index] = newclus;
0150   }
0151 }
0152 
0153 TrkrClusterContainerv4::ConstRange
0154 TrkrClusterContainerv4::getClusters() const
0155 {
0156   std::cout << "deprecated function in TrkrClusterContainerv4, user getClusters(TrkrDefs:hitsetkey)"
0157             << std::endl;
0158   return std::make_pair(dummy_map.begin(), dummy_map.begin());
0159 }
0160 
0161 //_________________________________________________________________
0162 TrkrClusterContainerv4::ConstRange
0163 TrkrClusterContainerv4::getClusters(TrkrDefs::hitsetkey hitsetkey)
0164 {
0165   // clear temporary map
0166   {
0167     Map empty;
0168     m_tmpmap.swap(empty);
0169   }
0170 
0171   // find relevant vector
0172   const auto iter = m_clusmap.find(hitsetkey);
0173   if (iter != m_clusmap.end())
0174   {
0175     // copy content in temporary map
0176     const auto& clusters = iter->second;
0177     for (size_t index = 0; index < clusters.size(); ++index)
0178     {
0179       const auto& cluster = clusters[index];
0180       if (cluster)
0181       {
0182         // generate cluster key from hitset and index
0183         const auto ckey = TrkrDefs::genClusKey(hitsetkey, index);
0184 
0185         // insert in map
0186         m_tmpmap.insert(m_tmpmap.end(), std::make_pair(ckey, cluster));
0187       }
0188     }
0189   }
0190 
0191   // return temporary map range
0192   return std::make_pair(m_tmpmap.cbegin(), m_tmpmap.cend());
0193 }
0194 
0195 //_________________________________________________________________
0196 TrkrCluster* TrkrClusterContainerv4::findCluster(TrkrDefs::cluskey key) const
0197 {
0198   // get hitsetkey from cluster
0199   const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0200 
0201   const auto map_iter = m_clusmap.find(hitsetkey);
0202   if (map_iter != m_clusmap.end())
0203   {
0204     // local reference to vector
0205     const auto& clus_vector = map_iter->second;
0206 
0207     // get cluster position in vector
0208     const auto index = TrkrDefs::getClusIndex(key);
0209 
0210     // compare to vector size
0211     if (index < clus_vector.size())
0212     {
0213       return clus_vector[index];
0214     }
0215     else
0216     {
0217       return nullptr;
0218     }
0219   }
0220   else
0221   {
0222     return nullptr;
0223   }
0224 }
0225 
0226 //_________________________________________________________________
0227 TrkrClusterContainer::HitSetKeyList TrkrClusterContainerv4::getHitSetKeys() const
0228 {
0229   HitSetKeyList out;
0230   out.reserve(m_clusmap.size());
0231   std::transform(
0232       m_clusmap.begin(), m_clusmap.end(), std::back_inserter(out),
0233       [](const std::pair<TrkrDefs::hitsetkey, Vector>& pair)
0234       { return pair.first; });
0235   return out;
0236 }
0237 
0238 //_________________________________________________________________
0239 TrkrClusterContainer::HitSetKeyList TrkrClusterContainerv4::getHitSetKeys(const TrkrDefs::TrkrId trackerid) const
0240 {
0241   /* copy the logic from TrkrHitSetContainerv1::getHitSets */
0242   const TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid);
0243   const TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid);
0244 
0245   // get relevant range in map
0246   const auto begin = m_clusmap.lower_bound(keylo);
0247   const auto end = m_clusmap.upper_bound(keyhi);
0248 
0249   // transform to a vector
0250   HitSetKeyList out;
0251   out.reserve(m_clusmap.size());
0252   std::transform(
0253       begin, end, std::back_inserter(out),
0254       [](const std::pair<TrkrDefs::hitsetkey, Vector>& pair)
0255       { return pair.first; });
0256   return out;
0257 }
0258 
0259 //_________________________________________________________________
0260 TrkrClusterContainer::HitSetKeyList TrkrClusterContainerv4::getHitSetKeys(const TrkrDefs::TrkrId trackerid, const uint8_t layer) const
0261 {
0262   /* copy the logic from TrkrHitSetContainerv1::getHitSets */
0263   TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid, layer);
0264   TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid, layer);
0265 
0266   // get relevant range in map
0267   const auto begin = m_clusmap.lower_bound(keylo);
0268   const auto end = m_clusmap.upper_bound(keyhi);
0269 
0270   // transform to a vector
0271   HitSetKeyList out;
0272   out.reserve(m_clusmap.size());
0273   std::transform(
0274       begin, end, std::back_inserter(out),
0275       [](const std::pair<TrkrDefs::hitsetkey, Vector>& pair)
0276       { return pair.first; });
0277   return out;
0278 }
0279 
0280 //_________________________________________________________________
0281 unsigned int TrkrClusterContainerv4::size() const
0282 {
0283   unsigned int size = 0;
0284   for (const auto& [hitsetkey, clus_vector] : m_clusmap)
0285   {
0286     size += std::count_if(clus_vector.begin(), clus_vector.end(), [](TrkrCluster* cluster)
0287                           { return cluster; });
0288   }
0289   return size;
0290 }