]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TRD/qaGui/AliTRDqaGuiClustersStack.cxx
fixing Coverity notifications
[u/mrichter/AliRoot.git] / TRD / qaGui / AliTRDqaGuiClustersStack.cxx
CommitLineData
36f55715 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: AliTRDqaGuiClustersStack.cxx 23871 2008-02-12 11:48:20Z hristov $ */
17
18//////////////////////////////////////////////////////////////////////////////////
19//
20// This class is a Graphical User Interface for the Quality Monitorig
21// of clusters on the stack by stack basis.
22// It lets display and browse throu histograms created by
23// the AliTRDQADataMakerRec run during the reconstruction
24//
25// S. Radomski
26// Uni-Heidelberg
27// Feb. 2008
28//
29//////////////////////////////////////////////////////////////////////////////////
30
31#include "AliTRDqaGuiClustersStack.h"
32
33#include "TH1D.h"
34#include "TH2D.h"
35#include "TH3D.h"
36#include "TFile.h"
37#include "TCanvas.h"
38#include "TString.h"
39#include "TSystem.h"
40
41#include "TPaveText.h"
42#include "TGLabel.h"
43#include "TGComboBox.h"
44#include "TGButton.h"
45#include "TRootEmbeddedCanvas.h"
46
47ClassImp(AliTRDqaGuiClustersStack)
48
49const Int_t AliTRDqaGuiClustersStack::fgknSM = 18;
50const Int_t AliTRDqaGuiClustersStack::fgknStack = 5;
51const Int_t AliTRDqaGuiClustersStack::fgknCh = 6;
52
53
54AliTRDqaGuiClustersStack::AliTRDqaGuiClustersStack()
55 : fIdxSM (0),
56 fIdxStack (0),
57 fView (0),
821ef0a9 58 fFileName (0x0),
36f55715 59 fGPanel (0),
60 fGCanvas (0),
61 fGSelectSM (0),
62 fGSelectStack (0),
63 fGSelectView (0),
64 fGPrevSM (0),
65 fGPrevStack (0),
66 fGNextSM (0),
67 fGNextStack (0),
68 fGPlay (0)
69{
02f3bfcc 70 //
71 // Default constructor
72 //
73
74 for (Int_t i = 0; i < 6; i++) {
75 fCanvasList[i] = 0x0;
76 fHistList[i] = 0x0;
77 }
78
821ef0a9 79 //strncpy(fFileName,"",256);
36f55715 80
81}
36f55715 82
02f3bfcc 83//////////////////////////////////////////////////////////////////////////////////
36f55715 84AliTRDqaGuiClustersStack::AliTRDqaGuiClustersStack(TGWindow *parent)
85 : TGCompositeFrame(parent, 720, 500),
86 fIdxSM (0),
87 fIdxStack (0),
88 fView (0),
821ef0a9 89 fFileName (0x0),
36f55715 90 fGPanel (0),
91 fGCanvas (0),
92 fGSelectSM (0),
93 fGSelectStack (0),
94 fGSelectView (0),
95 fGPrevSM (0),
96 fGPrevStack (0),
97 fGNextSM (0),
98 fGNextStack (0),
99 fGPlay (0)
100{
101 //
102 // Main constructor
103 //
104
105 fIdxSM = 0;
106 fIdxStack = 0;
107
108 // steering panel
109
110 SetLayoutManager(new TGVerticalLayout(this));
111
112 fGPanel = new TGHorizontalFrame(this);
113
114 // fGLabel = new TGLabel(fGPanel, "Current Stack: ");
115 fGPrevSM = new TGTextButton(fGPanel, "Prev SM");
116 fGPrevStack = new TGTextButton(fGPanel, "Prev Stack");
117
118 fGNextSM = new TGTextButton(fGPanel, "Next SM");
119 fGNextStack = new TGTextButton(fGPanel, "Next Stack");
120
121 fGSelectSM = new TGComboBox(fGPanel);
122 for(int i=0; i<fgknSM; i++) fGSelectSM->AddEntry(Form("SM %d", i), i);
a73a87be 123 fGSelectSM->Resize(100, (Int_t)(fGPrevSM->GetHeight()*1.4));
36f55715 124 fGSelectSM->Select(fIdxSM);
125
126 fGSelectStack = new TGComboBox(fGPanel);
127 for(int i=0; i<fgknStack; i++) fGSelectStack->AddEntry(Form("Stack %d", i), i);
a73a87be 128 fGSelectStack->Resize(100, (Int_t)(fGPrevSM->GetHeight()*1.4));
36f55715 129 fGSelectStack->Select(fIdxStack);
130
131 fGPlay = new TGTextButton(fGPanel, "PLAY");
132
133 fGSelectView = new TGComboBox(fGPanel);
134 fGSelectView->AddEntry("amplitude",0);
135 fGSelectView->AddEntry("time -- signal MPV", 1);
136 fGSelectView->AddEntry("time -- total charge", 2);
137 fGSelectView->AddEntry("time -- nClusters", 3);
a73a87be 138 fGSelectView->Resize(150, (Int_t)(fGPrevSM->GetHeight()*1.4));
36f55715 139 fGSelectView->Select(0);
140
141 TGLayoutHints *hint = new TGLayoutHints(kLHintsNormal, 5, 5, 5, 5);
142
143 // fGPanel->AddFrame(fGLabel, hint);
144 fGPanel->AddFrame(fGPrevSM, hint);
145 fGPanel->AddFrame(fGPrevStack, hint);
146
147 fGPanel->AddFrame(fGSelectSM, hint);
148 fGPanel->AddFrame(fGSelectStack, hint);
149
150 fGPanel->AddFrame(fGNextStack, hint);
151 fGPanel->AddFrame(fGNextSM, hint);
152
153 fGPanel->AddFrame(fGPlay, hint);
154
155 fGPanel->AddFrame(fGSelectView, hint);
156
157
158 AddFrame(fGPanel);
159
160 // panel logic
161 fGPrevStack->Connect("Clicked()", "AliTRDqaGuiClustersStack", this, "PreviusStack()");
162 fGNextStack->Connect("Clicked()", "AliTRDqaGuiClustersStack", this, "NextStack()");
163 fGPrevSM->Connect("Clicked()", "AliTRDqaGuiClustersStack", this, "PreviusSM()");
164 fGNextSM->Connect("Clicked()", "AliTRDqaGuiClustersStack", this, "NextSM()");
165
166 fGSelectSM->Connect("Selected(Int_t)", "AliTRDqaGuiClustersStack", this, "SelectSM(Int_t)");
167 fGSelectStack->Connect("Selected(Int_t)", "AliTRDqaGuiClustersStack", this, "SelectStack(Int_t)");
168 fGSelectView->Connect("Selected(Int_t)", "AliTRDqaGuiClustersStack", this, "SelectView(Int_t)");
169
170 //fGPlay->Connect("Clicked()", "AliTRDqaGuiClustersStack", this, "Play()");
171
172 // histograms
173 /**/
174 fGCanvas = new TGCompositeFrame(this);
175 fGCanvas->SetLayoutManager(new TGMatrixLayout(fGCanvas,2,3,1,1));
176
177 for(Int_t i=0; i<fgknCh; i++) {
178 fCanvasList[i] = new TRootEmbeddedCanvas(Form("L%d",i), fGCanvas, 320, 300);
179 fGCanvas->AddFrame(fCanvasList[i]);
180 fCanvasList[i]->GetCanvas()->SetRightMargin(0.05);
181 }
182
183 for(Int_t i=0; i<4; i++) {
184 fHistList[i] = 0;
185 }
186
187 AddFrame(fGCanvas);
188 /**/
189}
190
191//////////////////////////////////////////////////////////////////////////////////
192
193void AliTRDqaGuiClustersStack::SetQAFile(const char *filename) {
194 //
195 // Sets a file with histograms
196 //
197
821ef0a9 198 //strncpy(fFileName,filename,256);
199 fFileName = filename;
36f55715 200
201 for(Int_t i=0; i<fgknCh; i++) {
202 if (fHistList[i]) delete fHistList[i];
203 fHistList[i] = 0;
204 }
205
206 TFile *file = new TFile(filename);
207 file->cd("TRD/RecPoints");
208
209 // const char *opt[2] = {"colz", ""};
210 if (fView == 0) CreateHistAmplitude();
211 if (fView == 1) CreateHistTimeMPV();
212 if (fView == 2 || fView == 3) CreateHistTimeCharge();
213
214 for(Int_t i=0; i<fgknCh; i++) {
215 fCanvasList[i]->GetCanvas()->cd();
216 if (fHistList[i]) fHistList[i]->Draw(); //opt[i]);
217 fCanvasList[i]->GetCanvas()->Update();
218 }
219
220 // style
221 // for(Int_t i=0; i<fgknCh; i++) {
222 // TPaveText *title = (TPaveText*)fCanvasList[i]->GetCanvas()->FindObject("title");
223 // title->SetX1NDC(0.7);
224 // title->SetX2NDC(0.95);
225 // }
226}
227
228//////////////////////////////////////////////////////////////////////////////////
229
230void AliTRDqaGuiClustersStack::SetStack(Int_t idxStack) {
231 //
232 // sets active stack
233 //
234
235 fIdxStack = idxStack;
236 fGSelectSM->Select(fIdxSM, 0);
237 fGSelectStack->Select(fIdxStack, 0);
238 SetQAFile(fFileName);
239}
240
241//////////////////////////////////////////////////////////////////////////////////
242
243void AliTRDqaGuiClustersStack::SetSM(Int_t idxSM) {
244 //
245 // sets active super module
246 //
247
248 fIdxSM = idxSM;
249 fGSelectSM->Select(fIdxSM, 0);
250 fGSelectStack->Select(fIdxStack, 0);
251 SetQAFile(fFileName);
252}
253
254//////////////////////////////////////////////////////////////////////////////////
255
256void AliTRDqaGuiClustersStack::SetView(Int_t idxView) {
257 //
258 // sets active data type
259 //
260
261 fView = idxView;
262 fGSelectView->Select(idxView);
263 SetQAFile(fFileName);
264}
265
266//////////////////////////////////////////////////////////////////////////////////
267
268void AliTRDqaGuiClustersStack::CreateHistTimeMPV() {
269 //
270 // builds histograms of the Most Probable Value distribution
271 // chamber-by-chamber from a 2D distribution
272 //
273
274
275 TH2D *fData = (TH2D*)gDirectory->Get(Form("qaTRD_recPoints_sigTime_sm%d", fIdxSM));
276 if (!fData) return;
277
278 Int_t nBins = fData->GetYaxis()->GetNbins();
279 Double_t min = fData->GetYaxis()->GetXmin();
280 Double_t max = fData->GetYaxis()->GetXmax();
281
282 for(Int_t i=0; i<fgknCh; i++) {
283
284 //printf("I = %d\n", i);
285
286 Int_t det = fgknCh * fIdxStack + i;
287 fHistList[i] = new TH1D(Form("det%d",det), Form("Det = %d;time bin; MPV",det), nBins, min, max);
288
289 // fill the histograms;
290 for(Int_t j=1; j<nBins+2; j++) {
291
292 Double_t c = fHistList[i]->GetBinCenter(j);
293 Int_t bin = fData->FindBin(det, c);
294 Double_t value = fData->GetBinContent(bin);
295 fHistList[i]->SetBinContent(j, value);
296 // printf("..j=%d c=%lf bin=%d value=%lf\n", j, c, bin, value);
297 }
298 }
299}
300
301//////////////////////////////////////////////////////////////////////////////////
302
303void AliTRDqaGuiClustersStack::CreateHistAmplitude() {
304 //
305 // builds histograms with amplitude
306 //
307
308 //Info("createHist", "start");
309
310 TH2D *fData = (TH2D*)gDirectory->Get("qaTRD_recPoints_amp");
311 if (!fData) return;
312
313 Int_t nBins = fData->GetYaxis()->GetNbins();
314 Double_t min = fData->GetYaxis()->GetXmin();
315 Double_t max = fData->GetYaxis()->GetXmax();
316
317 for(Int_t i=0; i<fgknCh; i++) {
318
319 //printf("I = %d\n", i);
320 //if (fHistList[i]) delete fHistList[i];
321
322 Int_t det = fgknCh * fgknStack * fIdxSM + fgknCh * fIdxStack + i;
323 fHistList[i] = new TH1D(Form("det%d",det), Form("Det = %d;amplidtude",det), nBins, min, max);
324
325 // fill the histograms;
326 for(Int_t j=1; j<nBins+2; j++) {
327 //printf("..j=%d\n", j);
328 Double_t c = fHistList[i]->GetBinCenter(j);
329 Int_t bin = fData->FindBin(det, c);
330 Double_t value = fData->GetBinContent(bin);
331 fHistList[i]->SetBinContent(j, value);
332 }
333 }
334}
335
336//////////////////////////////////////////////////////////////////////////////////
337
338void AliTRDqaGuiClustersStack::CreateHistTimeCharge() {
339 //
340 // builds histograms with time-charge distribution
341 //
342
343 TH3D *fData = (TH3D*)gDirectory->Get("qaTRD_recPoints_sigTime");
344 if (!fData) return;
345
346 Int_t nBins = fData->GetYaxis()->GetNbins();
347 //Int_t nBinsCharge = fData->GetZaxis()->GetNbins();
348 Double_t min = fData->GetYaxis()->GetXmin();
349 Double_t max = fData->GetYaxis()->GetXmax();
350
351 for(Int_t i=0; i<fgknCh; i++) {
352
353 //printf("I = %d\n", i);
354 //if (fHistList[i]) delete fHistList[i];
355
356 Int_t det = fgknCh * fgknStack * fIdxSM + fgknCh * fIdxStack + i;
357 const char *yaxis[2] = {"total charge", "number of clusters"};
358 fHistList[i] = new TH1D(Form("det%d",det), Form("Det = %d;time bin;%s",det,yaxis[fView-2]), nBins, min, max);
359
360 // fill the histograms;
361 for(Int_t j=1; j<nBins+1; j++) {
362
363 Double_t charge = 0;
364 Double_t ncls = 0;
365 for(Int_t k=0; k<201; k++) { // needs more robust loop
366 Int_t bin = fData->FindBin(det, fHistList[i]->GetBinCenter(j), k);
367 Double_t v = fData->GetBinContent(bin);
368 charge += k * v;
369 ncls += v;
370 }
371 // if (ncls > 1)
372 if (fView == 2)
373 fHistList[i]->SetBinContent(j, charge);
374
375 if (fView == 3)
376 fHistList[i]->SetBinContent(j, ncls);
377 }
378 }
379}
380
381//////////////////////////////////////////////////////////////////////////////////