Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:20:36

0001 /**
0002  * @file trackbase/TrkrHitSetContainerv2.cc
0003  * @author D. McGlinchey, H. PEREIRA DA COSTA
0004  * @date June 2018
0005  * @brief Implementation for TrkrHitSetContainerv2
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   // force rebuild of indexing map
0026   m_hitmap.clear();
0027 
0028   //! fast clear without calling destructor and without marking hitsets removed.
0029   //! This is inspired by but even faster than TClonesArray::Clear()
0030   //! We just reset hitset values and reuse the hitset objects
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   // alternative is to also marking hitset removed, which is not used here but optional for a v3 container
0043   // m_hitArray.Clear("C");
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 }