]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliQAChecker.cxx
The check for save file was blocking the route to the checker
[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 "AliQAManager.h"
26 #include "AliCDBStorage.h"
27 #include "AliRunInfo.h" 
28 #include "AliLog.h"
29 #include "AliModule.h" 
30 #include "AliQAv1.h"
31 #include "AliQAChecker.h"
32 #include "AliQACheckerBase.h"
33 #include "AliCorrQAChecker.h"
34 #include "AliGlobalQAChecker.h"
35 #include "AliGRPObject.h"
36
37 #include <TKey.h>
38 #include <TObjArray.h>
39 #include <TObjString.h>
40 #include <TPluginManager.h> 
41 #include <TROOT.h>
42 #include <TStopwatch.h> 
43 #include <TString.h> 
44 #include <TSystem.h> 
45 #include <TList.h>
46 #include <TNtupleD.h>
47
48 ClassImp(AliQAChecker)
49   AliQAChecker * AliQAChecker::fgQAChecker = 0x0 ;
50
51 //_____________________________________________________________________________
52 AliQAChecker::AliQAChecker(const char* name, const char* title) :
53   TNamed(name, title),
54   fDataFile(0x0), 
55   fRunInfo(0x0), 
56   fRunInfoOwner(kFALSE), 
57   fRefFile(0x0), 
58   fFoundDetectors("."), 
59   fEventSpecie(AliRecoParam::kDefault), 
60   fRun(0)
61 {
62   // ctor: initialise checkers and open the data file   
63   for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) 
64     fCheckers[det] = NULL ; 
65 }
66
67 //_____________________________________________________________________________
68 AliQAChecker::AliQAChecker(const AliQAChecker& qac) :
69   TNamed(qac),
70   fDataFile(qac.fDataFile), 
71   fRunInfo(qac.fRunInfo), 
72   fRunInfoOwner(kFALSE),   
73   fRefFile(qac.fRefFile), 
74   fFoundDetectors(qac.fFoundDetectors),
75   fEventSpecie(qac.fEventSpecie),
76   fRun(qac.fRun)
77 {
78   // copy constructor
79   
80   for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) 
81     fCheckers[det] = NULL ; 
82 }
83
84 //_____________________________________________________________________________
85 AliQAChecker& AliQAChecker::operator = (const AliQAChecker& qac)
86 {
87 // assignment operator
88
89   this->~AliQAChecker();
90   new(this) AliQAChecker(qac);
91   return *this;
92 }
93
94 //_____________________________________________________________________________
95 AliQAChecker::~AliQAChecker()
96 {
97 // clean up
98   if (fRunInfo)
99     delete fRunInfo ; 
100   delete [] fCheckers ; 
101   AliQAv1::Close() ; 
102 }
103
104 //_____________________________________________________________________________
105   AliQACheckerBase * AliQAChecker::GetDetQAChecker(Int_t det)
106 {
107         // Gets the Quality Assurance checker for the detector specified by its name
108         
109         if (fCheckers[det]) 
110     return fCheckers[det];
111
112         AliQACheckerBase * qac = NULL ;
113
114         TString detName(AliQAv1::GetDetName(det)) ; 
115         
116         if (det == AliQAv1::kGLOBAL) {
117                 qac = new AliGlobalQAChecker() ; 
118         } else if (det == AliQAv1::kCORR) {
119                 qac = new AliCorrQAChecker() ; 
120         } else {
121                 AliDebugClass(AliQAv1::GetQADebugLevel(), Form("Retrieving QA checker for %s", detName.Data())) ; 
122                 TPluginManager* pluginManager = gROOT->GetPluginManager() ;
123                 TString qacName = "Ali" + detName + "QAChecker" ;
124
125                 // first check if a plugin is defined for the quality assurance checker
126                 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQAChecker", detName.Data());
127                 // if not, add a plugin for it
128                 if (!pluginHandler) {
129                         //AliDebug(AliQAv1::GetQADebugLevel(), Form("defining plugin for %s", qacName.Data()));
130                         TString libs = gSystem->GetLibraries();
131                 
132                         if (libs.Contains("lib" + detName + "base.so") || (gSystem->Load("lib" + detName + "base.so") >= 0))
133                                 pluginManager->AddHandler("AliQAChecker", detName, qacName, detName + "qac", qacName + "()");
134                         else 
135                                 pluginManager->AddHandler("AliQAChecker", detName, qacName, detName, qacName + "()");
136
137                         pluginHandler = pluginManager->FindHandler("AliQAChecker", detName);    
138
139                         if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) 
140                                 qac = (AliQACheckerBase *) pluginHandler->ExecPlugin(0);
141   
142                 }
143         }
144         if (qac) 
145                 fCheckers[det] = qac ;
146         
147         return qac ; 
148 }
149
150 //_____________________________________________________________________________
151 AliQAChecker * AliQAChecker::Instance()
152 {
153         // returns unique instance of the checker
154   if ( ! fgQAChecker ) 
155    fgQAChecker = new AliQAChecker() ; 
156   return fgQAChecker ;  
157 }
158
159 //_____________________________________________________________________________
160 void AliQAChecker::LoadRunInfoFromGRP() 
161 {
162   AliCDBManager* man = AliCDBManager::Instance() ;
163   AliCDBEntry* entry = man->Get(AliQAv1::GetGRPPath().Data());
164   AliGRPObject* grpObject = 0x0;
165   if (entry) {
166
167           TMap* m = static_cast<TMap*>(entry->GetObject());  // old GRP entry
168
169           if (m) {
170             AliDebug(AliQAv1::GetQADebugLevel(), "It is a map");
171             //m->Print();
172             grpObject = new AliGRPObject();
173                  grpObject->ReadValuesFromMap(m);
174     }
175
176     else {
177             AliDebug(AliQAv1::GetQADebugLevel(), "It is a new GRP object");
178         grpObject = static_cast<AliGRPObject*>(entry->GetObject());  // new GRP entry
179     }
180
181     entry->SetOwner(0);
182     AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
183   }
184
185   if (!grpObject) {
186      AliFatal("No GRP entry found in OCDB!");
187   }
188
189   TString lhcState = grpObject->GetLHCState();
190   if (lhcState==AliGRPObject::GetInvalidString()) {
191     AliError("GRP/GRP/Data entry:  missing value for the LHC state ! Using UNKNOWN");
192     lhcState = "UNKNOWN";
193   }
194
195   TString beamType = grpObject->GetBeamType();
196   if (beamType==AliGRPObject::GetInvalidString()) {
197     AliError("GRP/GRP/Data entry:  missing value for the beam type ! Using UNKNOWN");
198     beamType = "UNKNOWN";
199   }
200
201   Float_t beamEnergy = grpObject->GetBeamEnergy();
202   if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
203     AliError("GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
204     beamEnergy = 0;
205   }
206
207   TString runType = grpObject->GetRunType();
208   if (runType==AliGRPObject::GetInvalidString()) {
209     AliError("GRP/GRP/Data entry:  missing value for the run type ! Using UNKNOWN");
210     runType = "UNKNOWN";
211   }
212
213   Int_t activeDetectors = grpObject->GetDetectorMask();
214   if (activeDetectors==AliGRPObject::GetInvalidInt()) {
215     AliError("GRP/GRP/Data entry:  missing value for the detector mask ! Using 1074790399");
216     activeDetectors = 1074790399;
217   }
218
219   fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
220
221   fRunInfoOwner = kTRUE ; 
222
223   // set the event specie
224   fEventSpecie = AliRecoParam::kDefault ;
225   if (strcmp(runType,"PHYSICS")) {
226     // Not a physics run, the event specie is set to kCalib
227     fEventSpecie = AliRecoParam::kCalib ;
228     return;
229   }
230   if (strcmp(lhcState,"STABLE_BEAMS") == 0) {
231     // Heavy ion run (any beam tha is not pp, the event specie is set to kHighMult
232     fEventSpecie = AliRecoParam::kHighMult ;
233     if ((strcmp(beamType,"p-p") == 0) ||
234         (strcmp(beamType,"p-")  == 0) ||
235         (strcmp(beamType,"-p")  == 0) ||
236         (strcmp(beamType,"P-P") == 0) ||
237         (strcmp(beamType,"P-")  == 0) ||
238         (strcmp(beamType,"-P")  == 0)) {
239       // Proton run, the event specie is set to kLowMult
240       fEventSpecie = AliRecoParam::kLowMult ;
241     }
242     else if (strcmp(beamType,"-") == 0) {
243       // No beams, we assume cosmic data
244       fEventSpecie = AliRecoParam::kCosmic ;
245     }
246     else if (strcmp(beamType,"UNKNOWN") == 0) {
247       // No LHC beam information is available, we use the default event specie
248       fEventSpecie = AliRecoParam::kDefault ;
249     }
250   }
251 }
252
253 //_____________________________________________________________________________
254 Bool_t AliQAChecker::Run(const char * fileName, AliDetectorRecoParam * recoParam)
255 {
256   // run the Quality Assurance Checker for all tasks Hits, SDigits, Digits, DigitsR, RecPoints, TrackSegments, RecParticles and ESDs
257   // starting from data in file  
258   TStopwatch stopwatch;
259   stopwatch.Start();
260   
261   //search for all detectors QA directories
262   TList * detKeyList = AliQAv1::GetQADataFile(fileName)->GetListOfKeys() ; 
263   TIter nextd(detKeyList) ; 
264   TKey * detKey ; 
265   while ( (detKey = static_cast<TKey *>(nextd()) ) ) {
266     AliDebug(AliQAv1::GetQADebugLevel(), Form("Found %s", detKey->GetName())) ;
267     //Check which detector
268     TString detName ; 
269     TString detNameQA(detKey->GetName()) ; 
270     Int_t det ; 
271     for ( det = 0; det < AliQAv1::kNDET ; det++) {
272       detName = AliQAv1::GetDetName(det) ; 
273       if (detNameQA.Contains(detName)) {
274         fFoundDetectors+=detName ; 
275         fFoundDetectors+="." ;          
276         break ; 
277       }
278     } 
279     TDirectory * detDir = AliQAv1::GetQADataFile(fileName)->GetDirectory(detKey->GetName()) ; 
280     TList * taskKeyList = detDir->GetListOfKeys() ;
281     TIter nextt(taskKeyList) ; 
282     TKey * taskKey ; 
283     // now search for the tasks dir
284     while ( (taskKey = static_cast<TKey *>(nextt()) ) ) {
285       TString taskName( taskKey->GetName() ) ; 
286       AliDebug(AliQAv1::GetQADebugLevel(), Form("Found %s", taskName.Data())) ;
287       TDirectory * taskDir = detDir->GetDirectory(taskName.Data()) ; 
288       taskDir->cd() ; 
289       AliQACheckerBase * qac = GetDetQAChecker(det) ; 
290       if (qac)
291         AliDebug(AliQAv1::GetQADebugLevel(), Form("QA checker found for %s", detName.Data())) ; 
292       if (!qac)
293         AliFatal(Form("QA checker not found for %s", detName.Data())) ; 
294       AliQAv1::ALITASK_t index = AliQAv1::kNULLTASK ; 
295       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kHITS) ) 
296         index = AliQAv1::kSIM ; 
297       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kSDIGITS) ) 
298         index = AliQAv1::kSIM ; 
299       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kDIGITS) ) 
300         index = AliQAv1::kSIM ; 
301       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kRAWS) ) 
302         index = AliQAv1::kRAW ;       
303       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kDIGITSR) ) 
304         index = AliQAv1::kREC ; 
305       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kRECPOINTS) ) 
306         index = AliQAv1::kREC ; 
307       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kTRACKSEGMENTS) ) 
308         index = AliQAv1::kREC ; 
309       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kRECPARTICLES) ) 
310         index = AliQAv1::kREC ; 
311       if ( taskName == AliQAv1::GetTaskName(AliQAv1::kESDS) ) 
312         index = AliQAv1::kESD ; 
313       qac->Init(AliQAv1::DETECTORINDEX_t(det)) ; 
314                   qac->Run(index, recoParam) ; 
315     }
316   }
317   TString detList ; 
318   for ( Int_t det = 0; det < AliQAv1::kNDET; det++) {
319     if (fFoundDetectors.Contains(AliQAv1::GetDetName(det))) {
320       detList += AliQAv1::GetDetName(det) ; 
321       detList += " " ; 
322       fFoundDetectors.ReplaceAll(AliQAv1::GetDetName(det), "") ; 
323       AliQAv1::Instance()->Show(AliQAv1::GetDetIndex(AliQAv1::GetDetName(det))) ; 
324     }   
325   }
326   AliInfo(Form("QA performed for following detectors: %s", detList.Data())) ; 
327   return kTRUE ; 
328 }
329
330 //_____________________________________________________________________________
331 Bool_t AliQAChecker::Run(AliQAv1::DETECTORINDEX_t det, AliQAv1::TASKINDEX_t task, TObjArray ** list, AliDetectorRecoParam * recoParam)
332 {
333         // run the Quality Assurance Checker for detector det, for task task starting from data in list
334
335         AliQACheckerBase * qac = GetDetQAChecker(det) ; 
336         if (qac)
337                 AliDebug(AliQAv1::GetQADebugLevel(), Form("QA checker found for %s", AliQAv1::GetDetName(det).Data())) ;
338         if (!qac)
339                 AliError(Form("QA checker not found for %s", AliQAv1::GetDetName(det).Data())) ; 
340   
341         AliQAv1::ALITASK_t index = AliQAv1::kNULLTASK ; 
342         if ( task == AliQAv1::kRAWS ) 
343                 index = AliQAv1::kRAW ; 
344         else if ( task == AliQAv1::kHITS ) 
345                 index = AliQAv1::kSIM ; 
346         else if ( task == AliQAv1::kSDIGITS ) 
347                 index = AliQAv1::kSIM ; 
348         else if ( task == AliQAv1::kDIGITS ) 
349                 index = AliQAv1::kSIM ; 
350         else if ( task == AliQAv1::kDIGITSR ) 
351                 index = AliQAv1::kREC ; 
352         else if ( task == AliQAv1::kRECPOINTS ) 
353                 index = AliQAv1::kREC ; 
354         else if ( task == AliQAv1::kTRACKSEGMENTS ) 
355                 index = AliQAv1::kREC ; 
356         else if ( task == AliQAv1::kRECPARTICLES ) 
357                 index = AliQAv1::kREC ; 
358         else if ( task == AliQAv1::kESDS ) 
359                 index = AliQAv1::kESD ; 
360
361   qac->Init(det) ; 
362   qac->Run(index, list, recoParam) ; 
363   
364   // make the image 
365   qac->MakeImage(list, task, AliQAv1::Mode(task)) ; 
366   
367         return kTRUE ; 
368 }
369
370 //_____________________________________________________________________________
371 Bool_t AliQAChecker::Run(AliQAv1::DETECTORINDEX_t det, AliQAv1::TASKINDEX_t task, TNtupleD ** list, AliDetectorRecoParam * recoParam)
372 {
373         // run the Quality Assurance Checker for detector det, for task task starting from data in list
374   
375         AliQACheckerBase * qac = GetDetQAChecker(det) ; 
376         if (qac)
377                 AliDebug(AliQAv1::GetQADebugLevel(), Form("QA checker found for %s", AliQAv1::GetDetName(det).Data())) ;
378         if (!qac)
379                 AliError(Form("QA checker not found for %s", AliQAv1::GetDetName(det).Data())) ; 
380   
381         AliQAv1::ALITASK_t index = AliQAv1::kNULLTASK ; 
382         if ( task == AliQAv1::kRAWS ) 
383                 index = AliQAv1::kRAW ; 
384         else if ( task == AliQAv1::kHITS ) 
385                 index = AliQAv1::kSIM ; 
386         else if ( task == AliQAv1::kSDIGITS ) 
387                 index = AliQAv1::kSIM ; 
388         else if ( task == AliQAv1::kDIGITS ) 
389                 index = AliQAv1::kSIM ; 
390         else if ( task == AliQAv1::kDIGITSR ) 
391                 index = AliQAv1::kREC ; 
392         else if ( task == AliQAv1::kRECPOINTS ) 
393                 index = AliQAv1::kREC ; 
394         else if ( task == AliQAv1::kTRACKSEGMENTS ) 
395                 index = AliQAv1::kREC ; 
396         else if ( task == AliQAv1::kRECPARTICLES ) 
397                 index = AliQAv1::kREC ; 
398         else if ( task == AliQAv1::kESDS ) 
399                 index = AliQAv1::kESD ; 
400   
401   qac->Init(det) ; 
402   qac->Run(index, list, recoParam) ; 
403
404   return kTRUE ; 
405 }