emcTowerContainerv2.C

Go to the documentation of this file.
00001 #include "emcTowerContainerv2.h"
00002 #include "emcTowerContentv2.h"
00003 #include "TClonesArray.h"
00004 #include <iostream>
00005 #include <algorithm>
00006 #include "phool.h"
00007 
00008 ClassImp(emcTowerContainerv2)
00009 
00010   using namespace std;
00011 
00012 const unsigned int emcTowerContainerv2::fgMaxSize = 24768;
00013 const unsigned int emcTowerContainerv2::fgDefaultSize = 1000;
00014 
00015 //_____________________________________________________________________________
00016   emcTowerContainerv2::emcTowerContainerv2() 
00017     : fEmcTowers(0), 
00018       fTowerIdToIndexIsUpToDate(false)
00019 {
00020   allocate(emcTowerContainerv2::fgDefaultSize);
00021 }
00022 
00023 //_____________________________________________________________________________
00024 emcTowerContainerv2::emcTowerContainerv2(const emcTowerContainerv2& o) 
00025   : emcTowerContainer(),
00026     fEmcTowers(0),
00027     fTowerIdToIndexIsUpToDate(false)
00028 {
00029   o.copy(*this);
00030 }
00031 
00032 //_____________________________________________________________________________
00033 emcTowerContainerv2&
00034 emcTowerContainerv2::operator=(const emcTowerContainerv2& o)
00035 {
00036   if ( this != &o )
00037     {
00038       o.copy(*this);
00039     }
00040   return *this;
00041 }
00042 
00043 //_____________________________________________________________________________
00044 emcTowerContainerv2::~emcTowerContainerv2()
00045 {
00046   delete fEmcTowers;
00047 }
00048 
00049 //_____________________________________________________________________________
00050 emcTowerContentv2*
00051 emcTowerContainerv2::addTower(unsigned int i)
00052 {
00053   if ( static_cast<int>(i) >  fEmcTowers->GetSize() )
00054     {
00055       bool ok = resize(std::max(capacity()*2,fgMaxSize));
00056       if (!ok) 
00057         {
00058           cerr << PHWHERE << " object is full ?!" << endl;
00059           return 0;
00060         }
00061     }
00062 
00063   fTowerIdToIndexIsUpToDate = false;
00064 
00065   return new((*fEmcTowers)[i]) emcTowerContentv2;
00066 }
00067 
00068 //_____________________________________________________________________________
00069 emcTowerContentv2*
00070 emcTowerContainerv2::addTower(unsigned int i, const emcTowerContent& t)
00071 {
00072   const emcTowerContentv2* test = 
00073     dynamic_cast<const emcTowerContentv2*>(&t);
00074 
00075   if (!test) 
00076     {
00077       cerr << PHWHERE << " emcTowerContent is not of type v2" << endl;
00078       return 0;
00079     }
00080 
00081   if ( static_cast<int>(i) >  fEmcTowers->GetSize() )
00082     {
00083       bool ok = resize(std::max(capacity()*2,fgMaxSize));
00084       if (!ok) 
00085         {
00086           cerr << PHWHERE << " object is full ?!" << endl;
00087           return 0;
00088         }
00089     }
00090 
00091   fTowerIdToIndexIsUpToDate = false;
00092 
00093   return new((*fEmcTowers)[i]) emcTowerContentv2(*test);
00094 }
00095 
00096 //_____________________________________________________________________________
00097 void
00098 emcTowerContainerv2::allocate(unsigned int thesize)
00099 {
00100   delete fEmcTowers;
00101   fEmcTowers = new TClonesArray("emcTowerContentv2",thesize);
00102   fTowerIdToIndexIsUpToDate = false;
00103 }
00104 
00105 //_____________________________________________________________________________
00106 unsigned int
00107 emcTowerContainerv2::capacity(void) const
00108 { 
00109   return fEmcTowers->GetSize(); 
00110 }
00111 
00112 //_____________________________________________________________________________
00113 emcTowerContainerv2*
00114 emcTowerContainerv2::clone(void) const
00115 {
00116   return new emcTowerContainerv2(*this);
00117 }
00118 
00119 //_____________________________________________________________________________
00120 emcTowerContainerv2*
00121 emcTowerContainerv2::create(void) const
00122 {
00123   return new emcTowerContainerv2;
00124 }
00125 
00126 //_____________________________________________________________________________
00127 void
00128 emcTowerContainerv2::copy(emcTowerContainerv2& dest) const
00129 {
00130   TClonesArray* destarray = dest.fEmcTowers;
00131   if ( !destarray ) 
00132     {
00133       dest.allocate(fEmcTowers->GetSize());
00134       destarray = dest.fEmcTowers;
00135     }
00136   else
00137     {
00138       dest.Reset();
00139     }
00140 
00141   unsigned int idest = 0;
00142 
00143   for ( unsigned int i = 0; i < size(); ++i ) 
00144     {
00145       emcTowerContentv2* tower = dest.addTower(idest++);
00146       *tower = *(getTower(i));
00147     }
00148 
00149   dest.fTowerIdToIndexIsUpToDate = fTowerIdToIndexIsUpToDate;
00150   dest.fTowerIdToIndex = fTowerIdToIndex;
00151 }
00152 
00153 //_____________________________________________________________________________
00154 emcTowerContentv2*
00155 emcTowerContainerv2::findTower(int towerID) const
00156 {
00157   if ( !fTowerIdToIndexIsUpToDate )
00158     {
00159       fTowerIdToIndex.clear();
00160       for ( size_t i = 0; i < size(); ++i ) 
00161         {
00162           fTowerIdToIndex[getTower(i)->TowerID()] = i;
00163         }
00164       fTowerIdToIndexIsUpToDate=true;
00165     }
00166 
00167   map<int,int>::const_iterator it = fTowerIdToIndex.find(towerID);
00168   if ( it != fTowerIdToIndex.end() )
00169     {
00170       return getTower(it->second);
00171     }
00172   else
00173     {
00174       return 0;
00175     }
00176 }
00177 
00178 //_____________________________________________________________________________
00179 emcTowerContentv2*
00180 emcTowerContainerv2::getTower(unsigned int i) const
00181 {
00182   return static_cast<emcTowerContentv2*>(fEmcTowers->At(i));
00183 }
00184 
00185 //_____________________________________________________________________________
00186 void
00187 emcTowerContainerv2::identify(ostream& os) const
00188 {
00189   os << "emcTowerContainerv2::identify : size=" << size() << std::endl;
00190 }
00191 
00192 //_____________________________________________________________________________
00193 int
00194 emcTowerContainerv2::isValid() const
00195 {
00196   return 1;
00197 }
00198 
00199 //_____________________________________________________________________________
00200 void
00201 emcTowerContainerv2::Reset()
00202 {
00203   fEmcTowers->Clear();
00204   fTowerIdToIndex.clear();
00205   fTowerIdToIndexIsUpToDate=false;
00206 }
00207 
00208 //_____________________________________________________________________________
00209 bool
00210 emcTowerContainerv2::removeTower(unsigned int i)
00211 {
00212   if ( i < size() ) 
00213     {
00214       fEmcTowers->RemoveAt(i);
00215       fEmcTowers->Compress();
00216       fTowerIdToIndexIsUpToDate=false;
00217       return true;
00218     }
00219   else
00220     {
00221       return false;
00222     }
00223 }
00224 
00225 //_____________________________________________________________________________
00226 bool
00227 emcTowerContainerv2::resize(unsigned int newsize)
00228 {
00229   if ( newsize < emcTowerContainerv2::fgMaxSize )
00230     {
00231       fEmcTowers->Expand(newsize);
00232       return true;
00233     }
00234   else
00235     {
00236       return false;
00237     }
00238 }
00239 
00240 //_____________________________________________________________________________
00241 unsigned int
00242 emcTowerContainerv2::size(void) const
00243 {
00244   return fEmcTowers->GetLast()+1;
00245 }