emcTowerContainerv1.C

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