]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliQADataMakerSim.cxx
First version of class for
[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++) {
71f27f1f 255 if ( !fImage[esIndex] ) {
256 fImage[esIndex] = new TCanvas(Form("QA_%s_%s_%s",
257 GetName(),
258 AliQAv1::GetTaskName(task).Data(),
259 AliRecoParam::GetEventSpecieName(esIndex)),
260 Form("QA control plots for det=%s task=%s eventspecie=%s",
261 GetName(),
262 AliQAv1::GetTaskName(task).Data(),
263 AliRecoParam::GetEventSpecieName(esIndex)),
264 w, h) ;
265 fImage[esIndex]->SetWindowSize(w + (w - fImage[esIndex]->GetWw()), h + (h - fImage[esIndex]->GetWh())) ;
266 Int_t nx = TMath::Sqrt(nImages) ;
267 Int_t ny = nx ;
268 if ( nx < TMath::Sqrt(nImages))
269 ny++ ;
270 fImage[esIndex]->Divide(nx, ny) ;
271 }
272 fImage[esIndex]->Clear() ;
7d297381 273 TIter nexthist(list[esIndex]) ;
274 TH1* hist = NULL ;
275 Int_t npad = 1 ;
71f27f1f 276 fImage[esIndex]->cd(npad) ;
7d297381 277 while ( (hist=dynamic_cast<TH1*>(nexthist())) ) {
278 if(hist->TestBit(AliQAv1::GetImageBit())) {
279 hist->Draw() ;
71f27f1f 280 fImage[esIndex]->cd(++npad) ;
7d297381 281 }
282 }
71f27f1f 283 if (fPrintImage)
284 fImage[esIndex]->Print() ;
7d297381 285 }
286 }
287}
288
04236e67 289//____________________________________________________________________________
4e25ac79 290TObjArray ** AliQADataMakerSim::Init(AliQAv1::TASKINDEX_t task, Int_t cycles)
04236e67 291{
292 // general intialisation
293
04236e67 294 if (cycles > 0)
295 SetCycle(cycles) ;
57acd2d2 296 TObjArray ** rv = NULL ;
4e25ac79 297 if ( task == AliQAv1::kHITS ) {
63c6f8ae 298 if ( ! fHitsQAList ) {
57acd2d2 299 fHitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
300 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
301 fHitsQAList[specie] = new TObjArray(100) ;
4e25ac79 302 fHitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
57acd2d2 303 }
63c6f8ae 304 InitHits() ;
305 }
04236e67 306 rv = fHitsQAList ;
4e25ac79 307 } else if ( task == AliQAv1::kSDIGITS ) {
63c6f8ae 308 if ( ! fSDigitsQAList ) {
57acd2d2 309 fSDigitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
310 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
311 fSDigitsQAList[specie] = new TObjArray(100) ;
4e25ac79 312 fSDigitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
57acd2d2 313 }
314 InitSDigits() ;
63c6f8ae 315 }
04236e67 316 rv = fSDigitsQAList ;
4e25ac79 317 } else if ( task == AliQAv1::kDIGITS ) {
63c6f8ae 318 if ( ! fDigitsQAList ) {
57acd2d2 319 fDigitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
320 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
321 fDigitsQAList[specie] = new TObjArray(100) ;
4e25ac79 322 fDigitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
57acd2d2 323 }
63c6f8ae 324 InitDigits() ;
325 }
04236e67 326 rv = fDigitsQAList ;
327 }
328
329 return rv ;
330}
331
332//____________________________________________________________________________
4e25ac79 333void AliQADataMakerSim::Init(AliQAv1::TASKINDEX_t task, TObjArray ** list, Int_t run, Int_t cycles)
04236e67 334{
335 // Intialisation by passing the list of QA data booked elsewhere
336
337 fRun = run ;
338 if (cycles > 0)
339 SetCycle(cycles) ;
340
4e25ac79 341 if ( task == AliQAv1::kHITS ) {
04236e67 342 fHitsQAList = list ;
4e25ac79 343 } else if ( task == AliQAv1::kSDIGITS) {
04236e67 344 fSDigitsQAList = list ;
4e25ac79 345 } else if ( task == AliQAv1::kDIGITS ) {
04236e67 346 fDigitsQAList = list ;
347 }
348}
349
350//____________________________________________________________________________
930e6e3e 351void AliQADataMakerSim::StartOfCycle(Int_t run)
352{
353 // Finishes a cycle of QA for all tasks
354 Bool_t samecycle = kFALSE ;
4e25ac79 355 StartOfCycle(AliQAv1::kHITS, run, samecycle) ;
930e6e3e 356 samecycle = kTRUE ;
4e25ac79 357 StartOfCycle(AliQAv1::kSDIGITS, run, samecycle) ;
358 StartOfCycle(AliQAv1::kDIGITS, run, samecycle) ;
930e6e3e 359}
360
361//____________________________________________________________________________
4e25ac79 362void AliQADataMakerSim::StartOfCycle(AliQAv1::TASKINDEX_t task, Int_t run, const Bool_t sameCycle)
04236e67 363{
364 // Finishes a cycle of QA data acquistion
930e6e3e 365 if ( run > 0 )
366 fRun = run ;
04236e67 367 if ( !sameCycle || fCurrentCycle == -1) {
368 ResetCycle() ;
369 if (fOutput)
370 fOutput->Close() ;
4e25ac79 371 fOutput = AliQAv1::GetQADataFile(GetName(), fRun) ;
04236e67 372 }
373
5379c4a3 374 AliDebug(AliQAv1::GetQADebugLevel(), Form(" Run %d Cycle %d task %s file %s",
4e25ac79 375 fRun, fCurrentCycle, AliQAv1::GetTaskName(task).Data(), fOutput->GetName() )) ;
04236e67 376
377 fDetectorDir = fOutput->GetDirectory(GetDetectorDirName()) ;
378 if (!fDetectorDir)
379 fDetectorDir = fOutput->mkdir(GetDetectorDirName()) ;
380
4e25ac79 381 TDirectory * subDir = fDetectorDir->GetDirectory(AliQAv1::GetTaskName(task)) ;
04236e67 382 if (!subDir)
4e25ac79 383 subDir = fDetectorDir->mkdir(AliQAv1::GetTaskName(task)) ;
6e65319c 384
57acd2d2 385 for ( Int_t index = AliRecoParam::kDefault ; index < AliRecoParam::kNSpecies ; index++ ) {
386 TDirectory * eventSpecieDir = subDir->GetDirectory(AliRecoParam::GetEventSpecieName(index)) ;
387 if (!eventSpecieDir)
388 eventSpecieDir = subDir->mkdir(AliRecoParam::GetEventSpecieName(index)) ;
4e25ac79 389 TDirectory * expertDir = eventSpecieDir->GetDirectory(AliQAv1::GetExpert()) ;
57acd2d2 390 if (!expertDir)
4e25ac79 391 expertDir = eventSpecieDir->mkdir(AliQAv1::GetExpert()) ;
57acd2d2 392 }
04236e67 393 StartOfDetectorCycle() ;
394}