]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliQADataMakerSim.cxx
Added QA for digits during reconstruction (Yves)
[u/mrichter/AliRoot.git] / STEER / AliQADataMakerSim.cxx
CommitLineData
04236e67 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
17/* $Id$ */
18
202374b1 19//
20// Base Class
21// Produces the data needed to calculate the quality assurance.
22// All data must be mergeable objects.
23// Y. Schutz CERN July 2007
24//
04236e67 25
26// --- ROOT system ---
7d297381 27#include <TCanvas.h>
04236e67 28#include <TFile.h>
04236e67 29#include <TTree.h>
30#include <TClonesArray.h>
31
32// --- Standard library ---
33
34// --- AliRoot header files ---
35#include "AliLog.h"
36#include "AliQADataMakerSim.h"
04236e67 37
38ClassImp(AliQADataMakerSim)
39
40//____________________________________________________________________________
41AliQADataMakerSim::AliQADataMakerSim(const char * name, const char * title) :
42 AliQADataMaker(name, title),
43 fDigitsQAList(0x0),
44 fHitsQAList(0x0),
45 fSDigitsQAList(0x0)
46{
47 // ctor
48 fDetectorDirName = GetName() ;
49}
50
51//____________________________________________________________________________
52AliQADataMakerSim::AliQADataMakerSim(const AliQADataMakerSim& qadm) :
53 AliQADataMaker(qadm.GetName(), qadm.GetTitle()),
54 fDigitsQAList(qadm.fDigitsQAList),
55 fHitsQAList(qadm.fHitsQAList),
56 fSDigitsQAList(qadm.fSDigitsQAList)
57{
58 //copy ctor
59 fDetectorDirName = GetName() ;
60}
61
63c6f8ae 62//____________________________________________________________________________
63AliQADataMakerSim::~AliQADataMakerSim()
64{
65 //dtor: delete the TObjArray and thei content
7ff8385d 66 if ( fDigitsQAList ) {
57acd2d2 67 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
68 if ( fDigitsQAList[specie]->IsOwner() )
69 fDigitsQAList[specie]->Delete() ;
70 }
71 delete[] fDigitsQAList ;
7ff8385d 72 }
73 if ( fHitsQAList ) {
57acd2d2 74 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
75 if ( fHitsQAList[specie]->IsOwner() )
76 fHitsQAList[specie]->Delete() ;
77 }
78 delete[] fHitsQAList ;
7ff8385d 79 }
80 if ( fSDigitsQAList ) {
57acd2d2 81 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
82 if ( fSDigitsQAList[specie]->IsOwner() )
83 fSDigitsQAList[specie]->Delete() ;
84 }
85 delete[] fSDigitsQAList ;
7ff8385d 86 }
63c6f8ae 87}
88
04236e67 89//__________________________________________________________________
90AliQADataMakerSim& AliQADataMakerSim::operator = (const AliQADataMakerSim& qadm )
91{
92 // Assignment operator.
93 this->~AliQADataMakerSim();
94 new(this) AliQADataMakerSim(qadm);
95 return *this;
96}
97
930e6e3e 98//____________________________________________________________________________
99void AliQADataMakerSim::EndOfCycle()
100{
101 // Finishes a cycle of QA for all tasks
4e25ac79 102 EndOfCycle(AliQAv1::kHITS) ;
103 EndOfCycle(AliQAv1::kSDIGITS) ;
104 EndOfCycle(AliQAv1::kDIGITS) ;
930e6e3e 105 ResetCycle() ;
106}
107
04236e67 108//____________________________________________________________________________
4e25ac79 109void AliQADataMakerSim::EndOfCycle(AliQAv1::TASKINDEX_t task)
04236e67 110{
111 // Finishes a cycle of QA data acquistion
57acd2d2 112 TObjArray ** list = NULL ;
04236e67 113
4e25ac79 114 if ( task == AliQAv1::kHITS )
04236e67 115 list = fHitsQAList ;
4e25ac79 116 else if ( task == AliQAv1::kSDIGITS )
04236e67 117 list = fSDigitsQAList ;
4e25ac79 118 else if ( task == AliQAv1::kDIGITS )
04236e67 119 list = fDigitsQAList ;
930e6e3e 120
121 if ( ! list )
122 return ;
04236e67 123 EndOfDetectorCycle(task, list) ;
6294b9a7 124 TDirectory * subDir = NULL ;
125 if (fDetectorDir)
4e25ac79 126 subDir = fDetectorDir->GetDirectory(AliQAv1::GetTaskName(task)) ;
ccbf0759 127 if (subDir) {
128 subDir->cd() ;
57acd2d2 129 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
130 TDirectory * eventSpecieDir = subDir->GetDirectory(AliRecoParam::GetEventSpecieName(specie)) ;
131 if (eventSpecieDir) {
132 eventSpecieDir->cd() ;
133 TIter next(list[specie]) ;
134 TObject * obj ;
135 while ( (obj = next()) ) {
4e25ac79 136 if (!obj->TestBit(AliQAv1::GetExpertBit()))
57acd2d2 137 obj->Write() ;
138 }
139 if (WriteExpert()) {
4e25ac79 140 TDirectory * expertDir = eventSpecieDir->GetDirectory(AliQAv1::GetExpert()) ;
57acd2d2 141 if ( expertDir ) {
142 expertDir->cd() ;
143 next.Reset() ;
144 while ( (obj = next()) ) {
4e25ac79 145 if (!obj->TestBit(AliQAv1::GetExpertBit()))
57acd2d2 146 continue ;
147 obj->Write() ;
148 }
149 }
150 }
b1af1125 151 }
6e65319c 152 }
57acd2d2 153 fOutput->Save() ;
6e65319c 154 }
7d297381 155 MakeImage(task) ;
04236e67 156}
157
158//____________________________________________________________________________
4e25ac79 159void AliQADataMakerSim::Exec(AliQAv1::TASKINDEX_t task, TObject * data)
04236e67 160{
161 // creates the quality assurance data for the various tasks (Hits, SDigits, Digits, ESDs)
162
4e25ac79 163 if ( task == AliQAv1::kHITS ) {
5379c4a3 164 AliDebug(AliQAv1::GetQADebugLevel(), "Processing Hits QA") ;
04236e67 165 TClonesArray * arr = dynamic_cast<TClonesArray *>(data) ;
166 if (arr) {
167 MakeHits(arr) ;
168 } else {
169 TTree * tree = dynamic_cast<TTree *>(data) ;
170 if (tree) {
171 MakeHits(tree) ;
172 } else {
173 AliWarning("data are neither a TClonesArray nor a TTree") ;
174 }
175 }
4e25ac79 176 } else if ( task == AliQAv1::kSDIGITS ) {
5379c4a3 177 AliDebug(AliQAv1::GetQADebugLevel(), "Processing SDigits QA") ;
04236e67 178 TClonesArray * arr = dynamic_cast<TClonesArray *>(data) ;
179 if (arr) {
180 MakeSDigits(arr) ;
181 } else {
182 TTree * tree = dynamic_cast<TTree *>(data) ;
183 if (tree) {
184 MakeSDigits(tree) ;
185 } else {
186 AliWarning("data are neither a TClonesArray nor a TTree") ;
187 }
188 }
4e25ac79 189 } else if ( task == AliQAv1::kDIGITS ) {
5379c4a3 190 AliDebug(AliQAv1::GetQADebugLevel(), "Processing Digits QA") ;
04236e67 191 TClonesArray * arr = dynamic_cast<TClonesArray *>(data) ;
192 if (arr) {
193 MakeDigits(arr) ;
194 } else {
195 TTree * tree = dynamic_cast<TTree *>(data) ;
196 if (tree) {
197 MakeDigits(tree) ;
198 } else {
199 AliWarning("data are neither a TClonesArray nor a TTree") ;
200 }
201 }
202 }
203}
204
7d297381 205//____________________________________________________________________________
206void AliQADataMakerSim::MakeImage(AliQAv1::TASKINDEX_t task)
207{
208 // create a drawing of detetor defined histograms
209 TObjArray ** list = NULL ;
210 switch (task) {
211 case AliQAv1::kRAWS:
212 break;
213 case AliQAv1::kHITS:
214 list = fHitsQAList ;
215 break;
216 case AliQAv1::kSDIGITS:
217 list = fSDigitsQAList ;
218 break;
219 case AliQAv1::kDIGITS:
220 list = fDigitsQAList ;
221 break;
44ed7a66 222 case AliQAv1::kDIGITSR:
223 break;
7d297381 224 case AliQAv1::kRECPOINTS:
225 break;
226 case AliQAv1::kTRACKSEGMENTS:
227 break;
228 case AliQAv1::kRECPARTICLES:
229 break;
230 case AliQAv1::kESDS:
231 break;
232 case AliQAv1::kNTASKINDEX:
233 break;
234 default:
235 break;
236 }
237 if ( !list) {
238 AliFatal("data not initialized, call AliQADataMaker::Init");
239 return ;
240 }
241 TIter next(list[0]) ;
242 TH1 * hdata = NULL ;
243 Int_t nImages = 0 ;
244 while ( (hdata=dynamic_cast<TH1 *>(next())) ) {
245 if ( hdata->TestBit(AliQAv1::GetImageBit()) )
246 nImages++;
247 }
248 if ( nImages == 0 ) {
5379c4a3 249 AliWarning(Form("No histogram will be plotted for %s %s\n", GetName(), AliQAv1::GetTaskName(task).Data())) ;
7d297381 250 } else {
5379c4a3 251 AliDebug(AliQAv1::GetQADebugLevel(), Form("%d histograms will be plotted for %s %s\n", nImages, GetName(), AliQAv1::GetTaskName(task).Data())) ;
7d297381 252 Double_t w = 1000 ;
253 Double_t h = 1000 ;
254 for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) {
255 TCanvas * canvasQA = new TCanvas(Form("QA_%s_%s_%s",
256 GetName(),
257 AliQAv1::GetTaskName(task).Data(),
258 AliRecoParam::GetEventSpecieName(esIndex)),
259 Form("QA control plots for det=%s task=%s eventspecie=%s",
260 GetName(),
261 AliQAv1::GetTaskName(task).Data(),
262 AliRecoParam::GetEventSpecieName(esIndex)),
263 w, h) ;
264 canvasQA->SetWindowSize(w + (w - canvasQA->GetWw()), h + (h - canvasQA->GetWh())) ;
265 Int_t nx = TMath::Sqrt(nImages) ;
266 Int_t ny = nx ;
267 if ( nx < TMath::Sqrt(nImages))
268 ny++ ;
269 canvasQA->Divide(nx, ny) ;
270 TIter nexthist(list[esIndex]) ;
271 TH1* hist = NULL ;
272 Int_t npad = 1 ;
273 canvasQA->cd(npad) ;
274 while ( (hist=dynamic_cast<TH1*>(nexthist())) ) {
275 if(hist->TestBit(AliQAv1::GetImageBit())) {
276 hist->Draw() ;
277 canvasQA->cd(++npad) ;
278 }
279 }
5379c4a3 280 if ( AliDebugLevel() == AliQAv1::GetQADebugLevel() )
281 canvasQA->Print() ;
7d297381 282 }
283 }
284}
285
04236e67 286//____________________________________________________________________________
4e25ac79 287TObjArray ** AliQADataMakerSim::Init(AliQAv1::TASKINDEX_t task, Int_t cycles)
04236e67 288{
289 // general intialisation
290
04236e67 291 if (cycles > 0)
292 SetCycle(cycles) ;
57acd2d2 293 TObjArray ** rv = NULL ;
4e25ac79 294 if ( task == AliQAv1::kHITS ) {
63c6f8ae 295 if ( ! fHitsQAList ) {
57acd2d2 296 fHitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
297 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
298 fHitsQAList[specie] = new TObjArray(100) ;
4e25ac79 299 fHitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
57acd2d2 300 }
63c6f8ae 301 InitHits() ;
302 }
04236e67 303 rv = fHitsQAList ;
4e25ac79 304 } else if ( task == AliQAv1::kSDIGITS ) {
63c6f8ae 305 if ( ! fSDigitsQAList ) {
57acd2d2 306 fSDigitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
307 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
308 fSDigitsQAList[specie] = new TObjArray(100) ;
4e25ac79 309 fSDigitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
57acd2d2 310 }
311 InitSDigits() ;
63c6f8ae 312 }
04236e67 313 rv = fSDigitsQAList ;
4e25ac79 314 } else if ( task == AliQAv1::kDIGITS ) {
63c6f8ae 315 if ( ! fDigitsQAList ) {
57acd2d2 316 fDigitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
317 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
318 fDigitsQAList[specie] = new TObjArray(100) ;
4e25ac79 319 fDigitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
57acd2d2 320 }
63c6f8ae 321 InitDigits() ;
322 }
04236e67 323 rv = fDigitsQAList ;
324 }
325
326 return rv ;
327}
328
329//____________________________________________________________________________
4e25ac79 330void AliQADataMakerSim::Init(AliQAv1::TASKINDEX_t task, TObjArray ** list, Int_t run, Int_t cycles)
04236e67 331{
332 // Intialisation by passing the list of QA data booked elsewhere
333
334 fRun = run ;
335 if (cycles > 0)
336 SetCycle(cycles) ;
337
4e25ac79 338 if ( task == AliQAv1::kHITS ) {
04236e67 339 fHitsQAList = list ;
4e25ac79 340 } else if ( task == AliQAv1::kSDIGITS) {
04236e67 341 fSDigitsQAList = list ;
4e25ac79 342 } else if ( task == AliQAv1::kDIGITS ) {
04236e67 343 fDigitsQAList = list ;
344 }
345}
346
347//____________________________________________________________________________
930e6e3e 348void AliQADataMakerSim::StartOfCycle(Int_t run)
349{
350 // Finishes a cycle of QA for all tasks
351 Bool_t samecycle = kFALSE ;
4e25ac79 352 StartOfCycle(AliQAv1::kHITS, run, samecycle) ;
930e6e3e 353 samecycle = kTRUE ;
4e25ac79 354 StartOfCycle(AliQAv1::kSDIGITS, run, samecycle) ;
355 StartOfCycle(AliQAv1::kDIGITS, run, samecycle) ;
930e6e3e 356}
357
358//____________________________________________________________________________
4e25ac79 359void AliQADataMakerSim::StartOfCycle(AliQAv1::TASKINDEX_t task, Int_t run, const Bool_t sameCycle)
04236e67 360{
361 // Finishes a cycle of QA data acquistion
930e6e3e 362 if ( run > 0 )
363 fRun = run ;
04236e67 364 if ( !sameCycle || fCurrentCycle == -1) {
365 ResetCycle() ;
366 if (fOutput)
367 fOutput->Close() ;
4e25ac79 368 fOutput = AliQAv1::GetQADataFile(GetName(), fRun) ;
04236e67 369 }
370
5379c4a3 371 AliDebug(AliQAv1::GetQADebugLevel(), Form(" Run %d Cycle %d task %s file %s",
4e25ac79 372 fRun, fCurrentCycle, AliQAv1::GetTaskName(task).Data(), fOutput->GetName() )) ;
04236e67 373
374 fDetectorDir = fOutput->GetDirectory(GetDetectorDirName()) ;
375 if (!fDetectorDir)
376 fDetectorDir = fOutput->mkdir(GetDetectorDirName()) ;
377
4e25ac79 378 TDirectory * subDir = fDetectorDir->GetDirectory(AliQAv1::GetTaskName(task)) ;
04236e67 379 if (!subDir)
4e25ac79 380 subDir = fDetectorDir->mkdir(AliQAv1::GetTaskName(task)) ;
6e65319c 381
57acd2d2 382 for ( Int_t index = AliRecoParam::kDefault ; index < AliRecoParam::kNSpecies ; index++ ) {
383 TDirectory * eventSpecieDir = subDir->GetDirectory(AliRecoParam::GetEventSpecieName(index)) ;
384 if (!eventSpecieDir)
385 eventSpecieDir = subDir->mkdir(AliRecoParam::GetEventSpecieName(index)) ;
4e25ac79 386 TDirectory * expertDir = eventSpecieDir->GetDirectory(AliQAv1::GetExpert()) ;
57acd2d2 387 if (!expertDir)
4e25ac79 388 expertDir = eventSpecieDir->mkdir(AliQAv1::GetExpert()) ;
57acd2d2 389 }
04236e67 390 StartOfDetectorCycle() ;
391}