/*
- Checks the quality assurance.
+ Checks the quality assurance. Under construction.
By comparing with reference data
*/
// --- AliRoot header files ---
#include "AliLog.h"
-#include "AliQA.h"
+#include "AliQAv1.h"
#include "AliQAChecker.h"
#include "AliVZEROQAChecker.h"
+#include "AliVZEROQADataMakerRec.h"
//#include "AliCDBEntry.h"
//#include "AliCDBManager.h"
ClassImp(AliVZEROQAChecker)
//__________________________________________________________________
-const Double_t AliVZEROQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
+Double_t * AliVZEROQAChecker::Check(AliQAv1::ALITASK_t index, TObjArray ** list, AliDetectorRecoParam * /*recoParam*/)
{
// Main check function: Depending on the TASK, different checks will be applied
// Check for empty histograms
-// AliDebug(1,Form("AliVZEROChecker"));
+// AliDebug(AliQAv1::GetQADebugLevel(),Form("AliVZEROChecker"));
// AliCDBEntry *QARefRec = AliCDBManager::Instance()->Get("VZERO/QARef/RAW");
// if( !QARefRec){
-// AliInfo("QA reference data NOT retrieved for QA check...");
+// AliDebug(AliQAv1::GetQADebugLevel(), "QA reference data NOT retrieved for QA check...");
// return 1.;
// }
-// checking for empty histograms
-
-// Double_t check = 0.0;
-// if(CheckEntries(list) == 0) {
-// AliWarning(Form("Histograms are empty !"));
-// check = 0.4;
-// return check;
-
- if ( index == AliQA::kRAW )
- {
- printf(" index = %d, Check = %f\n\n", index,CheckEntries(list));
- return CheckEntries(list);
+// Check that histos are filled - (FATAL) set if empty
+ Double_t * check = new Double_t[AliRecoParam::kNSpecies] ;
+ for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
+ check[specie] = 1.0 ;
+ if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) )
+ continue ;
+ if(CheckEntries(list[specie]) == 0.0){
+ check[specie] = CheckEntries(list[specie]);
+ } else {
+ // Check for one disk missing (FATAL) or one ring missing (ERROR) in ESDs
+ if(index == AliQAv1::kESD)
+ check[specie] = CheckEsds(list[specie]);
+ }
}
-
- AliWarning(Form("Checker for task %d not implemented for the moment",index));
- return 0.0;
-
+ return check;
}
+
//_________________________________________________________________
Double_t AliVZEROQAChecker::CheckEntries(TObjArray * list) const
{
-
- // check on the QA histograms on the input list:
-
- Double_t test = 0.0 ;
+ // check on the QA histograms on the input list: list
+// list->Print();
+
+ Double_t test = 0.0 ;
Int_t count = 0 ;
- printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
- printf(" Number of entries = %d \n", list->GetEntries() );
-
+
if (list->GetEntries() == 0){
- test = 1.0;
- AliInfo(Form("There are no entries to be checked..."));
- }
- else {
- TIter next(list) ;
- TH1 * hdata ;
- count = 0 ;
- while ( (hdata = dynamic_cast<TH1 *>(next())) ) {
- if (hdata) {
- Double_t rv = 0.0;
- Printf("Histogram %s has entries: %f ",hdata->GetName(),hdata->GetEntries());
- if(hdata->GetEntries()>0)rv=1.0;
- count++ ;
- test += rv ;
- printf(" count = %d, rv = %f \n", count,rv);
- }
- else{
- AliError(Form("Data type cannot be processed"));
+ test = 1.0;
+ AliDebug(AliQAv1::GetQADebugLevel(), Form("There are NO ENTRIES to be checked..."));
+ } else {
+ TIter next(list) ;
+ TH1 * hdata ;
+ count = 0 ;
+ while ( (hdata = dynamic_cast<TH1 *>(next())) ) {
+ if (hdata) {
+ Double_t rv = 0.0;
+ if(hdata->GetEntries()>0) rv=1.0;
+// AliDebug(AliQAv1::GetQADebugLevel(), Form("%s -> %f", hdata->GetName(), rv));
+ count++ ; // number of histos
+ test += rv ; // number of histos filled
+ }else{
+ AliError(Form("Data type cannot be processed"));
}
- }
- if (count != 0) {
- if (test==0.0) {
- AliInfo(Form("Histograms are booked for THIS specific Task, but they are all empty: setting flag to kWARNING"));
-// test = 0.0; //upper limit value to set kWARNING flag for a task
- }
- else test = 1.0;
- }
+ }
+ if (count != 0) {
+ if (test==0.0) {
+ AliWarning(Form("Histograms are BOOKED for this specific task, but they are all EMPTY"));
+ } else {
+ test /= count;
+ }
+ }
}
-
return test ;
}
-//______________________________________________________________________________
-void AliVZEROQAChecker::SetQA(AliQA::ALITASK_t index, const Double_t value) const
-{
-// sets the QA word according the return value of the Check
- AliQA * qa = AliQA::Instance(index);
+//_________________________________________________________________
+Double_t AliVZEROQAChecker::CheckEsds(TObjArray * list) const
+{
- qa->UnSet(AliQA::kFATAL);
- qa->UnSet(AliQA::kWARNING);
- qa->UnSet(AliQA::kERROR);
- qa->UnSet(AliQA::kINFO);
+// check the ESDs for missing disk or ring
+
+// printf(" Number of entries in ESD list = %d\n", list->GetEntries());
+// list->Print();
+
+ Double_t test = 1.0; // initialisation to OK
+ Int_t histo_nb = 0;
+ Double_t Mult_V0A = 0.0;
+ Double_t Mult_V0C = 0.0;
+ Double_t V0A_BB_Ring[4], V0C_BB_Ring[4];
+ Double_t V0A_BG_Ring[4], V0C_BG_Ring[4];
+ for (Int_t i=0; i<4; i++) {
+ V0A_BB_Ring[i]= V0C_BB_Ring[i]= 0.0;
+ V0A_BG_Ring[i]= V0C_BG_Ring[i]= 0.0;
+ }
+ TIter next(list) ;
+ TH1 * hdata ;
- if ( value == 1.0 )
- {
- qa->Set(AliQA::kINFO);
+ while ( (hdata = dynamic_cast<TH1 *>(next())) ) {
+ if (hdata) {
+ switch (histo_nb) {
+ case AliVZEROQADataMakerRec::kCellMultiV0A:
+ Mult_V0A = hdata->GetMean();
+ break;
+ case AliVZEROQADataMakerRec::kCellMultiV0C:
+ Mult_V0C = hdata->GetMean();
+ break;
+ case AliVZEROQADataMakerRec::kBBFlag:
+ for (Int_t i=0; i<8; i++) {
+ if(i<4) V0C_BB_Ring[i] = hdata->Integral((i*8)+1, (i*8) +8);
+ else V0A_BB_Ring[i-4] = hdata->Integral((i*8)+1, (i*8) +8);
+ }
+ break;
+ case AliVZEROQADataMakerRec::kBGFlag:
+ for (Int_t i=0; i<8; i++) {
+ if(i<4) V0C_BG_Ring[i] = hdata->Integral((i*8)+1, (i*8) +8);
+ else V0A_BG_Ring[i-4] = hdata->Integral((i*8)+1, (i*8) +8);
+ }
+ break;
+ }
+ }
+ histo_nb++;
}
- else if ( value == 0.0 )
- {
- qa->Set(AliQA::kFATAL);
+
+ if(Mult_V0A == 0.0 || Mult_V0C == 0.0) {
+ AliWarning(Form("One of the two disks is missing !") );
+ test = 0.0; // bit FATAL set
}
- else if ( value > 0.5 )
- {
- qa->Set(AliQA::kWARNING);
+ if( V0A_BB_Ring[0]+V0A_BG_Ring[0] == 0.0 ||
+ V0A_BB_Ring[1]+V0A_BG_Ring[1] == 0.0 ||
+ V0A_BB_Ring[2]+V0A_BG_Ring[2] == 0.0 ||
+ V0A_BB_Ring[3]+V0A_BG_Ring[3] == 0.0 ||
+ V0C_BB_Ring[0]+V0C_BG_Ring[0] == 0.0 ||
+ V0C_BB_Ring[1]+V0C_BG_Ring[1] == 0.0 ||
+ V0C_BB_Ring[2]+V0C_BG_Ring[2] == 0.0 ||
+ V0C_BB_Ring[3]+V0C_BG_Ring[3] == 0.0 ){
+ AliWarning(Form("One ring is missing !") );
+ test = 0.1; // bit ERROR set
}
- else
- {
- qa->Set(AliQA::kERROR);
+
+ return test ;
+}
+
+//______________________________________________________________________________
+void AliVZEROQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
+{
+ // intialises QA and QA checker settings
+ AliQAv1::Instance(det) ;
+ Float_t * hiValue = new Float_t[AliQAv1::kNBIT] ;
+ Float_t * lowValue = new Float_t[AliQAv1::kNBIT] ;
+ lowValue[AliQAv1::kINFO] = 0.5 ;
+ hiValue[AliQAv1::kINFO] = 1.0 ;
+ lowValue[AliQAv1::kWARNING] = 0.2 ;
+ hiValue[AliQAv1::kWARNING] = 0.5 ;
+ lowValue[AliQAv1::kERROR] = 0.0 ;
+ hiValue[AliQAv1::kERROR] = 0.2 ;
+ lowValue[AliQAv1::kFATAL] = -1.0 ;
+ hiValue[AliQAv1::kFATAL] = 0.0 ;
+ SetHiLo(hiValue, lowValue) ;
+}
+
+//______________________________________________________________________________
+void AliVZEROQAChecker::SetQA(AliQAv1::ALITASK_t index, Double_t * value) const
+{
+// sets the QA word according to return value of the Check
+ AliQAv1 * qa = AliQAv1::Instance(index);
+ for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
+ qa->UnSet(AliQAv1::kFATAL, specie);
+ qa->UnSet(AliQAv1::kWARNING, specie);
+ qa->UnSet(AliQAv1::kERROR, specie);
+ qa->UnSet(AliQAv1::kINFO, specie);
+ if ( ! value ) { // No checker is implemented, set all QA to Fatal
+ qa->Set(AliQAv1::kFATAL, specie) ;
+ } else {
+ if ( value[specie] >= fLowTestValue[AliQAv1::kFATAL] && value[specie] < fUpTestValue[AliQAv1::kFATAL] )
+ qa->Set(AliQAv1::kFATAL, specie) ;
+ else if ( value[specie] > fLowTestValue[AliQAv1::kERROR] && value[specie] <= fUpTestValue[AliQAv1::kERROR] )
+ qa->Set(AliQAv1::kERROR, specie) ;
+ else if ( value[specie] > fLowTestValue[AliQAv1::kWARNING] && value[specie] <= fUpTestValue[AliQAv1::kWARNING] )
+ qa->Set(AliQAv1::kWARNING, specie) ;
+ else if ( value[specie] > fLowTestValue[AliQAv1::kINFO] && value[specie] <= fUpTestValue[AliQAv1::kINFO] )
+ qa->Set(AliQAv1::kINFO, specie) ;
+ }
}
}
+