ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/


/*
  Checks the quality assurance. Under construction. 
  By comparing with reference data

*/

// --- ROOT system ---
#include <TClass.h>
#include <TH1F.h> 
#include <TH1I.h> 
#include <TIterator.h> 
#include <TKey.h> 
#include <TFile.h> 

// --- Standard library ---

// --- AliRoot header files ---
#include "AliLog.h"
#include "AliQAv1.h"
#include "AliQAChecker.h"
#include "AliVZEROQAChecker.h"
#include "AliVZEROQADataMakerRec.h"

ClassImp(AliVZEROQAChecker)

//__________________________________________________________________
AliVZEROQAChecker::AliVZEROQAChecker() : AliQACheckerBase("VZERO","VZERO Quality Assurance Data Checker"),
  fLowEventCut(1000),
  fORvsANDCut(0.2),
  fBGvsBBCut(0.2)
{
  // Default constructor
  // Nothing else here
}

//__________________________________________________________________
void AliVZEROQAChecker::Check(Double_t * check, AliQAv1::ALITASK_t index, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/) 
{
  // Main check function: Depending on the TASK, different checks will be applied
  // Check for missing channels and check on the trigger type for raw data
  // Check for missing disk or rings for esd (to be redone)

  for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
    check[specie] = 1.0;
    // no check on cosmic or calibration events
    if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCosmic || AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib)
      continue;
    if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) 
      continue;
    if (index == AliQAv1::kRAW) {
      check[specie] =  CheckRaws(list[specie]);
    } else if (index == AliQAv1::kESD) {
      // Check for one disk missing (FATAL) or one ring missing (ERROR) in ESDs (to be redone)
      check[specie] =  CheckEsds(list[specie]);
    } 
  }
}

//_________________________________________________________________
Double_t AliVZEROQAChecker::CheckRaws(TObjArray * list) const
{

  //  Check on the QA histograms on the raw-data input list:
  //  Two things are checked: the presence of data in all channels and
  //  the ratio between different trigger types

  Double_t test = 1.0;
  if (list->GetEntries() == 0){  
    AliWarning("There are no histograms to be checked");
  } else {
    TH1F *hTriggers  = (TH1F*)list->At(AliVZEROQADataMakerRec::kTriggers);
    if (!hTriggers) {
      AliWarning("Trigger type histogram is not found");
    }
    else if (hTriggers->GetEntries() < fLowEventCut) {
      AliInfo("Not enough events to perform QA checks");
    }
    else {
      Double_t nANDs = hTriggers->GetBinContent(hTriggers->FindBin(0));
      Double_t nORs = hTriggers->GetBinContent(hTriggers->FindBin(1));
      Double_t nBGAs = hTriggers->GetBinContent(hTriggers->FindBin(2));
      Double_t nBGCs = hTriggers->GetBinContent(hTriggers->FindBin(3));
      if ((nORs - nANDs) > fORvsANDCut*nANDs) test = 0.001;
      if ((nBGAs + nBGCs) > fBGvsBBCut*nANDs) test = 0.002;
    }
    TH1F *hBBflags = (TH1F*)list->At(AliVZEROQADataMakerRec::kBBFlagsPerChannel);
    if (!hBBflags) {
      AliWarning("BB-flags per channel histogram is not found");
    }
    else if (hBBflags->GetEntries() < fLowEventCut) {
      AliInfo("Not enough events to perform QA checks");
    }
    else {
      for(Int_t iBin = 1; iBin <= 64; ++iBin) {
	if (hBBflags->GetBinContent(iBin) < 1.0) test = -1.0;
      }
    }
  }
  return test ; 
}  

