File indexing completed on 2025-12-16 09:20:36
0001
0002
0003
0004
0005
0006
0007 #include "TrkrHitSetContainerv2.h"
0008
0009 #include "TrkrDefs.h"
0010 #include "TrkrHitSetv1.h"
0011
0012 #include <TClass.h>
0013
0014 #include <cassert>
0015 #include <cstdlib>
0016
0017 TrkrHitSetContainerv2::
0018 TrkrHitSetContainerv2(const std::string& hitsetclass, const size_t estimated_size)
0019 : m_hitArray(hitsetclass.c_str(), estimated_size)
0020 {
0021 }
0022
0023 void TrkrHitSetContainerv2::Reset()
0024 {
0025
0026 m_hitmap.clear();
0027
0028
0029
0030
0031 Int_t n = m_hitArray.GetEntriesFast();
0032 for (Int_t i = 0; i < n; i++) {
0033 TObject *obj = m_hitArray.UncheckedAt(i);
0034 if (obj) {
0035 obj->Clear();
0036 obj->ResetBit( kHasUUID );
0037 obj->ResetBit( kIsReferenced );
0038 obj->SetUniqueID( 0 );
0039 }
0040 }
0041
0042
0043
0044 }
0045
0046 void TrkrHitSetContainerv2::identify(std::ostream& os) const
0047 {
0048 syncMapArray();
0049
0050 os << "TrkrHitSetContainerv2 with class "
0051 << m_hitArray.GetClass()->GetName()
0052 << ": Number of hits: " << size() << " index map size = " << m_hitmap.size() << std::endl;
0053 ConstIterator iter;
0054 for (const auto& pair : m_hitmap)
0055 {
0056 int layer = TrkrDefs::getLayer(pair.first);
0057 os << "hitsetkey " << pair.first << " layer " << layer << std::endl;
0058 pair.second->identify();
0059 }
0060 return;
0061 }
0062
0063 TrkrHitSetContainerv2::ConstIterator
0064 TrkrHitSetContainerv2::addHitSet(TrkrHitSet* newhit)
0065 {
0066 std::cout << __PRETTY_FUNCTION__
0067 << " : deprecated. Use findOrAddHitSet()." << std::endl;
0068 return addHitSetSpecifyKey(newhit->getHitSetKey(), newhit);
0069 }
0070
0071 TrkrHitSetContainerv2::ConstIterator
0072 TrkrHitSetContainerv2::addHitSetSpecifyKey(const TrkrDefs::hitsetkey key, TrkrHitSet* newhit)
0073 {
0074 std::cout << __PRETTY_FUNCTION__
0075 << " : deprecated. Use findOrAddHitSet()." << std::endl;
0076
0077 exit(1);
0078
0079 return TrkrHitSetContainer::addHitSetSpecifyKey(key, newhit);
0080 }
0081
0082 void TrkrHitSetContainerv2::removeHitSet(TrkrDefs::hitsetkey )
0083 {
0084 std::cout << __PRETTY_FUNCTION__
0085 << " : deprecated. This function still works but slows down operation." << std::endl;
0086
0087 exit(1);
0088 }
0089
0090 void TrkrHitSetContainerv2::removeHitSet(TrkrHitSet* hitset)
0091 {
0092 removeHitSet(hitset->getHitSetKey());
0093 }
0094
0095 TrkrHitSetContainerv2::ConstRange
0096 TrkrHitSetContainerv2::getHitSets(const TrkrDefs::TrkrId trackerid) const
0097 {
0098 syncMapArray();
0099 const TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid);
0100 const TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid);
0101 return std::make_pair(m_hitmap.lower_bound(keylo), m_hitmap.upper_bound(keyhi));
0102 }
0103
0104 TrkrHitSetContainerv2::ConstRange
0105 TrkrHitSetContainerv2::getHitSets(const TrkrDefs::TrkrId trackerid, const uint8_t layer) const
0106 {
0107 syncMapArray();
0108 TrkrDefs::hitsetkey keylo = TrkrDefs::getHitSetKeyLo(trackerid, layer);
0109 TrkrDefs::hitsetkey keyhi = TrkrDefs::getHitSetKeyHi(trackerid, layer);
0110 return std::make_pair(m_hitmap.lower_bound(keylo), m_hitmap.upper_bound(keyhi));
0111 }
0112
0113 TrkrHitSetContainerv2::ConstRange
0114 TrkrHitSetContainerv2::getHitSets() const
0115 {
0116 syncMapArray();
0117 return std::make_pair(m_hitmap.cbegin(), m_hitmap.cend());
0118 }
0119
0120 TrkrHitSetContainerv2::Iterator
0121 TrkrHitSetContainerv2::findOrAddHitSet(TrkrDefs::hitsetkey key)
0122 {
0123 syncMapArray();
0124 auto it = m_hitmap.lower_bound(key);
0125 if (it == m_hitmap.end() || (key < it->first))
0126 {
0127 TrkrHitSet* hitset = (TrkrHitSet*) m_hitArray.ConstructedAt(m_hitArray.GetLast() + 1);
0128 assert(hitset);
0129 hitset -> setHitSetKey(key);
0130 it = m_hitmap.insert(it, std::make_pair(key, hitset));
0131 }
0132 return it;
0133 }
0134
0135 TrkrHitSet*
0136 TrkrHitSetContainerv2::findHitSet(TrkrDefs::hitsetkey key)
0137 {
0138 syncMapArray();
0139 auto it = m_hitmap.find(key);
0140 if (it != m_hitmap.end())
0141 {
0142 return it->second;
0143 }
0144 else
0145 {
0146 return nullptr;
0147 }
0148 }
0149
0150 void TrkrHitSetContainerv2::syncMapArray(void) const
0151 {
0152 if (m_hitmap.size() == (size_t) size()) return;
0153
0154 if (m_hitmap.size() > 0)
0155 {
0156 std::cout
0157 << __PRETTY_FUNCTION__ << " Error: m_hitmap and m_hitArray get out of sync, which should not happen unless DST readback. "
0158 << " size() = " << size()
0159 << " m_hitmap.size( ) = " << m_hitmap.size()
0160 << " m_hitArray.GetSize() = " << m_hitArray.GetSize()
0161 << " m_hitArray.GetLast() = " << m_hitArray.GetLast()
0162 << " m_hitArray.GetEntries() = " << m_hitArray.GetEntries()
0163 << std::endl;
0164
0165 assert(m_hitmap.size() == 0);
0166 }
0167
0168 for (unsigned int i = 0; i < size(); ++i)
0169 {
0170 TrkrHitSet* hitset = dynamic_cast<TrkrHitSet*>(m_hitArray[i]);
0171
0172 if (hitset == nullptr)
0173 {
0174 std::cout << __PRETTY_FUNCTION__ << " : fatal error, invalid hitset in m_hitArray at position " << i << ". "
0175 << " size() = " << size()
0176 << " m_hitmap.size( ) = " << m_hitmap.size()
0177 << " m_hitArray.GetSize() = " << m_hitArray.GetSize()
0178 << " m_hitArray.GetLast() = " << m_hitArray.GetLast()
0179 << " m_hitArray.GetEntries() = " << m_hitArray.GetEntries()
0180 << std::endl;
0181 assert(hitset);
0182 }
0183 else
0184 m_hitmap[hitset->getHitSetKey()] = hitset;
0185 }
0186 }