=operator implemented (R. Shahoyan)
[u/mrichter/AliRoot.git] / MUON / AliMUONTrackerDataHistogrammer.cxx
CommitLineData
10eb3d17 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 "AliMUONTrackerDataHistogrammer.h"
19
20#include "AliMUONPainterGroup.h"
21#include "AliMUONSparseHisto.h"
22#include "AliMUONVPainter.h"
23#include "AliMUONVTrackerData.h"
24#include "AliMpBusPatch.h"
25#include "AliMpConstants.h"
26#include "AliMpDDLStore.h"
27#include "AliMpDEIterator.h"
28#include "AliMpDetElement.h"
29#include "AliMpManuUID.h"
30#include <TH1.h>
31#include <TObjArray.h>
32
33///\class AliMUONTrackerDataHistogrammer
34///
35/// Class to generate histograms from AliMUONVTrackerData
36/// (and AliMUONVPainter) objects
37///
38/// \author Laurent Aphecetche, Subatech
39///
40
41///\cond CLASSIMP
42ClassImp(AliMUONTrackerDataHistogrammer)
43///\endcond CLASSIMP
44
45//_____________________________________________________________________________
46AliMUONTrackerDataHistogrammer::AliMUONTrackerDataHistogrammer(const AliMUONVTrackerData& data,
47 Int_t dim)
48: TObject(),
49fData(data),
50fDim(dim)
51{
52 /// ctor
53}
54
55//_____________________________________________________________________________
56AliMUONTrackerDataHistogrammer::~AliMUONTrackerDataHistogrammer()
57{
58 /// dtor
59}
60
61//_____________________________________________________________________________
62void
63AliMUONTrackerDataHistogrammer::Add(TH1& h, const AliMUONSparseHisto& sh) const
64{
65 /// Add sparse histo content to histogram.
66
67 Double_t entries(h.GetEntries());
68
69 for ( Int_t i = 0; i < sh.GetNbins(); ++i )
70 {
71 Int_t count = sh.GetBinContent(i);
72
73 h.Fill(sh.GetBinCenter(i),count);
74
75 entries += count;
76 }
77
78 h.SetEntries(entries);
79
80 if (sh.HasUnderflow()) h.SetBinContent(0,1);
81 if (sh.HasOverflow()) h.SetBinContent(h.GetNbinsX()+1,1);
82}
83
84//_____________________________________________________________________________
85void
86AliMUONTrackerDataHistogrammer::AddBusPatchHisto(TH1& h, Int_t busPatchId) const
87{
88 /// Add data from one bus patch to the histogram
89
90 if ( fData.HasBusPatch(busPatchId ) )
91 {
92 AliMpBusPatch* busPatch = AliMpDDLStore::Instance()->GetBusPatch(busPatchId);
93 for ( Int_t i = 0; i < busPatch->GetNofManus(); ++i )
94 {
95 Int_t manuId = busPatch->GetManuId(i);
96 AddManuHisto(h,busPatch->GetDEId(),manuId);
97 }
98 }
99}
100//_____________________________________________________________________________
101void
102AliMUONTrackerDataHistogrammer::AddDEHisto(TH1& h, Int_t detElemId) const
103{
104 /// Add data from one detection element to the histogram
105
106 if ( fData.HasDetectionElement(detElemId) )
107 {
108 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
109 for ( Int_t i = 0; i < de->GetNofBusPatches(); ++ i )
110 {
111 Int_t busPatchId = de->GetBusPatchId(i);
112 AddBusPatchHisto(h,busPatchId);
113 }
114 }
115}
116
117//_____________________________________________________________________________
118void
119AliMUONTrackerDataHistogrammer::AddManuHisto(TH1& h, Int_t detElemId, Int_t manuId) const
120{
121 /// Add data from a given manu to histogram
122
123 if ( fData.HasManu(detElemId,manuId) )
124 {
125 for ( Int_t i = 0; i < AliMpConstants::ManuNofChannels(); ++i )
126 {
127 if ( fData.HasChannel(detElemId,manuId,i) )
128 {
129 AliMUONSparseHisto* sh = fData.GetChannelSparseHisto(detElemId,manuId,i);
130
131 if ( sh )
132 {
133 Add(h,*sh);
134 }
135 }
136 }
137 }
138}
139
140
141//_____________________________________________________________________________
142TH1*
143AliMUONTrackerDataHistogrammer::CreateBusPatchHisto(Int_t busPatchId) const
144{
145 /// Create histogram of a given bus patch. Note that in order
146 /// to keep memory footprint as low as possible, you should delete
147 /// the returned pointer as soon as possible...
148
149 TH1* h(0x0);
150
151 if ( fData.HasBusPatch(busPatchId) && fData.IsHistogrammed(fDim))
152 {
153 h = CreateHisto(Form("BP%04d_%d",busPatchId,fDim));
154 if ( h ) AddBusPatchHisto(*h,busPatchId);
155 }
156
157 return h;
158}
159
160
161//_____________________________________________________________________________
162TH1*
163AliMUONTrackerDataHistogrammer::CreateChamberHisto(Int_t chamberId) const
164{
165 /// Create histogram of a given chamber. Note that in order
166 /// to keep memory footprint as low as possible, you should delete
167 /// the returned pointer as soon as possible...
168
169 TH1* h(0x0);
170
171 if ( fData.HasChamber(chamberId) && fData.IsHistogrammed(fDim))
172 {
173 h = CreateHisto(Form("CHAMBER%02d_%d",chamberId,fDim));
174 if ( h )
175 {
176 AliMpDEIterator it;
177 it.First(chamberId);
178 while ( !it.IsDone() )
179 {
180 Int_t detElemId = it.CurrentDEId();
181 AddDEHisto(*h,detElemId);
182 it.Next();
183 }
184 }
185 }
186
187 return h;
188}
189
190//_____________________________________________________________________________
191TH1*
192AliMUONTrackerDataHistogrammer::CreateChannelHisto(Int_t detElemId, Int_t manuId,
193 Int_t manuChannel) const
194{
195 /// Create histogram of a given channel. Note that in order
196 /// to keep memory footprint as low as possible, you should delete
197 /// the returned pointer as soon as possible...
198
199 if ( fData.HasChannel(detElemId, manuId, manuChannel) && fData.IsHistogrammed(fDim) )
200 {
201 AliMUONSparseHisto* sh = fData.GetChannelSparseHisto(detElemId,manuId,manuChannel);
202
203 if ( sh )
204 {
205 TH1* h = CreateHisto(Form("DE%04dMANU%04dCH%02d_%d",detElemId,manuId,manuChannel,fDim));
206 if (h )
207 {
208 Add(*h,*sh);
209 }
210 return h;
211 }
212 }
213 return 0x0;
214}
215
216//_____________________________________________________________________________
217TH1*
218AliMUONTrackerDataHistogrammer::CreateDEHisto(Int_t detElemId) const
219{
220 /// Create histogram of a given detection element. Note that in order
221 /// to keep memory footprint as low as possible, you should delete
222 /// the returned pointer as soon as possible...
223
224 TH1* h(0x0);
225
226 if ( fData.HasDetectionElement(detElemId) && fData.IsHistogrammed(fDim) )
227 {
228 h = CreateHisto(Form("DE%04d-%d",detElemId,fDim));
229 if (h) AddDEHisto(*h,detElemId);
230 }
231
232 return h;
233}
234
235//_____________________________________________________________________________
236TH1*
237AliMUONTrackerDataHistogrammer::CreateHisto(const AliMUONVPainter& painter)
238{
239 /// Create an histogram, from given dim of given data,
240 /// for all the channels handled by painter
241
242 AliMUONPainterGroup* group = painter.Master()->PlotterGroup();
243
244 if ( !group ) return 0x0; // no data to histogram in this painter
245
246 AliMUONVTrackerData* data = group->Data();
247 Int_t dim = data->InternalToExternal(group->DataIndex());
248
249 AliMUONTrackerDataHistogrammer tdh(*data,dim);
250
251 TObjArray manuArray;
252
253 painter.FillManuList(manuArray);
254
255 AliMpManuUID* mid;
256 TIter next(&manuArray);
257
258 TH1* histo = tdh.CreateHisto(Form("%s-%s",painter.PathName().Data(),painter.Attributes().GetName()));
259
260 while ( ( mid = static_cast<AliMpManuUID*>(next()) ) )
261 {
262 TH1* h = tdh.CreateManuHisto(mid->DetElemId(),mid->ManuId());
263 if ( h )
264 {
265 histo->Add(h);
266 }
267 delete h;
268 }
269
270 return histo;
271}
272
273//_____________________________________________________________________________
274TH1*
275AliMUONTrackerDataHistogrammer::CreateHisto(const char* name) const
276{
277 /// Create a single histogram
278
279 Double_t xmin, xmax;
280
281 fData.HistogramRange(xmin,xmax);
282
283 TH1* h(0x0);
284
285 if ( xmin != xmax )
286 {
287 h = new TH1I(name,Form("Data=%s Dim=%s",
288 fData.GetName(),
289 fData.ExternalDimensionName(fDim).Data()),
290 (1<<12),
291 xmin-0.5,
292 xmax-0.5);
293 h->SetDirectory(0);
294 }
295 return h;
296}
297
298
299//_____________________________________________________________________________
300TH1*
301AliMUONTrackerDataHistogrammer::CreateManuHisto(Int_t detElemId, Int_t manuId) const
302{
303 /// Create histogram of a given manu. Note that in order
304 /// to keep memory footprint as low as possible, you should delete
305 /// the returned pointer as soon as possible...
306
307 TH1* h(0x0);
308
309 if ( fData.HasManu(detElemId, manuId) && fData.IsHistogrammed(fDim) )
310 {
311 h = CreateHisto(Form("DE%04dMANU%04d_%d",detElemId,manuId,fDim));
312 if ( h ) AddManuHisto(*h,detElemId,manuId);
313 }
314
315 return h;
316}
317