File indexing completed on 2025-08-06 08:18:11
0001
0002
0003
0004
0005
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
0022 for (auto&& [key, clus_vector] : m_clusmap)
0023 {
0024 for (auto&& cluster : clus_vector)
0025 {
0026 delete cluster;
0027 }
0028 }
0029
0030
0031
0032 {
0033 std::map<TrkrDefs::hitsetkey, Vector> empty;
0034 m_clusmap.swap(empty);
0035 }
0036
0037
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
0071 const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0072
0073
0074 auto iter = m_clusmap.find(hitsetkey);
0075 if (iter != m_clusmap.end())
0076 {
0077
0078 auto& clus_vector = iter->second;
0079
0080
0081 const auto index = TrkrDefs::getClusIndex(key);
0082
0083
0084 if (index < clus_vector.size())
0085 {
0086
0087 delete clus_vector[index];
0088 clus_vector[index] = nullptr;
0089 }
0090 }
0091 }
0092
0093
0094 void TrkrClusterContainerv4::removeClusters(TrkrDefs::hitsetkey hitsetkey)
0095 {
0096
0097 auto iter = m_clusmap.find(hitsetkey);
0098
0099
0100 if( iter == m_clusmap.end() ) { return; }
0101
0102
0103 for( auto&& cluster:iter->second)
0104 { delete cluster; }
0105
0106
0107 m_clusmap.erase(iter);
0108 }
0109
0110
0111 void TrkrClusterContainerv4::addClusterSpecifyKey(const TrkrDefs::cluskey key, TrkrCluster* newclus)
0112 {
0113
0114 const TrkrDefs::hitsetkey hitsetkey = TrkrDefs::getHitSetKeyFromClusKey(key);
0115
0116
0117 auto& clus_vector = m_clusmap[hitsetkey];
0118
0119
0120 const auto index = TrkrDefs::getClusIndex(key);
0121
0122
0123 if (index < clus_vector.size())
0124 {
0125
0126
0127
0128
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
0143 clus_vector.push_back(newclus);
0144 }
0145 else
0146 {
0147
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
0166 {
0167 Map empty;
0168 m_tmpmap.swap(empty);
0169 }
0170
0171
0172 const auto iter = m_clusmap.find(hitsetkey);
0173 if (iter != m_clusmap.end())
0174 {
0175
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
0183 const auto ckey = TrkrDefs::genClusKey(hitsetkey, index);
0184
0185
0186 m_tmpmap.insert(m_tmpmap.end(), std::make_pair(ckey, cluster));
0187 }
0188 }
0189 }
0190
0191
0192 return std::make_pair(m_tmpmap.cbegin(), m_tmpmap.cend());
0193 }
0194
0195
0196 TrkrCluster* TrkrClusterContainerv4::findCluster(TrkrDefs::cluskey key) const
0197 {
0198
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
0205 const auto& clus_vector = map_iter->second;
0206
0207
0208 const auto index = TrkrDefs::getClusIndex(key);
0209
0210
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
0242 const TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid);
0243 const TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid);
0244
0245
0246 const auto begin = m_clusmap.lower_bound(keylo);
0247 const auto end = m_clusmap.upper_bound(keyhi);
0248
0249
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
0263 TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid, layer);
0264 TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid, layer);
0265
0266
0267 const auto begin = m_clusmap.lower_bound(keylo);
0268 const auto end = m_clusmap.upper_bound(keyhi);
0269
0270
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 }