]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONClusterStoreV1.cxx
minor coverity defect: added protection for self-assignment
[u/mrichter/AliRoot.git] / MUON / AliMUONClusterStoreV1.cxx
CommitLineData
e8adc3ac 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
3d1463c8 18//-----------------------------------------------------------------------------
e8adc3ac 19/// \class AliMUONClusterStoreV1
20///
21/// Implementation of VClusterStore.
22///
23/// This one is a basic implementation, let's say "legacy" one, i.e.
24/// compatible with what we stored in MUON.RecPoints.root files before
25/// the switch to data stores.
26///
27/// \author Laurent Aphecetche, Subatech
28///
3d1463c8 29//-----------------------------------------------------------------------------
e8adc3ac 30
31#include "AliMUONClusterStoreV1.h"
32
33#include "AliLog.h"
34#include "AliMUONRawCluster.h"
35#include "AliMUONTOTCAStoreIterator.h"
36#include "AliMUONTreeManager.h"
37#include "AliMpConstants.h"
38#include "AliMpDEManager.h"
39#include <TClonesArray.h>
40#include <TObjArray.h>
41#include <TTree.h>
42
43/// \cond CLASSIMP
44ClassImp(AliMUONClusterStoreV1)
45/// \endcond
46
47//_____________________________________________________________________________
48AliMUONClusterStoreV1::AliMUONClusterStoreV1()
49: AliMUONVClusterStore(),
50fClusters(new TObjArray(AliMpConstants::NofChambers()))
51{
52 /// ctor. Set correct ownerships
53 fClusters->SetOwner(kTRUE);
54 for ( Int_t i = 0; i < fClusters->GetSize(); ++i )
55 {
56 TClonesArray* tca = new TClonesArray("AliMUONRawCluster",100);
e8adc3ac 57 fClusters->AddAt(tca,i);
58 }
59 AliDebug(1,"");
60}
61
62//_____________________________________________________________________________
63AliMUONClusterStoreV1::AliMUONClusterStoreV1(const AliMUONClusterStoreV1&)
64: AliMUONVClusterStore(),
65fClusters(0x0)
66{
67 /// copy ctor
68 AliError("Please implement me");
69}
70
71//_____________________________________________________________________________
72AliMUONClusterStoreV1&
73AliMUONClusterStoreV1::operator=(const AliMUONClusterStoreV1&)
74{
75 /// assignment operator
76 AliError("Please implement me");
77 return *this;
78}
79
80//_____________________________________________________________________________
81AliMUONClusterStoreV1::~AliMUONClusterStoreV1()
82{
83 /// dtor
84 AliDebug(1,"");
85 delete fClusters;
86}
87
2060b217 88//_____________________________________________________________________________
89AliMUONVCluster* AliMUONClusterStoreV1::CreateCluster(Int_t /*chamberId*/, Int_t detElemId, Int_t /*clusterIndex*/) const
90{
91 /// Create a cluster
92 AliMUONVCluster* vCluster = new AliMUONRawCluster();
93 (static_cast<AliMUONRawCluster*> (vCluster))->SetDetElemId(detElemId);
94 return vCluster;
95}
96
e8adc3ac 97//_____________________________________________________________________________
7332f213 98AliMUONVCluster*
2060b217 99AliMUONClusterStoreV1::Add(const AliMUONVCluster& vCluster)
e8adc3ac 100{
101 /// Add a cluster to this store
2060b217 102 const AliMUONRawCluster* cluster = dynamic_cast<const AliMUONRawCluster*>(&vCluster);
103
104 if (!cluster)
105 {
106 AliError(Form("Cluster is not of the expected type (%s vs AliMUONRawCluster)",
107 vCluster.ClassName()));
108 return 0x0;
109 }
110
111 Int_t iChamber = AliMpDEManager::GetChamberId(cluster->GetDetElemId());
e8adc3ac 112 TClonesArray* array = ChamberClusters(iChamber);
113 if (!array)
114 {
7332f213 115 return 0x0;
e8adc3ac 116 }
7332f213 117
118 return new((*array)[array->GetLast()+1]) AliMUONRawCluster(*cluster);
e8adc3ac 119}
120
2060b217 121//_____________________________________________________________________________
122AliMUONVCluster* AliMUONClusterStoreV1::Add(Int_t chamberId, Int_t detElemId, Int_t /*clusterIndex*/)
123{
124 /// Add a cluster to this store
125 TClonesArray* array = ChamberClusters(chamberId);
126 if (!array) return 0x0;
127
128 AliMUONVCluster* vCluster = static_cast<AliMUONVCluster*> (new((*array)[array->GetLast()+1]) AliMUONRawCluster());
129 (static_cast<AliMUONRawCluster*> (vCluster))->SetDetElemId(detElemId);
130 return vCluster;
131}
132
e8adc3ac 133//_____________________________________________________________________________
134TClonesArray*
135AliMUONClusterStoreV1::ChamberClusters(Int_t chamberId) const
136{
137 /// Get the internal array of clusters for a given chamber
138 TClonesArray* array = static_cast<TClonesArray*>(fClusters->At(chamberId));
139 if (!array)
140 {
141 AliError(Form("Cannot get Clusters for chamberId=%d",chamberId));
142 return 0x0;
143 }
144 return array;
145}
146
147//_____________________________________________________________________________
148TObject**
149AliMUONClusterStoreV1::ChamberClustersPtr(Int_t chamberId) const
150{
151 /// Get the internal array of clusters for a given chamber
152 TClonesArray* array = static_cast<TClonesArray*>(fClusters->At(chamberId));
153 if (!array)
154 {
155 AliError(Form("Cannot get Clusters for chamberId=%d",chamberId));
156 return 0x0;
157 }
158 return fClusters->GetObjectRef(array);
159}
160
161//_____________________________________________________________________________
162Bool_t
163AliMUONClusterStoreV1::Connect(TTree& tree, Bool_t alone) const
164{
165 /// Connect this to the tree, i.e. make the branches or set their addresses.
166
167 AliMUONTreeManager tman;
168 Bool_t ok(kTRUE);
169
170 TBranch* b = tree.GetBranch("MUONRawClusters1");
171
172 Bool_t isMaking = (b == 0);
173
174 if ( isMaking )
175 {
176 for ( Int_t i = 0; i < AliMpConstants::NofTrackingChambers(); ++i )
177 {
178 TString branchName(Form("MUONRawClusters%d",i+1));
179 ok = ok && tman.MakeBranch(tree,ClassName(),"TClonesArray",
180 branchName.Data(),ChamberClustersPtr(i));
181 }
182
183 }
184 else
185 {
186 if (alone) tman.UpdateBranchStatuses(tree,"MUONRawClusters");
187 for ( Int_t i = 0; i < AliMpConstants::NofTrackingChambers(); ++i )
188 {
189 TString branchName(Form("MUONRawClusters%d",i+1));
190 ok = ok && tman.SetAddress(tree,branchName.Data(),
191 ChamberClustersPtr(i));
192 }
193 }
194 return ok;
195}
196
197//_____________________________________________________________________________
2060b217 198AliMUONVCluster*
199AliMUONClusterStoreV1::Remove(AliMUONVCluster& cluster)
e8adc3ac 200{
201 /// Remove a cluster
202 Int_t iChamber = AliMpDEManager::GetChamberId(cluster.GetDetElemId());
203 TClonesArray* array = ChamberClusters(iChamber);
204 TObject* o = array->Remove(&cluster);
205 if (o)
206 {
207 array->Compress();
208 }
2060b217 209 return static_cast<AliMUONVCluster*>(o);
e8adc3ac 210}
211
212//_____________________________________________________________________________
213void
214AliMUONClusterStoreV1::Clear(Option_t*)
215{
216 /// Reset internal arrays
217 AliDebug(1,"");
218 /// Reset the tclonesarray, but keep the tobjarray's size constant.
219 for ( Int_t i = 0; i < fClusters->GetSize(); ++i )
220 {
221 ChamberClusters(i)->Clear("C");
222 }
223}
224
225//_____________________________________________________________________________
226TIterator*
227AliMUONClusterStoreV1::CreateIterator() const
228{
229 /// Return an iterator to loop over our clusters
230 return new AliMUONTOTCAStoreIterator(fClusters,0,AliMpConstants::NofTrackingChambers()-1);
231}
232
233//_____________________________________________________________________________
234TIterator*
235AliMUONClusterStoreV1::CreateChamberIterator(Int_t firstChamber, Int_t lastChamber) const
236{
237 /// Return an iterator to loop over our clusters
238 return new AliMUONTOTCAStoreIterator(fClusters,firstChamber,lastChamber);
239}
240
241//_____________________________________________________________________________
242Int_t
243AliMUONClusterStoreV1::GetSize() const
244{
22dce0e3 245 /// Return the number of clusters we hold
d8af3c98 246 Int_t n(0);
247 for ( Int_t i = 0; i < fClusters->GetSize(); ++i )
248 {
249 n += ChamberClusters(i)->GetLast()+1;
250 }
251 return n;
e8adc3ac 252}
2060b217 253