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.                  *
 **************************************************************************/


/* $Id$ */

/////////////////////////////////////////////////////////////////////
//                                                                 //
//  Checks the quality assurance.                                  //
//  By analysis of the histograms & comparing with reference data  //
//  S.Arcelli                                                      //
//                                                                 //
/////////////////////////////////////////////////////////////////////

#include "TH1.h"
#include "TObjArray.h"

#include "AliLog.h"
//#include "AliQAv1.h"
//#include "AliQAChecker.h"
#include "AliTOFQADataMakerRec.h"
#include "AliTOFQAChecker.h"
#include <TPaveText.h>

ClassImp(AliTOFQAChecker)

//____________________________________________________________________________
void AliTOFQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t /*index*/,
				  TObjArray ** list,
				  const AliDetectorRecoParam * /*recoParam*/) 
{
  // Super-basic check on the QA histograms on the input list: 
  // look whether they are empty!

  Int_t count[AliRecoParam::kNSpecies] = { 0 }; 

  for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
    if (! AliQAv1::Instance(AliQAv1::GetDetIndex(GetName()))->IsEventSpecieSet(AliRecoParam::ConvertIndex(specie)) ) 
      continue ;
    test[specie] = 1.0 ; 
    if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) 
      continue ; 
    if (list[specie]->GetEntries() == 0){  
      test[specie] = 0.0 ; // nothing to check
    }
    else {
      TIter next(list[specie]) ; 
      TH1 * hdata ;
      count[specie] = 0 ; 
      while ( (hdata = static_cast<TH1 *>(next())) ) {
        if (hdata && hdata->InheritsFrom("TH1")) { 
          Double_t rv = 0.;

	  switch ( CheckRaws(hdata,specie) ) 
	    {
	    case AliQAv1::kINFO:
	      rv = 1.0;
	      break;
	    case AliQAv1::kWARNING:
	      rv = 0.75;
	      break;
	    case AliQAv1::kERROR:
	      rv = 0.25;
	      break;
	    case AliQAv1::kFATAL:
	      rv = -1.0;
	      break;
	    default:
	      //AliError("Invalid ecc value. FIXME !");
	      rv = AliQAv1::kNULLBit;
	      break;
	    }	  

          AliDebug(AliQAv1::GetQADebugLevel(), Form("%s -> %f", hdata->GetName(), rv)) ; 
          count[specie]++ ; 
          test[specie] += rv ; 
        }
        else{
          AliError("Data type cannot be processed") ;
        }
      }
      if (count[specie] != 0) { 
        if (test[specie]==0) {
          AliWarning("Histograms are there, but they are all empty: setting flag to kWARNING");
          test[specie] = 0.5;  //upper limit value to set kWARNING flag for a task
        }
        else {
	  test[specie] /= count[specie] ;
        }
        AliDebug(AliQAv1::GetQADebugLevel(), Form("Test Result = %f", test[specie])) ; 
      }
    }
  }
}  

//------------------------------------------------------
AliTOFQAChecker& AliTOFQAChecker::operator = (const AliTOFQAChecker& qac)
{

  if (this==&qac) return *this;
  return *this;

}

