]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliQADataMaker.cxx
fix
[u/mrichter/AliRoot.git] / STEER / AliQADataMaker.cxx
CommitLineData
421ab0fb 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//
421ab0fb 25
26// --- ROOT system ---
eca4fa66 27#include <TROOT.h>
71f27f1f 28#include <TCanvas.h>
fec0891b 29#include <TPaveText.h>
421ab0fb 30#include <TSystem.h>
31#include <TFile.h>
6c18591a 32#include <TList.h>
d76c31f4 33#include <TTree.h>
d5cf81bd 34#include <TClonesArray.h>
a2b64fbd 35#include <TParameter.h>
57acd2d2 36#include <TH1K.h>
37#include <TH2C.h>
38#include <TH2D.h>
39#include <TH2F.h>
40#include <TH2I.h>
41#include <TH3C.h>
42#include <TH3D.h>
43#include <TH3F.h>
44#include <TH3I.h>
45#include <TH3S.h>
421ab0fb 46
47// --- Standard library ---
48
49// --- AliRoot header files ---
50#include "AliLog.h"
2e42b4d4 51#include "AliQADataMaker.h"
52#include "AliQAChecker.h"
d76c31f4 53#include "AliESDEvent.h"
d5cf81bd 54#include "AliRawReader.h"
5e232cd6 55#include "AliDetectorRecoParam.h"
56
421ab0fb 57
2e42b4d4 58ClassImp(AliQADataMaker)
312e6f8d 59
421ab0fb 60//____________________________________________________________________________
fec0891b 61AliQADataMaker::AliQADataMaker(const Char_t * name, const Char_t * title) :
421ab0fb 62 TNamed(name, title),
63 fOutput(0x0),
6c18591a 64 fDetectorDir(0x0),
312e6f8d 65 fDetectorDirName(""),
930e6e3e 66 fCurrentCycle(0),
5b188f2f 67 fCycle(9999999),
68 fCycleCounter(0),
b1af1125 69 fWriteExpert(kFALSE),
57acd2d2 70 fParameterList(new TList*[AliRecoParam::kNSpecies]),
71 fRun(0),
71f27f1f 72 fEventSpecie(AliRecoParam::kDefault),
73 fImage(new TCanvas*[AliRecoParam::kNSpecies]),
fec0891b 74 fPrintImage(kTRUE)
421ab0fb 75{
76 // ctor
421ab0fb 77 fDetectorDirName = GetName() ;
71f27f1f 78 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
79 fParameterList[specie] = NULL ;
80 fImage[specie] = NULL ;
81 }
421ab0fb 82}
83
84//____________________________________________________________________________
2e42b4d4 85AliQADataMaker::AliQADataMaker(const AliQADataMaker& qadm) :
421ab0fb 86 TNamed(qadm.GetName(), qadm.GetTitle()),
87 fOutput(qadm.fOutput),
6c18591a 88 fDetectorDir(qadm.fDetectorDir),
312e6f8d 89 fDetectorDirName(qadm.fDetectorDirName),
5b188f2f 90 fCurrentCycle(qadm.fCurrentCycle),
91 fCycle(qadm.fCycle),
92 fCycleCounter(qadm.fCycleCounter),
b1af1125 93 fWriteExpert(qadm.fWriteExpert),
a2b64fbd 94 fParameterList(qadm.fParameterList),
57acd2d2 95 fRun(qadm.fRun),
71f27f1f 96 fEventSpecie(qadm.fEventSpecie),
97 fImage(qadm.fImage),
fec0891b 98 fPrintImage(kTRUE)
71f27f1f 99
421ab0fb 100{
101 //copy ctor
102 fDetectorDirName = GetName() ;
eca4fa66 103 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
104 fParameterList[specie] = qadm.fParameterList[specie] ;
105 fImage[specie] = qadm.fImage[specie] ;
106 }
421ab0fb 107}
108
71f27f1f 109//____________________________________________________________________________
110AliQADataMaker::~AliQADataMaker()
111{
112 for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) {
113 if ( fImage[esIndex] )
114 delete fImage[esIndex] ;
115 if (fParameterList[esIndex] )
116 delete fParameterList[esIndex] ;
117 }
118 delete[] fImage ;
119 delete[] fParameterList ;
120}
121
ba7aca7d 122//____________________________________________________________________________
7d297381 123Int_t AliQADataMaker::Add2List(TH1 * hist, const Int_t index, TObjArray ** list, const Bool_t expert, const Bool_t image, const Bool_t saveForCorr)
ba7aca7d 124{
04236e67 125 // Set histograms memory resident and add to the list
ab4351aa 126 // Maximm allowed is 10000
57acd2d2 127
128 Int_t rv = -1 ;
129 TClass * classType = hist->Class() ;
130 TString className(classType->GetName()) ;
131 if( ! className.BeginsWith("T") && ! classType->InheritsFrom("TH1") ) {
132 AliError(Form("QA data Object must be a generic ROOT object and derive fom TH1 and not %s", className.Data())) ;
49466ea2 133 } else if ( index > AliQAv1::GetMaxQAObj() ) {
134 AliError(Form("Max number of authorized QA objects is %d", AliQAv1::GetMaxQAObj())) ;
eca4fa66 135 } else {
136 hist->SetDirectory(0) ;
750730d8 137 if (expert)
7d297381 138 hist->SetBit(AliQAv1::GetExpertBit()) ;
139 if (image)
140 hist->SetBit(AliQAv1::GetImageBit()) ;
eca4fa66 141 const Char_t * name = Form("%s_%s", AliRecoParam::GetEventSpecieName(fEventSpecie), hist->GetName()) ;
142 hist->SetName(name) ;
143 if(saveForCorr) {
144 const Char_t * cname = Form("%s_%s", list[AliRecoParam::AConvert(AliRecoParam::kDefault)]->GetName(), hist->GetName()) ;
145 TParameter<double> * p = new TParameter<double>(cname, 9999.9999) ;
146 if ( fParameterList[AliRecoParam::AConvert(fEventSpecie)] == NULL )
147 fParameterList[AliRecoParam::AConvert(fEventSpecie)] = new TList() ;
148 fParameterList[AliRecoParam::AConvert(fEventSpecie)]->Add(p) ;
a2b64fbd 149 }
eca4fa66 150 list[AliRecoParam::AConvert(fEventSpecie)]->AddAtAndExpand(hist, index) ;
151 rv = list[AliRecoParam::AConvert(fEventSpecie)]->GetLast() ;
a2b64fbd 152 }
57acd2d2 153 return rv ;
154}
155
156//____________________________________________________________________________
157TH1 * AliQADataMaker::CloneMe(TH1 * hist, Int_t specie) const
158{
159 // clones a histogram
fec0891b 160 const Char_t * name = Form("%s_%s", AliRecoParam::GetEventSpecieName(specie), hist->GetName()) ;
eca4fa66 161 TH1 * hClone = static_cast<TH1 *>(hist->Clone(name)) ;
4e25ac79 162 if ( hist->TestBit(AliQAv1::GetExpertBit()) )
b2db43c5 163 hClone->SetBit(AliQAv1::GetExpertBit()) ;
164 if ( hist->TestBit(AliQAv1::GetImageBit()) )
165 hClone->SetBit(AliQAv1::GetImageBit()) ;
75373542 166 return hClone ;
421ab0fb 167}
168
96d67a8d 169//____________________________________________________________________________
4e25ac79 170void AliQADataMaker::DefaultEndOfDetectorCycle(AliQAv1::TASKINDEX_t task)
96d67a8d 171{
172 // this method must be oveloaded by detectors
173 // sets the QA result to Fatal
4e25ac79 174 AliQAv1::Instance(AliQAv1::GetDetIndex(GetName())) ;
175 AliQAv1 * qa = AliQAv1::Instance(task) ;
57acd2d2 176 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
4e25ac79 177 qa->Set(AliQAv1::kFATAL, specie) ;
178 AliQAv1::GetQAResultFile()->cd() ;
179 qa->Write(AliQAv1::GetQAName(), kWriteDelete) ;
180 AliQAv1::GetQAResultFile()->Close() ;
96d67a8d 181}
182
421ab0fb 183//____________________________________________________________________________
c65c502a 184void AliQADataMaker::Finish() const
421ab0fb 185{
96d67a8d 186 // write to the output File
d9cbd8fd 187 if (fOutput)
188 fOutput->Close() ;
421ab0fb 189}
190
191//____________________________________________________________________________
57acd2d2 192TObject * AliQADataMaker::GetData(TObjArray ** list, const Int_t index)
04236e67 193{
49466ea2 194 // Returns the QA object at index. Limit is AliQAv1::GetMaxQAObj()
76c42cb4 195 if ( ! list ) {
196 AliError("Data list is NULL !!") ;
197 return NULL ;
198 }
5e232cd6 199
200 SetEventSpecie(fEventSpecie) ;
eca4fa66 201 Int_t esindex = AliRecoParam::AConvert(fEventSpecie) ;
202 TH1 * histClone = NULL ;
49466ea2 203 TObjArray * arr = list[esindex] ;
204 if (arr) {
205 if ( index > AliQAv1::GetMaxQAObj() ) {
206 AliError(Form("Max number of authorized QA objects is %d", AliQAv1::GetMaxQAObj())) ;
27773260 207 } else {
49466ea2 208 if ( arr->At(index) ) {
209 histClone = static_cast<TH1*>(arr->At(index)) ;
eca4fa66 210 }
211 }
212 }
213 return histClone ;
27773260 214}
7d297381 215
211a7313 216//____________________________________________________________________________
217TObjArray* AliQADataMaker::Init(AliQAv1::TASKINDEX_t task, AliRecoParam::EventSpecie_t es, Int_t cycles)
218{
219 // Initialializes and returns the QAData list for a given event specie
220 TObjArray ** ar = Init(task, cycles) ;
221 return ar[AliRecoParam::AConvert(es)] ;
222}
223
fec0891b 224//____________________________________________________________________________
eca4fa66 225void AliQADataMaker::MakeTheImage( TObjArray ** list, AliQAv1::TASKINDEX_t task, const Char_t * mode)
fec0891b 226{
227 // makes the QA image for sim and rec
eca4fa66 228 TIter next(list[AliRecoParam::AConvert(fEventSpecie)]) ;
fec0891b 229 TH1 * hdata = NULL ;
230 Int_t nImages = 0 ;
eca4fa66 231 while ( (hdata=static_cast<TH1 *>(next())) ) {
232 TString cln(hdata->ClassName()) ;
233 if ( ! cln.Contains("TH1") )
234 continue ;
fec0891b 235 if ( hdata->TestBit(AliQAv1::GetImageBit()) )
236 nImages++;
237 }
238 if ( nImages == 0 ) {
239 AliWarning(Form("No histogram will be plotted for %s %s\n", GetName(), AliQAv1::GetTaskName(task).Data())) ;
240 } else {
241 AliDebug(AliQAv1::GetQADebugLevel(), Form("%d histograms will be plotted for %s %s\n", nImages, GetName(), AliQAv1::GetTaskName(task).Data())) ;
242 for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) {
243 if (! AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(esIndex)) )
244 continue ;
245 const Char_t * title = Form("QA_%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(esIndex)) ;
246 if ( !fImage[esIndex] ) {
247 fImage[esIndex] = new TCanvas(title, title) ;
248 }
249 fImage[esIndex]->Clear() ;
250 fImage[esIndex]->SetTitle(title) ;
251 fImage[esIndex]->cd() ;
252 TPaveText someText(0.015, 0.015, 0.98, 0.98) ;
253 someText.AddText(title) ;
254 someText.Draw() ;
255 fImage[esIndex]->Print(Form("%s%s%d.%s", AliQAv1::GetImageFileName(), mode, fRun, AliQAv1::GetImageFileFormat())) ;
256 fImage[esIndex]->Clear() ;
257 Int_t nx = TMath::Sqrt(nImages) ;
258 Int_t ny = nx ;
259 if ( nx < TMath::Sqrt(nImages))
260 ny++ ;
261 fImage[esIndex]->Divide(nx, ny) ;
262 TIter nexthist(list[esIndex]) ;
263 TH1* hist = NULL ;
264 Int_t npad = 1 ;
265 fImage[esIndex]->cd(npad) ;
eca4fa66 266 while ( (hist=static_cast<TH1*>(nexthist())) ) {
267 TString cln(hist->ClassName()) ;
268 if ( ! cln.Contains("TH1") )
269 continue ;
fec0891b 270 if(hist->TestBit(AliQAv1::GetImageBit())) {
271 hist->Draw() ;
272 fImage[esIndex]->cd(++npad) ;
273 }
274 }
275 fImage[esIndex]->Print(Form("%s%s%d.%s", AliQAv1::GetImageFileName(), mode, fRun, AliQAv1::GetImageFileFormat())) ;
276 }
277 }
278}