emcTowerContainerv3.C

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