//____________________________________________________________________________
Int_t AliTOFQAChecker::CheckRaws(TH1* histo, Int_t specie)
{
  /*
  checker for RAWS
  */
  Int_t flag = AliQAv1::kNULLBit;
  
  if(histo->GetEntries()>0) flag = AliQAv1::kINFO; 
  
  Double_t binWidthTOFrawTime = 2.44;
  Float_t minTOFrawTime, maxTOFrawTime;
  if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCosmic){
    minTOFrawTime=200.;//ns
    maxTOFrawTime=300.;//ns
  } else {
    minTOFrawTime=200.;//ns
    maxTOFrawTime=275.;//ns
  } 
  Float_t minTOFrawTot = 10.;
  Double_t maxTOFrawTot = 15.;
  // Double_t minTOFrawTot = 200;
  // Double_t maxTOFrawTot = 250;

  TString histname = histo->GetName();
  TPaveText text(0.65,0.5,0.9,0.75,"NDC");   
  
  if (histname.EndsWith("TOFRaws")) {
    if (histo->GetEntries()==0) {
      text.Clear();
      text.AddText("No entries. IF TOF IN RUN"); 
      text.AddText("Check the TOF TWiki"); 
      text.SetFillColor(kYellow);
      histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
      flag = AliQAv1::kWARNING;
    } else {
      Float_t multiMean = histo->GetMean();
      Float_t lowMIntegral = histo->Integral(1,20);
      Float_t totIntegral = histo->Integral(2, histo->GetNbinsX());
      
      if (totIntegral==0){ //if only "0 hits per event" bin is filled -> error
	if (histo->GetBinContent(1)>0) {
	  text.Clear();
	  text.AddText("No TOF hits for all events."); 
	  text.AddText("Call TOF on-call."); 
	  text.SetFillColor(kRed);
	  histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
	  flag = AliQAv1::kERROR;
	}
      } else { 
	if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCosmic) {
	  if (multiMean<10.){
	    text.Clear();
	    text.AddText(Form("Multiplicity within limits"));
	    text.AddText("for COSMICS: OK!!!");
	    text.SetFillColor(kGreen);
	    histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
	    flag = AliQAv1::kINFO;
	  } else {
	    text.Clear();
	    text.AddText(Form("Multiplicity too high"));
	    text.AddText("for COSMICS: email TOF on-call");
	    text.SetFillColor(kYellow);
	    histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
	    flag = AliQAv1::kWARNING;
	  }
	} else {
	  if ( (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kLowMult)
	       &&((lowMIntegral>0.9*totIntegral) || (multiMean>100))){
	    text.Clear();
	    text.AddText(Form("Unexpected mean value = %5.2f",multiMean));
	    text.AddText("OK for COSMICS and technical.");
	    text.AddText("Check TOF TWiki for pp.");
	    text.SetFillColor(kYellow);
	    histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
	    flag = AliQAv1::kWARNING;
	  } else {
	    text.Clear();
	    text.AddText(Form("Multiplicity within limits"));
	    text.AddText("    OK!!!    ");
	    text.SetFillColor(kGreen);
	    histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
	    flag = AliQAv1::kINFO;
	  }
	}
      }
    }
  }
  if (histname.EndsWith("RawsTime")) {
    if (histo->GetEntries()==0) {
      //AliWarning("Raw time histogram is empty");
      text.Clear();
      text.AddText("No entries. If TOF in the run"); 
      text.AddText("check TOF TWiki"); 
      text.SetFillColor(kYellow);
      histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
      flag = AliQAv1::kWARNING;
    } else {
      Float_t timeMean = histo->GetMean();
      Int_t lowBinId = TMath::Nint(200./binWidthTOFrawTime);
      Int_t highBinId = TMath::Nint(250./binWidthTOFrawTime);
      Float_t peakIntegral = histo->Integral(lowBinId,highBinId);
      Float_t totIntegral = histo->Integral(1, histo->GetNbinsX());      
      if ( (timeMean > minTOFrawTime) && (timeMean < maxTOFrawTime) ) {
	flag = AliQAv1::kINFO;
	text.Clear();
	text.AddText("Mean inside limits: OK!!!"); 
	text.SetFillColor(kGreen);
	histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
      } else {
	if ( (peakIntegral/totIntegral > 0.1) && (peakIntegral/totIntegral < 0.75)) {
	  AliWarning(Form("Raw time: peak/total integral = %5.2f, mean = %5.2f ns -> Check filling scheme...",peakIntegral/totIntegral,timeMean));
	  text.Clear();
	  text.AddText("If multiple peaks,"); 
	  text.AddText("check filling scheme."); 
	  text.AddText("See TOF TWiki."); 
	  text.SetFillColor(kYellow);
	  histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	   
	  flag = AliQAv1::kWARNING; 
	} else {
	  AliWarning(Form("Raw time: peak/total integral = %5.2f, mean = %5.2f ns", peakIntegral/totIntegral,timeMean));
	  text.Clear();
	  text.AddText("Mean outside limits."); 
	  text.AddText("Call TOF on-call."); 
	  text.SetFillColor(kRed);
	  histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	 
	  flag = AliQAv1::kERROR;     
	} 	
      }
    }
  }

  if (histname.EndsWith("RawsToT")) {
    if (histo->GetEntries()==0) {
      text.Clear();
      text.AddText("No entries. Check TOF TWiki"); 
      text.SetFillColor(kYellow);
      histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
      flag = AliQAv1::kWARNING;
    } else {
      Float_t timeMean = histo->GetMean();
      if ( (timeMean > minTOFrawTot) && (timeMean < maxTOFrawTot) ) {
	flag = AliQAv1::kINFO;
	text.Clear();
	text.AddText("Mean inside limits: OK!!!"); 
	text.SetFillColor(kGreen);
	histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
      } else {
	flag = AliQAv1::kERROR;
	AliWarning(Form("ToT mean = %5.2f ns", timeMean));
	text.Clear();
	text.AddText("Mean outside limits."); 
	text.AddText("If NOT a technical run,"); 
	text.AddText("call TOF on-call."); 
	text.SetFillColor(kRed);
	histo->GetListOfFunctions()->Add((TPaveText*)text.Clone());	      
      }
    }
  }
  return flag;
}
 AliTOFQAChecker.cxx:1
 AliTOFQAChecker.cxx:2
 AliTOFQAChecker.cxx:3
 AliTOFQAChecker.cxx:4
 AliTOFQAChecker.cxx:5
 AliTOFQAChecker.cxx:6
 AliTOFQAChecker.cxx:7
 AliTOFQAChecker.cxx:8
 AliTOFQAChecker.cxx:9
 AliTOFQAChecker.cxx:10
 AliTOFQAChecker.cxx:11
 AliTOFQAChecker.cxx:12
 AliTOFQAChecker.cxx:13
 AliTOFQAChecker.cxx:14
 AliTOFQAChecker.cxx:15
 AliTOFQAChecker.cxx:16
 AliTOFQAChecker.cxx:17
 AliTOFQAChecker.cxx:18
 AliTOFQAChecker.cxx:19
 AliTOFQAChecker.cxx:20
 AliTOFQAChecker.cxx:21
 AliTOFQAChecker.cxx:22
 AliTOFQAChecker.cxx:23
 AliTOFQAChecker.cxx:24
 AliTOFQAChecker.cxx:25
 AliTOFQAChecker.cxx:26
 AliTOFQAChecker.cxx:27
 AliTOFQAChecker.cxx:28
 AliTOFQAChecker.cxx:29
 AliTOFQAChecker.cxx:30
 AliTOFQAChecker.cxx:31
 AliTOFQAChecker.cxx:32
 AliTOFQAChecker.cxx:33
 AliTOFQAChecker.cxx:34
 AliTOFQAChecker.cxx:35
 AliTOFQAChecker.cxx:36
 AliTOFQAChecker.cxx:37
 AliTOFQAChecker.cxx:38
 AliTOFQAChecker.cxx:39
 AliTOFQAChecker.cxx:40
 AliTOFQAChecker.cxx:41
 AliTOFQAChecker.cxx:42
 AliTOFQAChecker.cxx:43
 AliTOFQAChecker.cxx:44
 AliTOFQAChecker.cxx:45
 AliTOFQAChecker.cxx:46
 AliTOFQAChecker.cxx:47
 AliTOFQAChecker.cxx:48
 AliTOFQAChecker.cxx:49
 AliTOFQAChecker.cxx:50
 AliTOFQAChecker.cxx:51
 AliTOFQAChecker.cxx:52
 AliTOFQAChecker.cxx:53
 AliTOFQAChecker.cxx:54
 AliTOFQAChecker.cxx:55
 AliTOFQAChecker.cxx:56
 AliTOFQAChecker.cxx:57
 AliTOFQAChecker.cxx:58
 AliTOFQAChecker.cxx:59
 AliTOFQAChecker.cxx:60
 AliTOFQAChecker.cxx:61
 AliTOFQAChecker.cxx:62
 AliTOFQAChecker.cxx:63
 AliTOFQAChecker.cxx:64
 AliTOFQAChecker.cxx:65
 AliTOFQAChecker.cxx:66
 AliTOFQAChecker.cxx:67
 AliTOFQAChecker.cxx:68
 AliTOFQAChecker.cxx:69
 AliTOFQAChecker.cxx:70
 AliTOFQAChecker.cxx:71
 AliTOFQAChecker.cxx:72
 AliTOFQAChecker.cxx:73
 AliTOFQAChecker.cxx:74
 AliTOFQAChecker.cxx:75
 AliTOFQAChecker.cxx:76
 AliTOFQAChecker.cxx:77
 AliTOFQAChecker.cxx:78
 AliTOFQAChecker.cxx:79
 AliTOFQAChecker.cxx:80
 AliTOFQAChecker.cxx:81
 AliTOFQAChecker.cxx:82
 AliTOFQAChecker.cxx:83
 AliTOFQAChecker.cxx:84
 AliTOFQAChecker.cxx:85
 AliTOFQAChecker.cxx:86
 AliTOFQAChecker.cxx:87
 AliTOFQAChecker.cxx:88
 AliTOFQAChecker.cxx:89
 AliTOFQAChecker.cxx:90
 AliTOFQAChecker.cxx:91
 AliTOFQAChecker.cxx:92
 AliTOFQAChecker.cxx:93
 AliTOFQAChecker.cxx:94
 AliTOFQAChecker.cxx:95
 AliTOFQAChecker.cxx:96
 AliTOFQAChecker.cxx:97
 AliTOFQAChecker.cxx:98
 AliTOFQAChecker.cxx:99
 AliTOFQAChecker.cxx:100
 AliTOFQAChecker.cxx:101
 AliTOFQAChecker.cxx:102
 AliTOFQAChecker.cxx:103
 AliTOFQAChecker.cxx:104
 AliTOFQAChecker.cxx:105
 AliTOFQAChecker.cxx:106
 AliTOFQAChecker.cxx:107
 AliTOFQAChecker.cxx:108
 AliTOFQAChecker.cxx:109
 AliTOFQAChecker.cxx:110
 AliTOFQAChecker.cxx:111
 AliTOFQAChecker.cxx:112
 AliTOFQAChecker.cxx:113
 AliTOFQAChecker.cxx:114
 AliTOFQAChecker.cxx:115
 AliTOFQAChecker.cxx:116
 AliTOFQAChecker.cxx:117
 AliTOFQAChecker.cxx:118
 AliTOFQAChecker.cxx:119
 AliTOFQAChecker.cxx:120
 AliTOFQAChecker.cxx:121
 AliTOFQAChecker.cxx:122
 AliTOFQAChecker.cxx:123
 AliTOFQAChecker.cxx:124
 AliTOFQAChecker.cxx:125
 AliTOFQAChecker.cxx:126
 AliTOFQAChecker.cxx:127
 AliTOFQAChecker.cxx:128
 AliTOFQAChecker.cxx:129
 AliTOFQAChecker.cxx:130
 AliTOFQAChecker.cxx:131
 AliTOFQAChecker.cxx:132
 AliTOFQAChecker.cxx:133
 AliTOFQAChecker.cxx:134
 AliTOFQAChecker.cxx:135
 AliTOFQAChecker.cxx:136
 AliTOFQAChecker.cxx:137
 AliTOFQAChecker.cxx:138
 AliTOFQAChecker.cxx:139
 AliTOFQAChecker.cxx:140
 AliTOFQAChecker.cxx:141
 AliTOFQAChecker.cxx:142
 AliTOFQAChecker.cxx:143
 AliTOFQAChecker.cxx:144
 AliTOFQAChecker.cxx:145
 AliTOFQAChecker.cxx:146
 AliTOFQAChecker.cxx:147
 AliTOFQAChecker.cxx:148
 AliTOFQAChecker.cxx:149
 AliTOFQAChecker.cxx:150
 AliTOFQAChecker.cxx:151
 AliTOFQAChecker.cxx:152
 AliTOFQAChecker.cxx:153
 AliTOFQAChecker.cxx:154
 AliTOFQAChecker.cxx:155
 AliTOFQAChecker.cxx:156
 AliTOFQAChecker.cxx:157
 AliTOFQAChecker.cxx:158
 AliTOFQAChecker.cxx:159
 AliTOFQAChecker.cxx:160
 AliTOFQAChecker.cxx:161
 AliTOFQAChecker.cxx:162
 AliTOFQAChecker.cxx:163
 AliTOFQAChecker.cxx:164
 AliTOFQAChecker.cxx:165
 AliTOFQAChecker.cxx:166
 AliTOFQAChecker.cxx:167
 AliTOFQAChecker.cxx:168
 AliTOFQAChecker.cxx:169
 AliTOFQAChecker.cxx:170
 AliTOFQAChecker.cxx:171
 AliTOFQAChecker.cxx:172
 AliTOFQAChecker.cxx:173
 AliTOFQAChecker.cxx:174
 AliTOFQAChecker.cxx:175
 AliTOFQAChecker.cxx:176
 AliTOFQAChecker.cxx:177
 AliTOFQAChecker.cxx:178
 AliTOFQAChecker.cxx:179
 AliTOFQAChecker.cxx:180
 AliTOFQAChecker.cxx:181
 AliTOFQAChecker.cxx:182
 AliTOFQAChecker.cxx:183
 AliTOFQAChecker.cxx:184
 AliTOFQAChecker.cxx:185
 AliTOFQAChecker.cxx:186
 AliTOFQAChecker.cxx:187
 AliTOFQAChecker.cxx:188
 AliTOFQAChecker.cxx:189
 AliTOFQAChecker.cxx:190
 AliTOFQAChecker.cxx:191
 AliTOFQAChecker.cxx:192
 AliTOFQAChecker.cxx:193
 AliTOFQAChecker.cxx:194
 AliTOFQAChecker.cxx:195
 AliTOFQAChecker.cxx:196
 AliTOFQAChecker.cxx:197
 AliTOFQAChecker.cxx:198
 AliTOFQAChecker.cxx:199
 AliTOFQAChecker.cxx:200
 AliTOFQAChecker.cxx:201
 AliTOFQAChecker.cxx:202
 AliTOFQAChecker.cxx:203
 AliTOFQAChecker.cxx:204
 AliTOFQAChecker.cxx:205
 AliTOFQAChecker.cxx:206
 AliTOFQAChecker.cxx:207
 AliTOFQAChecker.cxx:208
 AliTOFQAChecker.cxx:209
 AliTOFQAChecker.cxx:210
 AliTOFQAChecker.cxx:211
 AliTOFQAChecker.cxx:212
 AliTOFQAChecker.cxx:213
 AliTOFQAChecker.cxx:214
 AliTOFQAChecker.cxx:215
 AliTOFQAChecker.cxx:216
 AliTOFQAChecker.cxx:217
 AliTOFQAChecker.cxx:218
 AliTOFQAChecker.cxx:219
 AliTOFQAChecker.cxx:220
 AliTOFQAChecker.cxx:221
 AliTOFQAChecker.cxx:222
 AliTOFQAChecker.cxx:223
 AliTOFQAChecker.cxx:224
 AliTOFQAChecker.cxx:225
 AliTOFQAChecker.cxx:226
 AliTOFQAChecker.cxx:227
 AliTOFQAChecker.cxx:228
 AliTOFQAChecker.cxx:229
 AliTOFQAChecker.cxx:230
 AliTOFQAChecker.cxx:231
 AliTOFQAChecker.cxx:232
 AliTOFQAChecker.cxx:233
 AliTOFQAChecker.cxx:234
 AliTOFQAChecker.cxx:235
 AliTOFQAChecker.cxx:236
 AliTOFQAChecker.cxx:237
 AliTOFQAChecker.cxx:238
 AliTOFQAChecker.cxx:239
 AliTOFQAChecker.cxx:240
 AliTOFQAChecker.cxx:241
 AliTOFQAChecker.cxx:242
 AliTOFQAChecker.cxx:243
 AliTOFQAChecker.cxx:244
 AliTOFQAChecker.cxx:245
 AliTOFQAChecker.cxx:246
 AliTOFQAChecker.cxx:247
 AliTOFQAChecker.cxx:248
 AliTOFQAChecker.cxx:249
 AliTOFQAChecker.cxx:250
 AliTOFQAChecker.cxx:251
 AliTOFQAChecker.cxx:252
 AliTOFQAChecker.cxx:253
 AliTOFQAChecker.cxx:254
 AliTOFQAChecker.cxx:255
 AliTOFQAChecker.cxx:256
 AliTOFQAChecker.cxx:257
 AliTOFQAChecker.cxx:258
 AliTOFQAChecker.cxx:259
 AliTOFQAChecker.cxx:260
 AliTOFQAChecker.cxx:261
 AliTOFQAChecker.cxx:262
 AliTOFQAChecker.cxx:263
 AliTOFQAChecker.cxx:264
 AliTOFQAChecker.cxx:265
 AliTOFQAChecker.cxx:266
 AliTOFQAChecker.cxx:267
 AliTOFQAChecker.cxx:268
 AliTOFQAChecker.cxx:269
 AliTOFQAChecker.cxx:270
 AliTOFQAChecker.cxx:271
 AliTOFQAChecker.cxx:272
 AliTOFQAChecker.cxx:273
 AliTOFQAChecker.cxx:274
 AliTOFQAChecker.cxx:275
 AliTOFQAChecker.cxx:276
 AliTOFQAChecker.cxx:277