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 }