Initial version (Laurent)
[u/mrichter/AliRoot.git] / MUON / AliMUON2DMap.cxx
CommitLineData
f6e5d0e9 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16// $Id$
17
18#include "AliMUON2DMap.h"
19
20#include "AliLog.h"
f246123b 21#include "AliMUON2DMapIterator.h"
4178b5c7 22#include "AliMUON2DMapIteratorByI.h"
f6e5d0e9 23#include "AliMpExMap.h"
d91c6144 24#include "AliMpManuList.h"
25#include "AliMpDEManager.h"
be0c6f1f 26#include "AliMpConstants.h"
f6e5d0e9 27
3d1463c8 28//-----------------------------------------------------------------------------
5398f946 29/// \class AliMUON2DMap
4178b5c7 30/// Basic implementation of AliMUONVStore container using
9d5f6a64 31/// AliMpExMap internally.
32/// What we store is a "double" map : an AliMpExMap of AliMpExMaps
33///
5398f946 34/// \author Laurent Aphecetche
3d1463c8 35//-----------------------------------------------------------------------------
f6e5d0e9 36
5398f946 37/// \cond CLASSIMP
f6e5d0e9 38ClassImp(AliMUON2DMap)
5398f946 39/// \endcond
f6e5d0e9 40
4178b5c7 41namespace
42{
43 //___________________________________________________________________________
44 TObject* GetValue(TExMapIter& iter, Int_t& theKey)
45 {
46 /// return the next value corresponding to theKey in iterator iter
47 theKey = -1;
48 Long_t key, value;
49 Bool_t ok = iter.Next(key,value);
50 if (!ok) return 0x0;
51 theKey = (Int_t)(key & 0xFFFF);
52 return reinterpret_cast<TObject*>(value);
53 }
54}
55
f6e5d0e9 56//_____________________________________________________________________________
d91c6144 57AliMUON2DMap::AliMUON2DMap(Bool_t optimizeForDEManu)
4178b5c7 58: AliMUONVStore(),
59 fMap(0x0),
d91c6144 60 fOptimizeForDEManu(optimizeForDEManu)
f6e5d0e9 61{
4178b5c7 62 /// Default constructor.
63 Clear();
f6e5d0e9 64}
65
9d5f6a64 66//_____________________________________________________________________________
67AliMUON2DMap::AliMUON2DMap(const AliMUON2DMap& other)
4178b5c7 68: AliMUONVStore(),
d91c6144 69fMap(0x0),
70fOptimizeForDEManu(kFALSE)
9d5f6a64 71{
5398f946 72 /// Copy constructor.
73
74 other.CopyTo(*this);
9d5f6a64 75}
884a73f1 76
9d5f6a64 77//_____________________________________________________________________________
78AliMUON2DMap&
79AliMUON2DMap::operator=(const AliMUON2DMap& other)
80{
5398f946 81/// Assignment operator
82
9d5f6a64 83 other.CopyTo(*this);
84 return *this;
884a73f1 85}
86
f6e5d0e9 87//_____________________________________________________________________________
88AliMUON2DMap::~AliMUON2DMap()
89{
5398f946 90/// Destructor.
91/// We delete the map, which will delete the objects, as we're owner.
92
f6e5d0e9 93 delete fMap;
94}
95
d91c6144 96//_____________________________________________________________________________
4178b5c7 97AliMUONVStore*
98AliMUON2DMap::Create() const
d91c6144 99{
100 /// Create a void copy of *this.
547c1de0 101 return new AliMUON2DMap(fOptimizeForDEManu);
d91c6144 102}
103
9d5f6a64 104//_____________________________________________________________________________
105void
d91c6144 106AliMUON2DMap::CopyTo(AliMUON2DMap& dest) const
884a73f1 107{
d91c6144 108 /// Copy this into dest.
5398f946 109
d91c6144 110 delete dest.fMap;
111 dest.fMap = new AliMpExMap(*fMap);
112 dest.fOptimizeForDEManu = fOptimizeForDEManu;
9d5f6a64 113}
884a73f1 114
4178b5c7 115//_____________________________________________________________________________
116Bool_t
117AliMUON2DMap::Add(TObject* object)
118{
119 /// Add object, using the decoding of uniqueID into two ints as the key
120 UInt_t uniqueID = object->GetUniqueID();
121 Int_t j = ( uniqueID & 0xFFFF0000 ) >> 16;
122 Int_t i = ( uniqueID & 0xFFFF);
123 return Set(i,j,object,kFALSE);
124}
125
f6e5d0e9 126//_____________________________________________________________________________
127TObject*
4178b5c7 128AliMUON2DMap::FindObject(Int_t i, Int_t j) const
f6e5d0e9 129{
4178b5c7 130 /// Return the value at position (i,j).
5398f946 131
4178b5c7 132 AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
133 if (m) return m->GetValue(j);
134 return 0x0;
135}
136
137//_____________________________________________________________________________
138TIterator*
139AliMUON2DMap::CreateIterator() const
140{
141 // Create and return an iterator on this map
142 // Returned iterator must be deleted by user.
143 if ( fMap )
f6e5d0e9 144 {
4178b5c7 145 return new AliMUON2DMapIterator(*fMap);
f6e5d0e9 146 }
147 return 0x0;
148}
149
f6e5d0e9 150//_____________________________________________________________________________
4178b5c7 151TIterator*
152AliMUON2DMap::CreateIterator(Int_t firstI, Int_t lastI) const
f246123b 153{
154 // Create and return an iterator on this map
155 // Returned iterator must be deleted by user.
156 if ( fMap )
157 {
4178b5c7 158 return new AliMUON2DMapIteratorByI(*fMap,firstI,lastI);
f246123b 159 }
160 return 0x0;
161}
162
49f43921 163//_____________________________________________________________________________
4178b5c7 164void
165AliMUON2DMap::Clear(Option_t*)
49f43921 166{
4178b5c7 167 /// Reset
168 delete fMap;
49f43921 169
4178b5c7 170 fMap = new AliMpExMap(kTRUE);
171
172 if ( fOptimizeForDEManu )
49f43921 173 {
4178b5c7 174 Int_t nDEs(0);
175 for ( Int_t i = 0; i < AliMpConstants::NofChambers(); ++i )
176 {
177 nDEs += AliMpDEManager::GetNofDEInChamber(i);
178 }
179 fMap->SetSize(nDEs);
49f43921 180 }
4178b5c7 181}
182
183//_____________________________________________________________________________
184Int_t
185AliMUON2DMap::GetSize() const
186{
187 /// Return the number of objects we hold
188 TExMapIter iter(fMap->GetIterator());
189 Int_t i;
190 Int_t theSize(0);
49f43921 191
4178b5c7 192 while ( GetValue(iter,i) )
193 {
194 theSize += GetSize(i);
195 }
196 return theSize;
197}
198
199//_____________________________________________________________________________
200Int_t
201AliMUON2DMap::GetSize(Int_t i) const
202{
203 /// Return the number of objects we hold
204 AliMpExMap* m = static_cast<AliMpExMap*>(fMap->GetValue(i));
205 if (m)
206 {
207 return m->GetSize();
208 }
209 return 0;
49f43921 210}
211
f6e5d0e9 212//_____________________________________________________________________________
213Bool_t
214AliMUON2DMap::Set(Int_t i, Int_t j, TObject* object, Bool_t replace)
215{
5398f946 216/// Set the object at position (i,j).
217/// If replace==kTRUE, we don't care if there's an object there already,
218/// otherwise we might refuse to set if the (i,j) location is already
219/// filled (in which case we return kFALSE).
e5cc543e 220
f6e5d0e9 221 TObject* o = fMap->GetValue(i);
222 if ( !o )
223 {
224 AliMpExMap* m = new AliMpExMap(true);
d91c6144 225 if ( fOptimizeForDEManu )
226 {
227 Int_t n(AliMpManuList::NumberOfManus(i));
228 if (!n)
229 {
230 AliError(Form("This does not look right : i = %d is supposed to "
231 "be a DetElemId with n = %d manus!",i,n));
232 }
233 else
234 {
235 m->SetSize(n);
236 }
237 }
f6e5d0e9 238 fMap->Add(i,m);
239 o = fMap->GetValue(i);
f6e5d0e9 240 }
4178b5c7 241 AliMpExMap* m = static_cast<AliMpExMap*>(o);
242// AliMpExMap* m = dynamic_cast<AliMpExMap*>(o);
243// if (!m) AliFatal(Form("fMap[%d] not of the expected type",i));
244
f6e5d0e9 245 o = m->GetValue(j);
4178b5c7 246
247 if ( !o )
f6e5d0e9 248 {
f6e5d0e9 249 m->Add(j,object);
250 }
4178b5c7 251 else
f6e5d0e9 252 {
4178b5c7 253 if ( replace )
254 {
255 delete o;
256 m->Add(j,object);
257 }
258 else
259 {
260 AliError(Form("Object %p is already there for (i,j)=(%d,%d)",o,i,j));
261 return kFALSE;
262 }
f6e5d0e9 263 }
4178b5c7 264
f6e5d0e9 265 return kTRUE;
266}
267
268
269
270
271