Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:17:30

0001 #include "TowerInfoContainerv3.h"
0002 #include "TowerInfov3.h"
0003 
0004 #include <TClonesArray.h>
0005 
0006 #include <cassert>
0007 
0008 TowerInfoContainerv3::TowerInfoContainerv3(DETECTOR detec)
0009   : _detector(detec)
0010 {
0011   int nchannels = 744;
0012   if (_detector == DETECTOR::SEPD)
0013   {
0014     nchannels = 744;
0015   }
0016   else if (_detector == DETECTOR::EMCAL)
0017   {
0018     nchannels = 24576;
0019   }
0020   else if (_detector == DETECTOR::HCAL)
0021   {
0022     nchannels = 1536;
0023   }
0024   else if (_detector == DETECTOR::MBD)
0025   {
0026     nchannels = 256;
0027   }
0028   else if (_detector == DETECTOR::ZDC)
0029   {
0030     nchannels = 52;
0031   }
0032   _clones = new TClonesArray("TowerInfov3", nchannels);
0033   _clones->SetOwner();
0034   _clones->SetName("TowerInfoContainerv3");
0035   for (int i = 0; i < nchannels; ++i)
0036   {
0037     // as tower numbers are fixed per event
0038     // construct towers once per run, and clear the towers for first use
0039     _clones->ConstructedAt(i, "C");
0040   }
0041 }
0042 
0043 TowerInfoContainerv3::TowerInfoContainerv3(const TowerInfoContainerv3& source)
0044   : TowerInfoContainer(source)
0045 {
0046   _detector = source.get_detectorid();
0047   _clones = new TClonesArray("TowerInfov3", source.size());
0048   _clones->SetOwner();
0049   _clones->SetName("TowerInfoContainerv3");
0050   for (unsigned int i = 0; i < source.size(); ++i)
0051   {
0052     // as tower numbers are fixed per event
0053     // construct towers once per run, and clear the towers for first use
0054     _clones->ConstructedAt(i, "C");
0055   }
0056 }
0057 
0058 TowerInfoContainerv3::~TowerInfoContainerv3()
0059 {
0060   delete _clones;
0061 }
0062 
0063 void TowerInfoContainerv3::identify(std::ostream& os) const
0064 {
0065   os << "TowerInfoContainerv3 of size " << size() << std::endl;
0066 }
0067 
0068 void TowerInfoContainerv3::Reset()
0069 {
0070   // clear content of towers in the container for the next event
0071 
0072   for (Int_t i = 0; i < _clones->GetEntriesFast(); ++i)
0073   {
0074     TObject* obj = _clones->UncheckedAt(i);
0075 
0076     if (obj == nullptr)
0077     {
0078       std::cout << __PRETTY_FUNCTION__ << " Fatal access error:"
0079                 << " _clones->GetSize() = " << _clones->GetSize()
0080                 << " _clones->GetEntriesFast() = " << _clones->GetEntriesFast()
0081                 << " i = " << i << std::endl;
0082       _clones->Print();
0083     }
0084 
0085     assert(obj);
0086     // same as TClonesArray::Clear() but only clear but not to erase all towers
0087     obj->Clear();
0088     obj->ResetBit(kHasUUID);
0089     obj->ResetBit(kIsReferenced);
0090     obj->SetUniqueID(0);
0091   }
0092 }
0093 
0094 TowerInfov3* TowerInfoContainerv3::get_tower_at_channel(int pos)
0095 {
0096   return (TowerInfov3*) _clones->At(pos);
0097 }
0098 
0099 TowerInfov3* TowerInfoContainerv3::get_tower_at_key(int pos)
0100 {
0101   int index = decode_key(pos);
0102   return (TowerInfov3*) _clones->At(index);
0103 }
0104 
0105 unsigned int TowerInfoContainerv3::encode_key(unsigned int towerIndex)
0106 {
0107   int key = 0;
0108   if (_detector == DETECTOR::EMCAL)
0109   {
0110     key = TowerInfoContainer::encode_emcal(towerIndex);
0111   }
0112   else if (_detector == DETECTOR::HCAL)
0113   {
0114     key = TowerInfoContainer::encode_hcal(towerIndex);
0115   }
0116   else if (_detector == DETECTOR::SEPD)
0117   {
0118     key = TowerInfoContainer::encode_epd(towerIndex);
0119   }
0120   else if (_detector == DETECTOR::MBD)
0121   {
0122     key = TowerInfoContainer::encode_mbd(towerIndex);
0123   }
0124   else if (_detector == DETECTOR::ZDC)
0125   {
0126     key = TowerInfoContainer::encode_zdc(towerIndex);
0127   }
0128   return key;
0129 }
0130 
0131 unsigned int TowerInfoContainerv3::decode_key(unsigned int tower_key)
0132 {
0133   int index = 0;
0134 
0135   if (_detector == DETECTOR::EMCAL)
0136   {
0137     index = TowerInfoContainer::decode_emcal(tower_key);
0138   }
0139   else if (_detector == DETECTOR::HCAL)
0140   {
0141     index = TowerInfoContainer::decode_hcal(tower_key);
0142   }
0143   else if (_detector == DETECTOR::SEPD)
0144   {
0145     index = TowerInfoContainer::decode_epd(tower_key);
0146   }
0147   else if (_detector == DETECTOR::MBD)
0148   {
0149     index = TowerInfoContainer::decode_mbd(tower_key);
0150   }
0151   else if (_detector == DETECTOR::ZDC)
0152   {
0153     index = TowerInfoContainer::decode_zdc(tower_key);
0154   }
0155   return index;
0156 }