File indexing completed on 2025-08-06 08:18:11
0001
0002
0003
0004
0005
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
0022 for (auto&& [key, map] : m_clusmap)
0023 {
0024 for (auto&& [cluskey, cluster] : map)
0025 {
0026 delete cluster;
0027 }
0028 }
0029
0030
0031
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
0060 const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0061
0062
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
0076 const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0077
0078
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
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
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
0145 const TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid);
0146 const TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid);
0147
0148
0149 const auto begin = m_clusmap.lower_bound(keylo);
0150 const auto end = m_clusmap.upper_bound(keyhi);
0151
0152
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
0166 TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid, layer);
0167 TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid, layer);
0168
0169
0170 const auto begin = m_clusmap.lower_bound(keylo);
0171 const auto end = m_clusmap.upper_bound(keyhi);
0172
0173
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 }