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 }