1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 notifce *
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 **************************************************************************/
21 // Produces the data needed to calculate the quality assurance for Reconstruction
22 // All data must be mergeable objects.
23 // Y. Schutz CERN July 2007
26 // --- ROOT system ---
30 #include <TObjArray.h>
32 // --- Standard library ---
34 // --- AliRoot header files ---
35 #include "AliCDBPath.h"
36 #include "AliCDBEntry.h"
37 #include "AliDetectorRecoParam.h"
38 #include "AliCDBManager.h"
41 #include "AliQADataMakerRec.h"
42 #include "AliQAManager.h"
43 #include "AliESDEvent.h"
44 #include "AliRawReader.h"
46 ClassImp(AliQADataMakerRec)
48 //____________________________________________________________________________
49 AliQADataMakerRec::AliQADataMakerRec(const char * name, const char * title) :
50 AliQADataMaker(name, title),
54 fRecPointsQAList(NULL),
60 fDetectorDirName = GetName() ;
63 //____________________________________________________________________________
64 AliQADataMakerRec::AliQADataMakerRec(const AliQADataMakerRec& qadm) :
65 AliQADataMaker(qadm.GetName(), qadm.GetTitle()),
66 fDigitsQAList(qadm.fDigitsQAList),
67 fESDsQAList(qadm.fESDsQAList),
68 fRawsQAList(qadm.fRawsQAList),
69 fRecPointsQAList(qadm.fRecPointsQAList),
70 fCorrNt(qadm.fCorrNt),
71 fRecoParam(qadm.fRecoParam),
75 SetName(qadm.GetName()) ;
76 SetTitle(qadm.GetTitle()) ;
77 fDetectorDirName = GetName() ;
80 //____________________________________________________________________________
81 AliQADataMakerRec::~AliQADataMakerRec()
83 //dtor: delete the TObjArray and thei content
85 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
86 if ( fESDsQAList[specie] ) {
87 fESDsQAList[specie]->Delete() ;
90 delete[] fESDsQAList ;
93 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
94 if ( fRawsQAList[specie] ) {
95 fRawsQAList[specie]->Delete() ;
98 delete[] fRawsQAList ;
100 if ( fDigitsQAList ) {
101 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
102 if ( fDigitsQAList[specie] ) {
103 fDigitsQAList[specie]->Delete() ;
106 delete[] fDigitsQAList ;
108 if ( fRecPointsQAList ) {
109 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
110 if ( fRecPointsQAList[specie] ) {
111 fRecPointsQAList[specie]->Delete() ;
114 delete[] fRecPointsQAList ;
116 if (fRecPointsArray) {
117 fRecPointsArray->Clear() ;
118 delete fRecPointsArray ;
122 //__________________________________________________________________
123 AliQADataMakerRec& AliQADataMakerRec::operator = (const AliQADataMakerRec& qadm )
125 // Assignment operator.
126 this->~AliQADataMakerRec();
127 new(this) AliQADataMakerRec(qadm);
131 //____________________________________________________________________________
132 void AliQADataMakerRec::EndOfCycle()
134 // Finishes a cycle of QA for all the tasks
135 EndOfCycle(AliQAv1::kRAWS) ;
136 EndOfCycle(AliQAv1::kDIGITSR) ;
137 EndOfCycle(AliQAv1::kRECPOINTS) ;
138 EndOfCycle(AliQAv1::kESDS) ;
142 //____________________________________________________________________________
143 void AliQADataMakerRec::EndOfCycle(AliQAv1::TASKINDEX_t task)
145 // Finishes a cycle of QA
148 TObjArray ** list = NULL ;
150 if ( task == AliQAv1::kRAWS )
152 else if ( task == AliQAv1::kDIGITSR )
153 list = fDigitsQAList ;
154 else if ( task == AliQAv1::kRECPOINTS )
155 list = fRecPointsQAList ;
156 else if ( task == AliQAv1::kESDS )
160 if ( ! list && ! fCorrNt )
162 //DefaultEndOfDetectorCycle(task) ;
163 EndOfDetectorCycle(task, list) ;
165 if (! AliQAManager::QAManager(AliQAv1::kRECMODE)->IsSaveData())
168 fDetectorDir = fOutput->GetDirectory(GetDetectorDirName()) ;
170 fDetectorDir = fOutput->mkdir(GetDetectorDirName()) ;
171 TDirectory * subDir = fDetectorDir->GetDirectory(AliQAv1::GetTaskName(task)) ;
173 subDir = fDetectorDir->mkdir(AliQAv1::GetTaskName(task)) ;
175 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) { // skip Default
176 if (! AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(specie)) || AliRecoParam::ConvertIndex(specie) == AliRecoParam::kDefault)
178 TDirectory * eventSpecieDir = subDir->GetDirectory(AliRecoParam::GetEventSpecieName(specie)) ;
180 eventSpecieDir = subDir->mkdir(AliRecoParam::GetEventSpecieName(specie)) ;
181 eventSpecieDir->cd() ;
184 TIter next(list[specie]) ;
186 while( (obj = next()) ) {
187 if (!obj->TestBit(AliQAv1::GetExpertBit()))
191 TDirectory * expertDir = eventSpecieDir->GetDirectory(AliQAv1::GetExpert()) ;
193 expertDir = eventSpecieDir->mkdir(AliQAv1::GetExpert()) ;
196 while( (obj = next()) ) {
197 if (!obj->TestBit(AliQAv1::GetExpertBit()))
204 else if ( fCorrNt ) {
205 if (fCorrNt[specie] && AliQAv1::GetDetIndex(GetName()) == AliQAv1::kCORR) {
206 eventSpecieDir->cd() ;
207 fCorrNt[specie]->Write() ;
214 //____________________________________________________________________________
215 void AliQADataMakerRec::Exec(AliQAv1::TASKINDEX_t task, TObject * data)
217 // creates the quality assurance data for the various tasks (Hits, SDigits, Digits, ESDs)
219 if ( task == AliQAv1::kRAWS ) {
220 AliDebug(AliQAv1::GetQADebugLevel(), "Processing Raws QA") ;
221 AliRawReader * rawReader = static_cast<AliRawReader *>(data) ;
223 MakeRaws(rawReader) ;
225 AliDebug(AliQAv1::GetQADebugLevel(), "Raw data are not processed") ;
226 } else if ( task == AliQAv1::kDIGITSR ) {
227 AliDebug(AliQAv1::GetQADebugLevel(), "Processing Digits QA") ;
228 TTree * tree = static_cast<TTree *>(data) ;
229 if (strcmp(tree->ClassName(), "TTree") == 0) {
232 AliWarning("data are not a TTree") ;
234 } else if ( task == AliQAv1::kRECPOINTS ) {
235 AliDebug(AliQAv1::GetQADebugLevel(), "Processing RecPoints QA") ;
236 TTree * tree = static_cast<TTree *>(data) ;
237 if (strcmp(tree->ClassName(), "TTree") == 0) {
238 MakeRecPoints(tree) ;
240 AliWarning("data are not a TTree") ;
242 } else if ( task == AliQAv1::kESDS ) {
243 AliDebug(AliQAv1::GetQADebugLevel(), "Processing ESDs QA") ;
244 AliESDEvent * esd = static_cast<AliESDEvent *>(data) ;
245 if (strcmp(esd->ClassName(), "AliESDEvent") == 0)
248 AliError("Wrong type of esd container") ;
252 //____________________________________________________________________________
253 TObjArray ** AliQADataMakerRec::Init(AliQAv1::TASKINDEX_t task, Int_t cycles)
255 // general intialisation
257 TObjArray ** rv = NULL ;
262 if ( task == AliQAv1::kRAWS ) {
263 if (! fRawsQAList ) {
264 fRawsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
265 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
266 fRawsQAList[specie] = new TObjArray(AliQAv1::GetMaxQAObj()) ;
267 fRawsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
271 } else if ( task == AliQAv1::kDIGITSR ) {
272 if ( ! fDigitsQAList ) {
273 fDigitsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
274 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
275 fDigitsQAList[specie] = new TObjArray(AliQAv1::GetMaxQAObj()) ;
276 fDigitsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
280 } else if ( task == AliQAv1::kRECPOINTS ) {
281 if ( ! fRecPointsQAList ) {
282 fRecPointsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
283 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
284 fRecPointsQAList[specie] = new TObjArray(AliQAv1::GetMaxQAObj()) ;
285 fRecPointsQAList[specie]->SetName(Form("%s_%s_%s", GetName(), AliQAv1::GetTaskName(task).Data(), AliRecoParam::GetEventSpecieName(specie))) ;
288 rv = fRecPointsQAList ;
289 } else if ( task == AliQAv1::kESDS ) {
290 if ( ! fESDsQAList ) {
291 fESDsQAList = new TObjArray *[AliRecoParam::kNSpecies] ;
292 for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
293 fESDsQAList[specie] = new TObjArray(AliQAv1::GetMaxQAObj()) ;
294 fESDsQAList[specie]->SetName(Form("%s_%s", GetName(), AliQAv1::GetTaskName(task).Data())); //, AliRecoParam::GetEventSpecieName(specie))) ;
302 //____________________________________________________________________________
303 void AliQADataMakerRec::Init(AliQAv1::TASKINDEX_t task, TObjArray ** list, Int_t run, Int_t cycles)
305 // Intialisation by passing the list of QA data booked elsewhere
312 if ( task == AliQAv1::kRAWS ) {
314 } else if ( task == AliQAv1::kDIGITSR ) {
315 fDigitsQAList = list ;
316 } else if ( task == AliQAv1::kRECPOINTS ) {
317 fRecPointsQAList = list ;
318 } else if ( task == AliQAv1::kESDS ) {
323 //____________________________________________________________________________
324 void AliQADataMakerRec::InitRecoParams()
326 // Get the recoparam form the OCDB
328 AliDebug(AliQAv1::GetQADebugLevel(), Form("Loading reconstruction parameter objects for detector %s", GetName()));
329 AliCDBPath path(GetName(),"Calib","RecoParam");
330 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
333 AliDebug(AliQAv1::GetQADebugLevel(), Form("Couldn't find RecoParam entry in OCDB for detector %s",GetName()));
336 TObject * recoParamObj = entry->GetObject() ;
337 if ( strcmp(recoParamObj->ClassName(), "TObjArray") == 0 ) {
338 // The detector has only one set of reco parameters
339 AliDebug(AliQAv1::GetQADebugLevel(), Form("Array of reconstruction parameters found for detector %s",GetName()));
340 TObjArray *recoParamArray = static_cast<TObjArray*>(recoParamObj) ;
341 for (Int_t iRP=0; iRP<recoParamArray->GetEntriesFast(); iRP++) {
342 fRecoParam = static_cast<AliDetectorRecoParam*>(recoParamArray->At(iRP)) ;
345 else if (fRecoParam->IsDefault())
349 else if (recoParamObj->InheritsFrom("AliDetectorRecoParam")) {
350 // The detector has only one set of reco parameters
351 // Registering it in AliRecoParam
352 AliDebug(AliQAv1::GetQADebugLevel(), Form("Single set of reconstruction parameters found for detector %s",GetName()));
353 fRecoParam = static_cast<AliDetectorRecoParam*>(recoParamObj) ;
354 static_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
356 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",GetName()));
362 //____________________________________________________________________________
363 void AliQADataMakerRec::ResetDetector(AliQAv1::TASKINDEX_t task)
365 // default reset that resets all the QA objects.
366 // to be overloaded by detectors, if necessary
368 TObjArray ** list = NULL ;
369 if ( task == AliQAv1::kRAWS ) {
371 } else if ( task == AliQAv1::kDIGITSR ) {
372 list = fDigitsQAList ;
373 } else if ( task == AliQAv1::kRECPOINTS ) {
374 list = fRecPointsQAList ;
375 } else if ( task == AliQAv1::kESDS ) {
378 //list was not initialized, skip
382 for (int spec = 0; spec < AliRecoParam::kNSpecies; spec++) {
383 if (!AliQAv1::Instance()->IsEventSpecieSet(AliRecoParam::ConvertIndex(spec)))
385 TIter next(list[spec]) ;
387 while ( (histo = dynamic_cast<TH1*> (next())) ) {
388 histo->Reset("ICE") ;
389 histo->ResetStats() ;
394 //____________________________________________________________________________
395 void AliQADataMakerRec::StartOfCycle(Int_t run)
397 // Finishes a cycle of QA for all the tasks
398 Bool_t samecycle = kFALSE ;
399 StartOfCycle(AliQAv1::kRAWS, run, samecycle) ;
401 StartOfCycle(AliQAv1::kDIGITSR, run, samecycle) ;
402 StartOfCycle(AliQAv1::kRECPOINTS, run, samecycle) ;
403 StartOfCycle(AliQAv1::kESDS, run, samecycle) ;
406 //____________________________________________________________________________
407 void AliQADataMakerRec::StartOfCycle(AliQAv1::TASKINDEX_t task, Int_t run, const Bool_t sameCycle)
409 // Finishes a cycle of QA data acquistion
412 if ( !sameCycle || fCurrentCycle == -1) {
416 if (AliQAManager::QAManager(AliQAv1::kRECMODE)->IsSaveData())
417 fOutput = AliQAv1::GetQADataFile(GetName(), fRun) ;
419 AliDebug(AliQAv1::GetQADebugLevel(), Form(" Run %d Cycle %d task %s file %s",
420 fRun, fCurrentCycle, AliQAv1::GetTaskName(task).Data(), fOutput->GetName() )) ;
422 // fDetectorDir = fOutput->GetDirectory(GetDetectorDirName()) ;
423 // if (!fDetectorDir)
424 // fDetectorDir = fOutput->mkdir(GetDetectorDirName()) ;
426 // TDirectory * subDir = fDetectorDir->GetDirectory(AliQAv1::GetTaskName(task)) ;
428 // subDir = fDetectorDir->mkdir(AliQAv1::GetTaskName(task)) ;
430 // for ( Int_t specie = AliRecoParam::kDefault ; specie < AliRecoParam::kNSpecies ; specie++ ) {
431 // TDirectory * eventSpecieDir = subDir->GetDirectory(AliRecoParam::GetEventSpecieName(specie)) ;
432 // if (!eventSpecieDir)
433 // eventSpecieDir = subDir->mkdir(AliRecoParam::GetEventSpecieName(specie)) ;
434 // TDirectory * expertDir = eventSpecieDir->GetDirectory(AliQAv1::GetExpert()) ;
436 // expertDir = eventSpecieDir->mkdir(AliQAv1::GetExpert()) ;
438 StartOfDetectorCycle() ;