TList replaced by TObjArray as QA data container. Introducing OCDB for the reference...
[u/mrichter/AliRoot.git] / STEER / AliQAChecker.cxx
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 /* $Id: */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 // class for running the Quality Assurance Checker
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23
24 #include "AliCDBEntry.h"
25 #include "AliCDBManager.h"
26 #include "AliLog.h"
27 #include "AliModule.h" 
28 #include "AliQA.h"
29 #include "AliQAChecker.h"
30 #include "AliQACheckerBase.h"
31
32 #include <TKey.h>
33 #include <TObjArray.h>
34 #include <TPluginManager.h> 
35 #include <TROOT.h>
36 #include <TStopwatch.h> 
37 #include <TString.h> 
38 #include <TSystem.h> 
39 #include <TList.h>
40
41 ClassImp(AliQAChecker)
42   AliQAChecker * AliQAChecker::fgQAChecker = 0x0 ;
43
44 //_____________________________________________________________________________
45 AliQAChecker::AliQAChecker(const char* name, const char* title) :
46   TNamed(name, title),
47   fDataFile(0x0), 
48   fRefFile(0x0), 
49   fFoundDetectors(".")
50 {
51   // ctor: initialise checkers and open the data file   
52   for (Int_t det = 0 ; det < AliQA::kNDET ; det++) 
53     fCheckers[det] = NULL ; 
54 }
55
56 //_____________________________________________________________________________
57 AliQAChecker::AliQAChecker(const AliQAChecker& qac) :
58   TNamed(qac),
59   fDataFile(qac.fDataFile), 
60   fRefFile(qac.fRefFile), 
61   fFoundDetectors(qac.fFoundDetectors)
62 {
63   // copy constructor
64   
65   for (Int_t det = 0 ; det < AliQA::kNDET ; det++) 
66     fCheckers[det] = NULL ; 
67 }
68
69 //_____________________________________________________________________________
70 AliQAChecker& AliQAChecker::operator = (const AliQAChecker& qac)
71 {
72 // assignment operator
73
74   this->~AliQAChecker();
75   new(this) AliQAChecker(qac);
76   return *this;
77 }
78
79 //_____________________________________________________________________________
80 AliQAChecker::~AliQAChecker()
81 {
82 // clean up
83   delete [] fCheckers ; 
84   AliQA::Close() ; 
85 }
86
87 //_____________________________________________________________________________
88   AliQACheckerBase * AliQAChecker::GetDetQAChecker(Int_t det)
89 {
90   // Gets the Quality Assurance checker for the detector specified by its name
91   
92   if (fCheckers[det]) 
93     return fCheckers[det];
94
95  TString detName(AliQA::GetDetName(det)) ; 
96
97   AliInfo(Form("Retrieving QA checker for %s", detName.Data())) ; 
98   TPluginManager* pluginManager = gROOT->GetPluginManager() ;
99   TString qacName = "Ali" + detName + "QAChecker" ;
100
101   AliQACheckerBase * qac = NULL ;
102   // first check if a plugin is defined for the quality assurance checker
103   TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQAChecker", detName.Data());
104   // if not, add a plugin for it
105   if (!pluginHandler) {
106     //AliInfo(Form("defining plugin for %s", qacName.Data()));
107     TString libs = gSystem->GetLibraries();
108  
109    if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0))
110       pluginManager->AddHandler("AliQAChecker", detName, qacName, detName + "qac", qacName + "()");
111     else 
112       pluginManager->AddHandler("AliQAChecker", detName, qacName, detName, qacName + "()");
113
114    pluginHandler = pluginManager->FindHandler("AliQAChecker", detName);
115
116   if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) 
117     qac = (AliQACheckerBase *) pluginHandler->ExecPlugin(0);
118   
119   if (qac) 
120     fCheckers[det] = qac ; 
121   }
122
123  return qac ; 
124 }
125
126
127 //_____________________________________________________________________________
128 void AliQAChecker::GetRefSubDir(const char * det, const char * task, TDirectory *& dirFile, TList *& dirOCDB)     
129
130   // Opens and returns the file with the reference data 
131         
132         dirFile = NULL ; 
133         dirOCDB = NULL ; 
134         TString refStorage(AliQA::GetQARefStorage()) ; 
135         refStorage += AliQA::GetQARefFileName() ;
136         if (refStorage.Contains(AliQA::GetLabLocalFile())) {    
137                 refStorage.ReplaceAll(AliQA::GetLabLocalFile(), "") ; 
138                 if ( fRefFile ) 
139                         if ( fRefFile->IsOpen() ) 
140                                 fRefFile->Close() ; 
141                 fRefFile = TFile::Open(refStorage.Data()) ; 
142                 if (!fRefFile) { 
143                         AliError(Form("Cannot find reference file %s", refStorage.Data())) ; 
144                         dirFile = NULL ; 
145                 }
146                 dirFile = fRefFile->GetDirectory(det) ; 
147                 if (!dirFile) {
148                         AliWarning(Form("Directory %s not found in %d", det, refStorage.Data())) ; 
149                 } else {
150                         dirFile = dirFile->GetDirectory(task) ; 
151                         if (!dirFile) 
152                                 AliWarning(Form("Directory %s/%s not found in %s", det, task, refStorage.Data())) ; 
153                 }  
154         } else if (refStorage.Contains(AliQA::GetLabLocalOCDB()) || refStorage.Contains(AliQA::GetLabAliEnOCDB())) {    
155                 AliCDBManager* man = AliCDBManager::Instance() ; 
156                 char detOCDBDir[20] ; 
157                 sprintf(detOCDBDir, "%s/%s", AliQA::GetQARefFileName(), det) ; 
158                 AliCDBEntry * entry = man->Get(detOCDBDir) ;
159                 TList * listDetQAD = dynamic_cast<TList *>(entry->GetObject()) ;
160                 if ( listDetQAD ) 
161                         dirOCDB = dynamic_cast<TList *>(listDetQAD->FindObject(task)) ; 
162         }
163 }
164
165 //_____________________________________________________________________________
166 AliQAChecker * AliQAChecker::Instance()
167 {
168         // returns unique instance of the checker
169   if ( ! fgQAChecker ) 
170    fgQAChecker = new AliQAChecker() ; 
171   return fgQAChecker ;  
172 }
173
174 //_____________________________________________________________________________
175 Bool_t AliQAChecker::Run(const char * fileName)
176 {
177   // run the Quality Assurance Checker for all tasks Hits, SDigits, Digits, recpoints, tracksegments, recparticles and ESDs
178   // starting from data in file
179
180   Bool_t rv = kFALSE ; 
181   
182   TStopwatch stopwatch;
183   stopwatch.Start();
184
185   //search for all detectors QA directories
186   TList * detKeyList = AliQA::GetQADataFile(fileName)->GetListOfKeys() ; 
187   TIter nextd(detKeyList) ; 
188   TKey * detKey ; 
189   while ( (detKey = dynamic_cast<TKey *>(nextd()) ) ) {
190     AliInfo(Form("Found %s", detKey->GetName())) ;
191     //Check which detector
192     TString detName ; 
193     TString detNameQA(detKey->GetName()) ; 
194     Int_t det ; 
195     for ( det = 0; det < AliQA::kNDET ; det++) {
196       detName = AliQA::GetDetName(det) ; 
197       if (detNameQA.Contains(detName)) {
198         fFoundDetectors+=detName ; 
199         fFoundDetectors+="." ;          
200         break ; 
201       }
202     } 
203     TDirectory * detDir = AliQA::GetQADataFile(fileName)->GetDirectory(detKey->GetName()) ; 
204     TList * taskKeyList = detDir->GetListOfKeys() ;
205     TIter nextt(taskKeyList) ; 
206     TKey * taskKey ; 
207     // now search for the tasks dir
208     while ( (taskKey = static_cast<TKey *>(nextt()) ) ) {
209       TString taskName( taskKey->GetName() ) ; 
210       AliInfo(Form("Found %s", taskName.Data())) ;
211       TDirectory * taskDir = detDir->GetDirectory(taskName.Data()) ; 
212       taskDir->cd() ; 
213       AliQACheckerBase * qac = GetDetQAChecker(det) ; 
214       if (qac)
215                 AliInfo(Form("QA checker found for %s", detName.Data())) ; 
216       if (!qac)
217                 AliFatal(Form("QA checker not found for %s", detName.Data())) ; 
218       AliQA::ALITASK index = AliQA::kNULLTASK ; 
219       if ( taskName == AliQA::GetTaskName(AliQA::kHITS) ) 
220                 index = AliQA::kSIM ; 
221       if ( taskName == AliQA::GetTaskName(AliQA::kSDIGITS) ) 
222                 index = AliQA::kSIM ; 
223       if ( taskName == AliQA::GetTaskName(AliQA::kDIGITS) ) 
224                 index = AliQA::kSIM ; 
225       if ( taskName == AliQA::GetTaskName(AliQA::kRECPOINTS) ) 
226                 index = AliQA::kREC ; 
227       if ( taskName == AliQA::GetTaskName(AliQA::kTRACKSEGMENTS) ) 
228                 index = AliQA::kREC ; 
229       if ( taskName == AliQA::GetTaskName(AliQA::kRECPARTICLES) ) 
230                 index = AliQA::kREC ; 
231       if ( taskName == AliQA::GetTaskName(AliQA::kESDS) ) 
232                 index = AliQA::kESD ; 
233       qac->Init(AliQA::DETECTORINDEX(det)) ; 
234
235           TDirectory * refDir     = NULL ; 
236           TList * refOCDBDir      = NULL ;      
237           GetRefSubDir(detNameQA.Data(), taskName.Data(), refDir, refOCDBDir) ;
238           if ( refDir || refOCDBDir) {
239                   qac->SetRefandData(refDir, refOCDBDir, taskDir) ;
240                   qac->Run(index) ; 
241           }
242         }
243   }
244   AliInfo("QA performed for following detectors:") ; 
245   for ( Int_t det = 0; det < AliQA::kNDET; det++) {
246     if (fFoundDetectors.Contains(AliQA::GetDetName(det))) {
247       printf("%s, ",AliQA::GetDetName(det)) ; 
248       fFoundDetectors.ReplaceAll(AliQA::GetDetName(det), "") ; 
249     }   
250   }
251   printf("\n") ; 
252   rv = kTRUE ; 
253
254   return rv ; 
255   
256 }
257
258 //_____________________________________________________________________________
259 Bool_t AliQAChecker::Run(AliQA::DETECTORINDEX det, AliQA::TASKINDEX task, TObjArray * list)
260 {
261   // run the Quality Assurance Checker for detector det, for task task starting from data in list
262
263   AliQACheckerBase * qac = GetDetQAChecker(det) ; 
264   if (qac)
265     AliInfo(Form("QA checker found for %s", AliQA::GetDetName(det).Data())) ;
266   if (!qac)
267         AliFatal(Form("QA checker not found for %s", AliQA::GetDetName(det).Data())) ; 
268   
269   AliQA::ALITASK index = AliQA::kNULLTASK ; 
270   if ( task == AliQA::kRAWS ) 
271                 index = AliQA::kRAW ; 
272   else if ( task == AliQA::kHITS ) 
273                 index = AliQA::kSIM ; 
274   else if ( task == AliQA::kSDIGITS ) 
275                 index = AliQA::kSIM ; 
276   else if ( task == AliQA::kDIGITS ) 
277                 index = AliQA::kSIM ; 
278   else if ( task == AliQA::kRECPOINTS ) 
279                 index = AliQA::kREC ; 
280   else if ( task == AliQA::kTRACKSEGMENTS ) 
281                 index = AliQA::kREC ; 
282   else if ( task == AliQA::kRECPARTICLES ) 
283                 index = AliQA::kREC ; 
284   else if ( task == AliQA::kESDS ) 
285                 index = AliQA::kESD ; 
286
287   TDirectory * refDir = NULL ; 
288   TList *refOCDBDir   = NULL ;  
289         GetRefSubDir(AliQA::GetDetName(det), AliQA::GetTaskName(task), refDir, refOCDBDir) ;
290   if ( refDir || refOCDBDir) {
291           qac->Init(det) ; 
292           qac->SetRefandData(refDir, refOCDBDir) ; 
293           qac->Run(index, list) ; 
294   }
295   return kTRUE ; 
296   
297 }
298
299
300