//_________________________________________________________________
Double_t AliVZEROQAChecker::CheckEsds(TObjArray * list) const
{
  
//  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    histonb =   0; 
  Double_t multV0A = 0.0;
  Double_t multV0C = 0.0;
  Double_t v0ABBRing[4], v0CBBRing[4];
  Double_t v0ABGRing[4], v0CBGRing[4];
  for (Int_t i=0; i<4; i++) { 
       v0ABBRing[i]= v0CBBRing[i]= 0.0;
       v0ABGRing[i]= v0CBGRing[i]= 0.0;
  }  
  TIter next(list) ; 
  TH1 * hdata ;
  
  while ( (hdata = dynamic_cast<TH1 *>(next())) ) {
	  if (hdata) {
		  switch (histonb) {
		  case AliVZEROQADataMakerRec::kCellMultiV0A:
			  multV0A  = hdata->GetMean();
			  break;
		  case AliVZEROQADataMakerRec::kCellMultiV0C:
			  multV0C  = hdata->GetMean();
			  break;
		  case AliVZEROQADataMakerRec::kBBFlag:
	          for (Int_t i=0; i<8; i++) {         
				  if(i<4) v0CBBRing[i]  = hdata->Integral((i*8)+1, (i*8) +8);
				  else v0ABBRing[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) v0CBGRing[i]  = hdata->Integral((i*8)+1, (i*8) +8);
				  else v0ABGRing[i-4]  = hdata->Integral((i*8)+1, (i*8) +8);
			  }	      
			  break;
		  }
	  }
	  histonb++;
  }
  
  if(multV0A == 0.0 || multV0C == 0.0) {
     AliWarning(Form("One of the two disks is missing !") );
     test = 0.0; // bit FATAL set
  }
  if( v0ABBRing[0]+v0ABGRing[0] == 0.0 || 
      v0ABBRing[1]+v0ABGRing[1] == 0.0 || 
      v0ABBRing[2]+v0ABGRing[2] == 0.0 || 
      v0ABBRing[3]+v0ABGRing[3] == 0.0 || 
      v0CBBRing[0]+v0CBGRing[0] == 0.0 || 
      v0CBBRing[1]+v0CBGRing[1] == 0.0 || 
      v0CBBRing[2]+v0CBGRing[2] == 0.0 || 
      v0CBBRing[3]+v0CBGRing[3] == 0.0  ){    
      AliWarning(Form("One ring is missing !") );
      test = 0.1;   // bit ERROR set
  }

  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) ; 
  delete [] hiValue;
  delete [] 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) ; 	
    }
  }
}
  
 AliVZEROQAChecker.cxx:1
 AliVZEROQAChecker.cxx:2
 AliVZEROQAChecker.cxx:3
 AliVZEROQAChecker.cxx:4
 AliVZEROQAChecker.cxx:5
 AliVZEROQAChecker.cxx:6
 AliVZEROQAChecker.cxx:7
 AliVZEROQAChecker.cxx:8
 AliVZEROQAChecker.cxx:9
 AliVZEROQAChecker.cxx:10
 AliVZEROQAChecker.cxx:11
 AliVZEROQAChecker.cxx:12
 AliVZEROQAChecker.cxx:13
 AliVZEROQAChecker.cxx:14
 AliVZEROQAChecker.cxx:15
 AliVZEROQAChecker.cxx:16
 AliVZEROQAChecker.cxx:17
 AliVZEROQAChecker.cxx:18
 AliVZEROQAChecker.cxx:19
 AliVZEROQAChecker.cxx:20
 AliVZEROQAChecker.cxx:21
 AliVZEROQAChecker.cxx:22
 AliVZEROQAChecker.cxx:23
 AliVZEROQAChecker.cxx:24
 AliVZEROQAChecker.cxx:25
 AliVZEROQAChecker.cxx:26
 AliVZEROQAChecker.cxx:27
 AliVZEROQAChecker.cxx:28
 AliVZEROQAChecker.cxx:29
 AliVZEROQAChecker.cxx:30
 AliVZEROQAChecker.cxx:31
 AliVZEROQAChecker.cxx:32
 AliVZEROQAChecker.cxx:33
 AliVZEROQAChecker.cxx:34
 AliVZEROQAChecker.cxx:35
 AliVZEROQAChecker.cxx:36
 AliVZEROQAChecker.cxx:37
 AliVZEROQAChecker.cxx:38
 AliVZEROQAChecker.cxx:39
 AliVZEROQAChecker.cxx:40
 AliVZEROQAChecker.cxx:41
 AliVZEROQAChecker.cxx:42
 AliVZEROQAChecker.cxx:43
 AliVZEROQAChecker.cxx:44
 AliVZEROQAChecker.cxx:45
 AliVZEROQAChecker.cxx:46
 AliVZEROQAChecker.cxx:47
 AliVZEROQAChecker.cxx:48
 AliVZEROQAChecker.cxx:49
 AliVZEROQAChecker.cxx:50
 AliVZEROQAChecker.cxx:51
 AliVZEROQAChecker.cxx:52
 AliVZEROQAChecker.cxx:53
 AliVZEROQAChecker.cxx:54
 AliVZEROQAChecker.cxx:55
 AliVZEROQAChecker.cxx:56
 AliVZEROQAChecker.cxx:57
 AliVZEROQAChecker.cxx:58
 AliVZEROQAChecker.cxx:59
 AliVZEROQAChecker.cxx:60
 AliVZEROQAChecker.cxx:61
 AliVZEROQAChecker.cxx:62
 AliVZEROQAChecker.cxx:63
 AliVZEROQAChecker.cxx:64
 AliVZEROQAChecker.cxx:65
 AliVZEROQAChecker.cxx:66
 AliVZEROQAChecker.cxx:67
 AliVZEROQAChecker.cxx:68
 AliVZEROQAChecker.cxx:69
 AliVZEROQAChecker.cxx:70
 AliVZEROQAChecker.cxx:71
 AliVZEROQAChecker.cxx:72
 AliVZEROQAChecker.cxx:73
 AliVZEROQAChecker.cxx:74
 AliVZEROQAChecker.cxx:75
 AliVZEROQAChecker.cxx:76
 AliVZEROQAChecker.cxx:77
 AliVZEROQAChecker.cxx:78
 AliVZEROQAChecker.cxx:79
 AliVZEROQAChecker.cxx:80
 AliVZEROQAChecker.cxx:81
 AliVZEROQAChecker.cxx:82
 AliVZEROQAChecker.cxx:83
 AliVZEROQAChecker.cxx:84
 AliVZEROQAChecker.cxx:85
 AliVZEROQAChecker.cxx:86
 AliVZEROQAChecker.cxx:87
 AliVZEROQAChecker.cxx:88
 AliVZEROQAChecker.cxx:89
 AliVZEROQAChecker.cxx:90
 AliVZEROQAChecker.cxx:91
 AliVZEROQAChecker.cxx:92
 AliVZEROQAChecker.cxx:93
 AliVZEROQAChecker.cxx:94
 AliVZEROQAChecker.cxx:95
 AliVZEROQAChecker.cxx:96
 AliVZEROQAChecker.cxx:97
 AliVZEROQAChecker.cxx:98
 AliVZEROQAChecker.cxx:99
 AliVZEROQAChecker.cxx:100
 AliVZEROQAChecker.cxx:101
 AliVZEROQAChecker.cxx:102
 AliVZEROQAChecker.cxx:103
 AliVZEROQAChecker.cxx:104
 AliVZEROQAChecker.cxx:105
 AliVZEROQAChecker.cxx:106
 AliVZEROQAChecker.cxx:107
 AliVZEROQAChecker.cxx:108
 AliVZEROQAChecker.cxx:109
 AliVZEROQAChecker.cxx:110
 AliVZEROQAChecker.cxx:111
 AliVZEROQAChecker.cxx:112
 AliVZEROQAChecker.cxx:113
 AliVZEROQAChecker.cxx:114
 AliVZEROQAChecker.cxx:115
 AliVZEROQAChecker.cxx:116
 AliVZEROQAChecker.cxx:117
 AliVZEROQAChecker.cxx:118
 AliVZEROQAChecker.cxx:119
 AliVZEROQAChecker.cxx:120
 AliVZEROQAChecker.cxx:121
 AliVZEROQAChecker.cxx:122
 AliVZEROQAChecker.cxx:123
 AliVZEROQAChecker.cxx:124
 AliVZEROQAChecker.cxx:125
 AliVZEROQAChecker.cxx:126
 AliVZEROQAChecker.cxx:127
 AliVZEROQAChecker.cxx:128
 AliVZEROQAChecker.cxx:129
 AliVZEROQAChecker.cxx:130
 AliVZEROQAChecker.cxx:131
 AliVZEROQAChecker.cxx:132
 AliVZEROQAChecker.cxx:133
 AliVZEROQAChecker.cxx:134
 AliVZEROQAChecker.cxx:135
 AliVZEROQAChecker.cxx:136
 AliVZEROQAChecker.cxx:137
 AliVZEROQAChecker.cxx:138
 AliVZEROQAChecker.cxx:139
 AliVZEROQAChecker.cxx:140
 AliVZEROQAChecker.cxx:141
 AliVZEROQAChecker.cxx:142
 AliVZEROQAChecker.cxx:143
 AliVZEROQAChecker.cxx:144
 AliVZEROQAChecker.cxx:145
 AliVZEROQAChecker.cxx:146
 AliVZEROQAChecker.cxx:147
 AliVZEROQAChecker.cxx:148
 AliVZEROQAChecker.cxx:149
 AliVZEROQAChecker.cxx:150
 AliVZEROQAChecker.cxx:151
 AliVZEROQAChecker.cxx:152
 AliVZEROQAChecker.cxx:153
 AliVZEROQAChecker.cxx:154
 AliVZEROQAChecker.cxx:155
 AliVZEROQAChecker.cxx:156
 AliVZEROQAChecker.cxx:157
 AliVZEROQAChecker.cxx:158
 AliVZEROQAChecker.cxx:159
 AliVZEROQAChecker.cxx:160
 AliVZEROQAChecker.cxx:161
 AliVZEROQAChecker.cxx:162
 AliVZEROQAChecker.cxx:163
 AliVZEROQAChecker.cxx:164
 AliVZEROQAChecker.cxx:165
 AliVZEROQAChecker.cxx:166
 AliVZEROQAChecker.cxx:167
 AliVZEROQAChecker.cxx:168
 AliVZEROQAChecker.cxx:169
 AliVZEROQAChecker.cxx:170
 AliVZEROQAChecker.cxx:171
 AliVZEROQAChecker.cxx:172
 AliVZEROQAChecker.cxx:173
 AliVZEROQAChecker.cxx:174
 AliVZEROQAChecker.cxx:175
 AliVZEROQAChecker.cxx:176
 AliVZEROQAChecker.cxx:177
 AliVZEROQAChecker.cxx:178
 AliVZEROQAChecker.cxx:179
 AliVZEROQAChecker.cxx:180
 AliVZEROQAChecker.cxx:181
 AliVZEROQAChecker.cxx:182
 AliVZEROQAChecker.cxx:183
 AliVZEROQAChecker.cxx:184
 AliVZEROQAChecker.cxx:185
 AliVZEROQAChecker.cxx:186
 AliVZEROQAChecker.cxx:187
 AliVZEROQAChecker.cxx:188
 AliVZEROQAChecker.cxx:189
 AliVZEROQAChecker.cxx:190
 AliVZEROQAChecker.cxx:191
 AliVZEROQAChecker.cxx:192
 AliVZEROQAChecker.cxx:193
 AliVZEROQAChecker.cxx:194
 AliVZEROQAChecker.cxx:195
 AliVZEROQAChecker.cxx:196
 AliVZEROQAChecker.cxx:197
 AliVZEROQAChecker.cxx:198
 AliVZEROQAChecker.cxx:199
 AliVZEROQAChecker.cxx:200
 AliVZEROQAChecker.cxx:201
 AliVZEROQAChecker.cxx:202
 AliVZEROQAChecker.cxx:203
 AliVZEROQAChecker.cxx:204
 AliVZEROQAChecker.cxx:205
 AliVZEROQAChecker.cxx:206
 AliVZEROQAChecker.cxx:207
 AliVZEROQAChecker.cxx:208
 AliVZEROQAChecker.cxx:209
 AliVZEROQAChecker.cxx:210
 AliVZEROQAChecker.cxx:211
 AliVZEROQAChecker.cxx:212
 AliVZEROQAChecker.cxx:213
 AliVZEROQAChecker.cxx:214
 AliVZEROQAChecker.cxx:215
 AliVZEROQAChecker.cxx:216
 AliVZEROQAChecker.cxx:217
 AliVZEROQAChecker.cxx:218
 AliVZEROQAChecker.cxx:219
 AliVZEROQAChecker.cxx:220
 AliVZEROQAChecker.cxx:221
 AliVZEROQAChecker.cxx:222
 AliVZEROQAChecker.cxx:223
 AliVZEROQAChecker.cxx:224
 AliVZEROQAChecker.cxx:225
 AliVZEROQAChecker.cxx:226
 AliVZEROQAChecker.cxx:227
 AliVZEROQAChecker.cxx:228