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 }