Pre-allocate right amount of memory when used for de,manu storage (Laurent)
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 20 Oct 2006 15:58:09 +0000 (15:58 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 20 Oct 2006 15:58:09 +0000 (15:58 +0000)
MUON/AliMUON2DMap.cxx
MUON/AliMUON2DMap.h

index 932e339..702407a 100644 (file)
@@ -22,6 +22,9 @@
 #include "AliMUON2DMapIterator.h"
 #include "AliMpExMap.h"
 #include "AliMpIntPair.h"
+#include "AliMpManuList.h"
+#include "AliMpDEManager.h"
+#include "AliMUONConstants.h"
 
 /// \class AliMUON2DMap
 /// \brief Basic implementation of AliMUONV2DStore container using
@@ -35,15 +38,28 @@ ClassImp(AliMUON2DMap)
 /// \endcond
 
 //_____________________________________________________________________________
-AliMUON2DMap::AliMUON2DMap() : AliMUONV2DStore(), fMap(new AliMpExMap(true))
+AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu) 
+: AliMUONV2DStore(), 
+  fMap(new AliMpExMap(true)), 
+  fOptimizeForDEManu(optimizeForDEManu)
 {
 /// Default constructor.
+    if ( fOptimizeForDEManu )
+    {
+      Int_t nDEs(0);
+      for ( Int_t i = 0; i < AliMUONConstants::NTrackingCh(); ++i )
+      {
+        nDEs += AliMpDEManager::GetNofDEInChamber(i);
+      }
+      fMap->SetSize(nDEs);
+    }
 }
 
 //_____________________________________________________________________________
 AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other)
 : AliMUONV2DStore(),
-fMap(0x0)
+fMap(0x0),
+fOptimizeForDEManu(kFALSE)
 {
  /// Copy constructor.
 
@@ -70,12 +86,22 @@ AliMUON2DMap::~AliMUON2DMap()
 }
 
 //_____________________________________________________________________________
+AliMUONV2DStore*
+AliMUON2DMap::CloneEmpty() const
+{
+  /// Create a void copy of *this. 
+  return new AliMUON2DMap;
+}
+
+//_____________________________________________________________________________
 void
-AliMUON2DMap::CopyTo(AliMUON2DMap&) const
+AliMUON2DMap::CopyTo(AliMUON2DMap& dest) const
 {
-/// Copy this into dest.
+  /// Copy this into dest.
 
-  AliFatal("Implement me if needed");
+  delete dest.fMap;
+  dest.fMap = new AliMpExMap(*fMap);
+  dest.fOptimizeForDEManu = fOptimizeForDEManu;
 }
 
 //_____________________________________________________________________________
@@ -127,6 +153,19 @@ AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace)
   if ( !o )
   {
     AliMpExMap* m = new AliMpExMap(true);
+    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);
+      }
+    }
     fMap->Add(i,m);
     o = fMap->GetValue(i);
   }
index a8b657e..1d88ea5 100644 (file)
@@ -20,9 +20,11 @@ class AliMpExMap;
 class AliMUON2DMap : public AliMUONV2DStore
 {
 public:
-  AliMUON2DMap();  
+  AliMUON2DMap(Bool_t optimizeForDEManu=kFALSE);  
   virtual ~AliMUON2DMap();
 
+  AliMUONV2DStore* CloneEmpty() const;
+  
   /// The returned iterator is owned by the client.
   AliMUONVDataIterator* Iterator() const;
   
@@ -32,8 +34,7 @@ public:
   virtual Bool_t IsOwner() const { return kTRUE; } 
 
   virtual void Print(Option_t* opt="") const;
-
-protected:
+  
   AliMUON2DMap(const AliMUON2DMap& other);
   AliMUON2DMap&  operator = (const AliMUON2DMap& other);
 
@@ -42,8 +43,9 @@ private:
 
 private:
   AliMpExMap* fMap; ///< Our internal map (an AliMpExMap of AliMpExMaps)
+  Bool_t fOptimizeForDEManu; ///< whether (i,j) pair is supposed to be (DetElemId,ManuId) (allow us to allocate right amount of memory, that's all it does.
   
-  ClassDef(AliMUON2DMap,1) // A 2D container
+  ClassDef(AliMUON2DMap,2) // A 2D container
 };
 
 #endif