X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUON2DMap.cxx;h=19551381f41f880c1b3bfe816b13fa520cf72dd5;hb=debeb29aad2b9612a902ee16e9393916ebf6eb82;hp=5f2ffe7895e38c62bfa03144e34610d5a6d150a1;hpb=4178b5c7ed8261863bd588cdd933cc6a20452437;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUON2DMap.cxx b/MUON/AliMUON2DMap.cxx index 5f2ffe7895e..19551381f41 100644 --- a/MUON/AliMUON2DMap.cxx +++ b/MUON/AliMUON2DMap.cxx @@ -21,55 +21,53 @@ #include "AliMUON2DMapIterator.h" #include "AliMUON2DMapIteratorByI.h" #include "AliMpExMap.h" -#include "AliMpManuList.h" -#include "AliMpDEManager.h" -#include "AliMpConstants.h" +#include "AliMpExMapIterator.h" +//----------------------------------------------------------------------------- /// \class AliMUON2DMap /// Basic implementation of AliMUONVStore container using /// AliMpExMap internally. /// What we store is a "double" map : an AliMpExMap of AliMpExMaps /// /// \author Laurent Aphecetche +//----------------------------------------------------------------------------- /// \cond CLASSIMP ClassImp(AliMUON2DMap) /// \endcond -namespace +const Int_t AliMUON2DMap::fgkOptimalSizeForDEManu = 228; + +//_____________________________________________________________________________ +AliMUON2DMap::AliMUON2DMap(TRootIOCtor*) +: AliMUONVStore(), +fMap(0x0), +fOptimizeForDEManu(kFALSE) { - //___________________________________________________________________________ - TObject* GetValue(TExMapIter& iter, Int_t& theKey) - { - /// return the next value corresponding to theKey in iterator iter - theKey = -1; - Long_t key, value; - Bool_t ok = iter.Next(key,value); - if (!ok) return 0x0; - theKey = (Int_t)(key & 0xFFFF); - return reinterpret_cast(value); - } + /// Root I/O constructor. } //_____________________________________________________________________________ AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu) : AliMUONVStore(), - fMap(0x0), + fMap(new AliMpExMap), fOptimizeForDEManu(optimizeForDEManu) { /// Default constructor. - Clear(); + // hard-coded constant in order not to depend on mapping + // if this number ever change, it will not break the code, simply the + // automatic resizing will give a warning... + + if ( fOptimizeForDEManu ) fMap->SetSize(fgkOptimalSizeForDEManu); } //_____________________________________________________________________________ AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other) : AliMUONVStore(), -fMap(0x0), -fOptimizeForDEManu(kFALSE) + fMap(new AliMpExMap(*other.fMap)), + fOptimizeForDEManu(other.fOptimizeForDEManu) { /// Copy constructor. - - other.CopyTo(*this); } //_____________________________________________________________________________ @@ -77,8 +75,11 @@ AliMUON2DMap& AliMUON2DMap::operator=(const AliMUON2DMap& other) { /// Assignment operator - - other.CopyTo(*this); + if ( this != &other ) + { + *fMap = *other.fMap; + fOptimizeForDEManu = other.fOptimizeForDEManu; + } return *this; } @@ -87,7 +88,6 @@ AliMUON2DMap::~AliMUON2DMap() { /// Destructor. /// We delete the map, which will delete the objects, as we're owner. - delete fMap; } @@ -99,37 +99,36 @@ AliMUON2DMap::Create() const return new AliMUON2DMap(fOptimizeForDEManu); } -//_____________________________________________________________________________ -void -AliMUON2DMap::CopyTo(AliMUON2DMap& dest) const -{ - /// Copy this into dest. - - delete dest.fMap; - dest.fMap = new AliMpExMap(*fMap); - dest.fOptimizeForDEManu = fOptimizeForDEManu; -} - //_____________________________________________________________________________ Bool_t AliMUON2DMap::Add(TObject* object) { /// Add object, using the decoding of uniqueID into two ints as the key + if (!object) return kFALSE; UInt_t uniqueID = object->GetUniqueID(); Int_t j = ( uniqueID & 0xFFFF0000 ) >> 16; Int_t i = ( uniqueID & 0xFFFF); return Set(i,j,object,kFALSE); } +//_____________________________________________________________________________ +TObject* +AliMUON2DMap::FindObject(UInt_t uid) const +{ + /// Return the value at position uid + + Int_t j = ( uid & 0xFFFF0000 ) >> 16; + Int_t i = ( uid & 0xFFFF); + return FindObject(i,j); +} + //_____________________________________________________________________________ TObject* AliMUON2DMap::FindObject(Int_t i, Int_t j) const { /// Return the value at position (i,j). - AliMpExMap* m = static_cast(fMap->GetValue(i)); - if (m) return m->GetValue(j); - return 0x0; + return m ? m->GetValue(j) : 0x0; } //_____________________________________________________________________________ @@ -138,11 +137,7 @@ AliMUON2DMap::CreateIterator() const { // Create and return an iterator on this map // Returned iterator must be deleted by user. - if ( fMap ) - { - return new AliMUON2DMapIterator(*fMap); - } - return 0x0; + return new AliMUON2DMapIterator(*fMap); } //_____________________________________________________________________________ @@ -151,31 +146,15 @@ AliMUON2DMap::CreateIterator(Int_t firstI, Int_t lastI) const { // Create and return an iterator on this map // Returned iterator must be deleted by user. - if ( fMap ) - { - return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI); - } - return 0x0; + return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI); } //_____________________________________________________________________________ void AliMUON2DMap::Clear(Option_t*) { - /// Reset - delete fMap; - - fMap = new AliMpExMap(kTRUE); - - if ( fOptimizeForDEManu ) - { - Int_t nDEs(0); - for ( Int_t i = 0; i < AliMpConstants::NofChambers(); ++i ) - { - nDEs += AliMpDEManager::GetNofDEInChamber(i); - } - fMap->SetSize(nDEs); - } + /// Clear memory + fMap->Clear(); } //_____________________________________________________________________________ @@ -183,13 +162,17 @@ Int_t AliMUON2DMap::GetSize() const { /// Return the number of objects we hold - TExMapIter iter(fMap->GetIterator()); - Int_t i; + TIter next(fMap->CreateIterator()); Int_t theSize(0); + AliMpExMap* m; - while ( GetValue(iter,i) ) + while ( ( m = static_cast(next()) ) ) { - theSize += GetSize(i); + TIter next2(m->CreateIterator()); + while ( next2() ) + { + ++theSize; + } } return theSize; } @@ -200,11 +183,7 @@ AliMUON2DMap::GetSize(Int_t i) const { /// Return the number of objects we hold AliMpExMap* m = static_cast(fMap->GetValue(i)); - if (m) - { - return m->GetSize(); - } - return 0; + return m ? m->GetSize() : 0; } //_____________________________________________________________________________ @@ -219,26 +198,15 @@ AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace) TObject* o = fMap->GetValue(i); if ( !o ) { - AliMpExMap* m = new AliMpExMap(true); + AliMpExMap* m = new AliMpExMap; if ( fOptimizeForDEManu ) { - Int_t n(AliMpManuList::NumberOfManus(i)); - if (!n) - { - AliError(Form("This does not look right : i = %d is supposed to " - "be a DetElemId with n = %d manus!",i,n)); - } - else - { - m->SetSize(n); - } + m->SetSize(451); // same remark as for the SetSize in ctor... } fMap->Add(i,m); o = fMap->GetValue(i); } AliMpExMap* m = static_cast(o); -// AliMpExMap* m = dynamic_cast(o); -// if (!m) AliFatal(Form("fMap[%d] not of the expected type",i)); o = m->GetValue(j); @@ -263,7 +231,3 @@ AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace) return kTRUE; } - - - -