Fixes for bug #52499: Field polarities inconsistiency
[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>
421ab0fb 28#include <TSystem.h>
29#include <TFile.h>
6c18591a 30#include <TList.h>
d76c31f4 31#include <TTree.h>
d5cf81bd 32#include <TClonesArray.h>
a2b64fbd 33#include <TParameter.h>
57acd2d2 34#include <TH1K.h>
35#include <TH2C.h>
36#include <TH2D.h>
37#include <TH2F.h>
38#include <TH2I.h>
39#include <TH3C.h>
40#include <TH3D.h>
41#include <TH3F.h>
42#include <TH3I.h>
43#include <TH3S.h>
421ab0fb 44
45// --- Standard library ---
46
47// --- AliRoot header files ---
48#include "AliLog.h"
2e42b4d4 49#include "AliQADataMaker.h"
50#include "AliQAChecker.h"
d76c31f4 51#include "AliESDEvent.h"
d5cf81bd 52#include "AliRawReader.h"
5e232cd6 53#include "AliDetectorRecoParam.h"
54
421ab0fb 55
2e42b4d4 56ClassImp(AliQADataMaker)
312e6f8d 57
421ab0fb 58//____________________________________________________________________________
fec0891b 59AliQADataMaker::AliQADataMaker(const Char_t * name, const Char_t * title) :
421ab0fb 60 TNamed(name, title),
61 fOutput(0x0),
6c18591a 62 fDetectorDir(0x0),
312e6f8d 63 fDetectorDirName(""),
930e6e3e 64 fCurrentCycle(0),
5b188f2f 65 fCycle(9999999),
66 fCycleCounter(0),
b1af1125 67 fWriteExpert(kFALSE),
57acd2d2 68 fParameterList(new TList*[AliRecoParam::kNSpecies]),
69 fRun(0),
71f27f1f 70 fEventSpecie(AliRecoParam::kDefault),
6252ceeb 71 fDigitsArray(NULL)
421ab0fb 72{
73 // ctor
421ab0fb 74 fDetectorDirName = GetName() ;
71f27f1f 75 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
76 fParameterList[specie] = NULL ;
71f27f1f 77 }
421ab0fb 78}
79
80//____________________________________________________________________________
2e42b4d4 81AliQADataMaker::AliQADataMaker(const AliQADataMaker& qadm) :
421ab0fb 82 TNamed(qadm.GetName(), qadm.GetTitle()),
83 fOutput(qadm.fOutput),
6c18591a 84 fDetectorDir(qadm.fDetectorDir),
312e6f8d 85 fDetectorDirName(qadm.fDetectorDirName),
5b188f2f 86 fCurrentCycle(qadm.fCurrentCycle),
87 fCycle(qadm.fCycle),
88 fCycleCounter(qadm.fCycleCounter),
b1af1125 89 fWriteExpert(qadm.fWriteExpert),
a2b64fbd 90 fParameterList(qadm.fParameterList),
57acd2d2 91 fRun(qadm.fRun),
634696f5 92 fEventSpecie(qadm.fEventSpecie),
6252ceeb 93 fDigitsArray(NULL)
421ab0fb 94{
95 //copy ctor
96 fDetectorDirName = GetName() ;
eca4fa66 97 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
98 fParameterList[specie] = qadm.fParameterList[specie] ;
634696f5 99 // fImage[specie] = qadm.fImage[specie] ;
eca4fa66 100 }
421ab0fb 101}
102
71f27f1f 103//____________________________________________________________________________
104AliQADataMaker::~AliQADataMaker()
105{
106 for (Int_t esIndex = 0 ; esIndex < AliRecoParam::kNSpecies ; esIndex++) {
71f27f1f 107 if (fParameterList[esIndex] )
108 delete fParameterList[esIndex] ;
109 }
71f27f1f 110 delete[] fParameterList ;
6252ceeb 111
112 if (fDigitsArray) {
113 fDigitsArray->Clear() ;
114 delete fDigitsArray ;
115 }
71f27f1f 116}
117
421ab0fb 118//____________________________________________________________________________
7d297381 119Int_t AliQADataMaker::Add2List(TH1 * hist, const Int_t index, TObjArray ** list, const Bool_t expert, const Bool_t image, const Bool_t saveForCorr)
ba7aca7d 120{
04236e67 121 // Set histograms memory resident and add to the list
ab4351aa 122 // Maximm allowed is 10000
57acd2d2 123
124 Int_t rv = -1 ;
125 TClass * classType = hist->Class() ;
126 TString className(classType->GetName()) ;
127 if( ! className.BeginsWith("T") && ! classType->InheritsFrom("TH1") ) {
128 AliError(Form("QA data Object must be a generic ROOT object and derive fom TH1 and not %s", className.Data())) ;
49466ea2 129 } else if ( index > AliQAv1::GetMaxQAObj() ) {
130 AliError(Form("Max number of authorized QA objects is %d", AliQAv1::GetMaxQAObj())) ;
eca4fa66 131 } else {
132 hist->SetDirectory(0) ;
750730d8 133 if (expert)
7d297381 134 hist->SetBit(AliQAv1::GetExpertBit()) ;
135 if (image)
136 hist->SetBit(AliQAv1::GetImageBit()) ;
eca4fa66 137 const Char_t * name = Form("%s_%s", AliRecoParam::GetEventSpecieName(fEventSpecie), hist->GetName()) ;
138 hist->SetName(name) ;
139 if(saveForCorr) {
140 const Char_t * cname = Form("%s_%s", list[AliRecoParam::AConvert(AliRecoParam::kDefault)]->GetName(), hist->GetName()) ;
141 TParameter<double> * p = new TParameter<double>(cname, 9999.9999) ;
142 if ( fParameterList[AliRecoParam::AConvert(fEventSpecie)] == NULL )
143 fParameterList[AliRecoParam::AConvert(fEventSpecie)] = new TList() ;
144 fParameterList[AliRecoParam::AConvert(fEventSpecie)]->Add(p) ;
a2b64fbd 145 }
eca4fa66 146 list[AliRecoParam::AConvert(fEventSpecie)]->AddAtAndExpand(hist, index) ;
147 rv = list[AliRecoParam::AConvert(fEventSpecie)]->GetLast() ;
a2b64fbd 148 }
57acd2d2 149 return rv ;
150}
151
152//____________________________________________________________________________
153TH1 * AliQADataMaker::CloneMe(TH1 * hist, Int_t specie) const
154{
155 // clones a histogram
fec0891b 156 const Char_t * name = Form("%s_%s", AliRecoParam::GetEventSpecieName(specie), hist->GetName()) ;
eca4fa66 157 TH1 * hClone = static_cast<TH1 *>(hist->Clone(name)) ;
4e25ac79 158 if ( hist->TestBit(AliQAv1::GetExpertBit()) )
b2db43c5 159 hClone->SetBit(AliQAv1::GetExpertBit()) ;
160 if ( hist->TestBit(AliQAv1::GetImageBit()) )
161 hClone->SetBit(AliQAv1::GetImageBit()) ;
75373542 162 return hClone ;
421ab0fb 163}
164
96d67a8d 165//____________________________________________________________________________
4e25ac79 166void AliQADataMaker::DefaultEndOfDetectorCycle(AliQAv1::TASKINDEX_t task)
96d67a8d 167{
168 // this method must be oveloaded by detectors
169 // sets the QA result to Fatal
4e25ac79 170 AliQAv1::Instance(AliQAv1::GetDetIndex(GetName())) ;
171 AliQAv1 * qa = AliQAv1::Instance(task) ;
57acd2d2 172 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
4e25ac79 173 qa->Set(AliQAv1::kFATAL, specie) ;
174 AliQAv1::GetQAResultFile()->cd() ;
175 qa->Write(AliQAv1::GetQAName(), kWriteDelete) ;
176 AliQAv1::GetQAResultFile()->Close() ;
96d67a8d 177}
178
421ab0fb 179//____________________________________________________________________________
c65c502a 180void AliQADataMaker::Finish() const
421ab0fb 181{
96d67a8d 182 // write to the output File
d9cbd8fd 183 if (fOutput)
184 fOutput->Close() ;
421ab0fb 185}
186
187//____________________________________________________________________________
57acd2d2 188TObject * AliQADataMaker::GetData(TObjArray ** list, const Int_t index)
04236e67 189{
49466ea2 190 // Returns the QA object at index. Limit is AliQAv1::GetMaxQAObj()
76c42cb4 191 if ( ! list ) {
192 AliError("Data list is NULL !!") ;
193 return NULL ;
194 }
5e232cd6 195
196 SetEventSpecie(fEventSpecie) ;
eca4fa66 197 Int_t esindex = AliRecoParam::AConvert(fEventSpecie) ;
198 TH1 * histClone = NULL ;
49466ea2 199 TObjArray * arr = list[esindex] ;
200 if (arr) {
6252ceeb 201 if ( ! arr->GetEntriesFast() ) {
202 // Initializes the histograms
203 TString arrName(arr->GetName()) ;
204 if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kRAWS)))
205 InitRaws() ;
206 else if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kHITS)))
207 InitHits() ;
208 else if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kSDIGITS)))
209 InitSDigits() ;
210 else if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kDIGITS)))
211 InitDigits() ;
212 else if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kDIGITSR)))
7f0f88e7 213 InitDigits() ;
6252ceeb 214 else if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)))
215 InitRecPoints() ;
216 else if (arrName.Contains(AliQAv1::GetTaskName(AliQAv1::kESDS)))
217 InitESDs() ;
218 }
49466ea2 219 if ( index > AliQAv1::GetMaxQAObj() ) {
220 AliError(Form("Max number of authorized QA objects is %d", AliQAv1::GetMaxQAObj())) ;
27773260 221 } else {
49466ea2 222 if ( arr->At(index) ) {
223 histClone = static_cast<TH1*>(arr->At(index)) ;
eca4fa66 224 }
225 }
226 }
227 return histClone ;
27773260 228}
7d297381 229
fec0891b 230//____________________________________________________________________________
211a7313 231TObjArray* AliQADataMaker::Init(AliQAv1::TASKINDEX_t task, AliRecoParam::EventSpecie_t es, Int_t cycles)
232{
233 // Initialializes and returns the QAData list for a given event specie
234 TObjArray ** ar = Init(task, cycles) ;
235 return ar[AliRecoParam::AConvert(es)] ;
236}
237
238//____________________________________________________________________________
6252ceeb 239Bool_t AliQADataMaker::IsValidEventSpecie(Int_t eventSpecieIndex, TObjArray ** list)
240{
241 // check if event specie was present in current run or
242 // if histograms of this event specie have been created
243 if (! AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(eventSpecieIndex)) || ! list[eventSpecieIndex]->GetEntriesFast() )
244 return kFALSE ;
245 else
246 return kTRUE ;
247}