]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONSparseHisto.cxx
New configuration for AliGenMUONCocktailpp
[u/mrichter/AliRoot.git] / MUON / AliMUONSparseHisto.cxx
CommitLineData
8741815f 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 "AliMUONSparseHisto.h"
19#include <TString.h>
20#include <Riostream.h>
21#include <TH1.h>
22
23/// \class AliMUONSparseHisto
24///
25/// Tiny histogram-like class to hold adc distributions of tracker data.
26/// Only intent of this class is to minimize memory consumption, in
27/// order to fit a maximum number of channel histograms into memory.
28/// The rest is not supported ;-)
29///
30/// \author Laurent Aphecetche, Subatech
31
32/// \cond CLASSIMP
33ClassImp(AliMUONSparseHisto)
34/// \endcond
35
36//______________________________________________________________________________
37AliMUONSparseHisto::AliMUONSparseHisto()
38: TObject(),
39fNbins(0),
40fArray(0x0)
41{
42 /// ctor
43}
44
45//______________________________________________________________________________
46AliMUONSparseHisto::AliMUONSparseHisto(const AliMUONSparseHisto& rhs)
47: TObject(rhs),
48fNbins(0),
49fArray(0x0)
50{
51 /// copy ctor
52 rhs.Copy(*this);
53}
54
55//______________________________________________________________________________
56AliMUONSparseHisto&
57AliMUONSparseHisto::operator=(const AliMUONSparseHisto& rhs)
58{
59 /// assignment operator
60 if ( this != &rhs )
61 {
62 rhs.Copy(*this);
63 }
64 return *this;
65}
66
67//______________________________________________________________________________
68AliMUONSparseHisto::~AliMUONSparseHisto()
69{
70 /// dtor
71 delete[] fArray;
72}
73
74//______________________________________________________________________________
75void
76AliMUONSparseHisto::Clear(Option_t*)
77{
78 /// Reset the content
79 delete[] fArray;
80 fArray = 0x0;
81 fNbins = 0;
82}
83
84//______________________________________________________________________________
85void
86AliMUONSparseHisto::Copy(TObject& object) const
87{
88 /// Copy this to *object
89 TObject::Copy(object);
90 AliMUONSparseHisto& h = static_cast<AliMUONSparseHisto&>(object);
91 delete[] h.fArray;
92 h.fArray = 0x0;
93 h.fNbins = GetNbins();
94 if ( GetNbins() > 0 )
95 {
96 h.fArray = new Int_t[GetNbins()];
97 for ( Int_t i = 0; i < GetNbins(); ++i )
98 {
99 h.fArray[i] = GetBinContent(i);
100 }
101 }
102}
103
104//______________________________________________________________________________
105void
106AliMUONSparseHisto::Decode(Int_t value, Int_t& adc, Int_t& count) const
107{
108 /// Convert value into (adc,count) pair
109
110 adc = ( value & 0xFFF00000 ) >> 20;
111 count = ( value & 0x000FFFFF );
112}
113
114//______________________________________________________________________________
115Int_t
116AliMUONSparseHisto::Encode(Int_t adc, Int_t count) const
117{
118 /// Convert (adc,count) into a single value
119 return ( ( adc & 0xFFF ) ) << 20 | ( count & 0xFFFFF );
120}
121
122//______________________________________________________________________________
123void
124AliMUONSparseHisto::Expand()
125{
126 /// Make fArray of size n
127 if (!fArray || !fNbins)
128 {
129 delete[] fArray;
130 fArray = new Int_t[1];
131 fNbins = 1;
132 }
133 else
134 {
135 Int_t* tmp = new Int_t[fNbins+1];
136 for ( Int_t i = 0; i < fNbins; ++i )
137 {
138 tmp[i] = fArray[i];
139 }
140 delete[] fArray;
141 fArray = tmp;
142 ++fNbins;
143 }
144}
145
146//______________________________________________________________________________
147Int_t
148AliMUONSparseHisto::Fill(Int_t adc)
149{
150 /// Fill
151
152 if ( adc < 0 || adc > 4095 ) return -1;
153
154 Int_t i = Find(adc);
155
156 if ( i < 0 )
157 {
158 Int_t n = fNbins;
159 Expand();
160 fArray[n] = Encode(adc,1);
161 i = n;
162 }
163 else
164 {
165 Int_t iadc,icontent;
166 Decode(fArray[i],iadc,icontent);
167 fArray[i] = Encode(adc,icontent+1);
168 }
169
170 return i;
171}
172
173//______________________________________________________________________________
174Int_t
175AliMUONSparseHisto::Find(Int_t adc) const
176{
177 /// Return the index in fArray of adc, or -1 if not found
178 for ( Int_t i = 0; i < GetNbins(); ++i )
179 {
180 Int_t content = GetBinContent(i);
181 Int_t iadc,value;
182 Decode(content,iadc,value);
183 if ( iadc == adc ) return i;
184 }
185 return -1;
186}
187
188//______________________________________________________________________________
189Int_t
190AliMUONSparseHisto::GetBinContent(Int_t bin) const
191{
192 /// Get bin content. Note that the content is compacted, so you must
193 /// use Decode() method to get (adc,count) values.
194 if ( bin >= 0 && bin < GetNbins() ) return fArray[bin];
195 return 0;
196}
197
198//______________________________________________________________________________
199void
200AliMUONSparseHisto::Print(Option_t* opt) const
201{
202 /// Printout
203 Int_t id1 = ( GetUniqueID() & 0xFFFF0000 ) >> 16;
204 Int_t id2 = GetUniqueID() & 0xFFFF;
205
206 cout << "(" << id1 << "," << id2 << ") n bins = " << GetNbins() << endl;
207
208 TString sopt(opt);
209 sopt.ToUpper();
210
211 if ( sopt.Contains("FULL") )
212 {
213 for ( Int_t i = 0; i < GetNbins(); ++i )
214 {
215 Int_t content = GetBinContent(i);
216 Int_t adc,value;
217 Decode(content,adc,value);
218 cout << Form("i %4d content %10x adc %4d value %6d",i,content,adc,value)
219 << endl;
220 }
221 }
222}