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 for ACORDE. 
//  Default implementation
//  Authors:
//	Mario Rodriguez Cahuantzi <mrodrigu@mail.cern.ch> (FCFM-BUAP) 
//	Luciano Diaz Gonzalez <luciano.diaz@nucleares.unam.mx> (ICN-UNAM)
//	Arturo Fernandez <afernan@mail.cern.ch> (FCFM-BUAP)
//  Last update: Nov. 14t 2009 --> MRC <mrodrigu@mail.cern.ch> (FCFM-BUAP) 
//...

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

// --- AliRoot header files ---
#include "AliLog.h"
#include "AliQAv1.h"
#include "AliQAChecker.h"
#include "AliACORDEQAChecker.h"
#include "AliCDBEntry.h"
#include "AliQAManager.h"

/*************************************************************************
   Last update: Oct. 10th 2011 from Mario RC, <mrodrigu@mail.cern.ch>
	|-> Adding the checker class for raw and esd index
	|-> Setting the threshold lines and box for DQM shifter

*************************************************************************/

ClassImp(AliACORDEQAChecker)

//____________________________________________________________________________

AliACORDEQAChecker::AliACORDEQAChecker()  :
AliQACheckerBase("ACORDE","ACORDE Quality Assurance Data Maker"),
fTextDQMShifterInfo(new TPaveText(2.2,0.90,2.9,0.99,"T")),
fMax(new TLine(1,0.5,3,0.5))
{
	// default constructor
	fMax->SetLineColor(kGreen);
	fMax->SetLineWidth(3);
}
//____________________________________________________________________________
AliACORDEQAChecker::~AliACORDEQAChecker()
{
	// destructor
	delete fTextDQMShifterInfo;
	delete fMax;
}
//____________________________________________________________________________
AliACORDEQAChecker::AliACORDEQAChecker(const AliACORDEQAChecker& qac) :
AliQACheckerBase(qac.GetName(), qac.GetTitle()),
fTextDQMShifterInfo(new TPaveText(2.2,0.90,2.9,0.99,"T")),
fMax(static_cast<TLine*>(qac.fMax->Clone()))
{
	//
}
//____________________________________________________________________________
AliACORDEQAChecker& AliACORDEQAChecker::operator = (const AliACORDEQAChecker &qac)
{
	// use cpy option from constructor
	if (&qac==this) return *this;
	new (this) AliACORDEQAChecker(qac);
	return *this;
}
//____________________________________________________________________________
void AliACORDEQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t /*index*/)
{
  for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) 
    test[specie] = 0.0 ; 
}
//____________________________________________________________________________
void AliACORDEQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t /*index*/, TObjArray ** list, const AliDetectorRecoParam * /*recoParam*/)
{
// Close version to the final one for the ACORDE QA Checker
  
// Loop over the run species (for specie!= cosmic by now we set QA to INFO) 
  
  for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) 
  {
	test[specie] = 1.0;
	if ( !AliQAv1::Instance()->IsEventSpecieSet(specie) ) continue ; 
	if (list[specie]->GetEntries() == 0) test[specie] = 1.; // Nothing to check
	else 
	{
		TIter next(list[specie]) ; 
		TH1 * hdata ; // Data created by the AliACORDEQADataMakerXXX (Sim/Rec)
		while ( (hdata = dynamic_cast<TH1 *>(next())) ) 
		{
			//if (hdata) 
			if (hdata->GetEntries()!=0)
			{ 
				Double_t rv = 0.0 ; 
				if(hdata->GetEntries()>0) rv=1; 
				AliDebug(AliQAv1::GetQADebugLevel(), Form("%s -> %f", hdata->GetName(), rv)) ; 
				TString hdataName = hdata->GetName();
				//if (hdata->GetListOfFunctions()->GetEntries() == 0) continue;  
						
				if (hdataName.Contains("fhACORDEStatusAMU_DQM"))
				{
					if (!hdata->GetListOfFunctions()->Contains(fTextDQMShifterInfo))
						hdata->GetListOfFunctions()->Add(fTextDQMShifterInfo);
					if (!hdata->GetListOfFunctions()->Contains(fMax))
						hdata->GetListOfFunctions()->Add(fMax);
				}
				// check with OCDB ref. data
				if ( (fRefOCDBSubDir[specie]) && (hdataName.Contains("ACORDEBitPattern")) ) 
				{
					TH1 * href = NULL;
					if (fRefSubDir) href = static_cast<TH1*>(fRefSubDir->Get(hdata->GetName()));
					else if (fRefOCDBSubDir[specie]) href = static_cast<TH1*>(fRefOCDBSubDir[specie]->FindObject(hdata->GetName()));
					test[specie] = CheckAcordeRefHits(href,hdata);
				}else
				{
					if (hdataName.Contains("ACORDEBitPattern"))
						// Here we use an inner QA Checher without the QAref data
					{
						Float_t acoDataMax = hdata->GetMaximum();
						Int_t flagAcoQAChecker = 0;
						if (acoDataMax == 0) continue;
						for(Int_t i=0;i<60;i++)
						{
							if ((hdata->GetBinContent(i)/acoDataMax) < 0.75) flagAcoQAChecker++; 
						}
						Double_t simpleFlag = 1.-flagAcoQAChecker/60.;
						if ( (simpleFlag >= 0.90) && (simpleFlag <= 1.0) ) test[specie] = 0.75; // INFO
						if ( (simpleFlag >= 0.70) && (simpleFlag < 0.90) ) test[specie] = 0.50; // WARNING
						if ( (simpleFlag >= 0.25) && (simpleFlag < 0.70) ) test[specie] = 0.25; // ERROR
						if ( (simpleFlag >= 0.0) && (simpleFlag < 0.25) )  test[specie] = -1.0; // FATAL
						if (test[specie]>0) rv = test[specie];
						else rv = 1.0;
					}
					if (hdataName.Contains("fhACORDEStatusAMU_DQM"))
					{
						Float_t goodModules = hdata->GetBinContent(1);
						Float_t badModules = hdata->GetBinContent(2);
						if (goodModules >= badModules)
							test[specie] = 0.75;
						else test[specie] = 0.30;
						
					}	 // check for DQM condition
					rv = test[specie];
					if (fTextDQMShifterInfo) // DQM-flag asignment
					{
						fTextDQMShifterInfo->Clear();
						if (rv > 0.4){
							fTextDQMShifterInfo->SetFillColor(kGreen);
							fTextDQMShifterInfo->AddText("ACORDE: O.K.");
						}else{
							fTextDQMShifterInfo->SetFillColor(kRed);
							fTextDQMShifterInfo->AddText("ACORDE: Not, O.K.");
						}
					} // end DQM flag asignment
				}// NO OCDB checking
			} // hdata with entries
			else AliError("Data type cannot be processed") ;
		} // loop over histograms from QADataMaker
	}  // end checker
    if ( (specie == AliRecoParam::kHighMult) || (specie == AliRecoParam::kLowMult) || (specie == AliRecoParam::kCalib) ) test[specie] = 0.75;
  } // end of species
}
//____________________________________________________________________________
Double_t AliACORDEQAChecker::CheckAcordeRefHits(const TH1 * href, const TH1 * hdata) const
{
	Double_t test = 0.;
	Int_t flag=0;
	for (Int_t i=0;i<60;i++)
	{
		if (TMath::Abs(href->GetBinContent(i)-hdata->GetBinContent(i))>10) flag++;
	}
	if ((flag>50)&&(flag<=60)) test = -1.;
	if ((flag>30)&&(flag<=50)) test = 0.25;
	if ((flag>10)&&(flag<=30)) test = 0.5;
	if ((flag>0)&&(flag<=10)) test = 0.75;
	return test;
}
 AliACORDEQAChecker.cxx:1
 AliACORDEQAChecker.cxx:2
 AliACORDEQAChecker.cxx:3
 AliACORDEQAChecker.cxx:4
 AliACORDEQAChecker.cxx:5
 AliACORDEQAChecker.cxx:6
 AliACORDEQAChecker.cxx:7
 AliACORDEQAChecker.cxx:8
 AliACORDEQAChecker.cxx:9
 AliACORDEQAChecker.cxx:10
 AliACORDEQAChecker.cxx:11
 AliACORDEQAChecker.cxx:12
 AliACORDEQAChecker.cxx:13
 AliACORDEQAChecker.cxx:14
 AliACORDEQAChecker.cxx:15
 AliACORDEQAChecker.cxx:16
 AliACORDEQAChecker.cxx:17
 AliACORDEQAChecker.cxx:18
 AliACORDEQAChecker.cxx:19
 AliACORDEQAChecker.cxx:20
 AliACORDEQAChecker.cxx:21
 AliACORDEQAChecker.cxx:22
 AliACORDEQAChecker.cxx:23
 AliACORDEQAChecker.cxx:24
 AliACORDEQAChecker.cxx:25
 AliACORDEQAChecker.cxx:26
 AliACORDEQAChecker.cxx:27
 AliACORDEQAChecker.cxx:28
 AliACORDEQAChecker.cxx:29
 AliACORDEQAChecker.cxx:30
 AliACORDEQAChecker.cxx:31
 AliACORDEQAChecker.cxx:32
 AliACORDEQAChecker.cxx:33
 AliACORDEQAChecker.cxx:34
 AliACORDEQAChecker.cxx:35
 AliACORDEQAChecker.cxx:36
 AliACORDEQAChecker.cxx:37
 AliACORDEQAChecker.cxx:38
 AliACORDEQAChecker.cxx:39
 AliACORDEQAChecker.cxx:40
 AliACORDEQAChecker.cxx:41
 AliACORDEQAChecker.cxx:42
 AliACORDEQAChecker.cxx:43
 AliACORDEQAChecker.cxx:44
 AliACORDEQAChecker.cxx:45
 AliACORDEQAChecker.cxx:46
 AliACORDEQAChecker.cxx:47
 AliACORDEQAChecker.cxx:48
 AliACORDEQAChecker.cxx:49
 AliACORDEQAChecker.cxx:50
 AliACORDEQAChecker.cxx:51
 AliACORDEQAChecker.cxx:52
 AliACORDEQAChecker.cxx:53
 AliACORDEQAChecker.cxx:54
 AliACORDEQAChecker.cxx:55
 AliACORDEQAChecker.cxx:56
 AliACORDEQAChecker.cxx:57
 AliACORDEQAChecker.cxx:58
 AliACORDEQAChecker.cxx:59
 AliACORDEQAChecker.cxx:60
 AliACORDEQAChecker.cxx:61
 AliACORDEQAChecker.cxx:62
 AliACORDEQAChecker.cxx:63
 AliACORDEQAChecker.cxx:64
 AliACORDEQAChecker.cxx:65
 AliACORDEQAChecker.cxx:66
 AliACORDEQAChecker.cxx:67
 AliACORDEQAChecker.cxx:68
 AliACORDEQAChecker.cxx:69
 AliACORDEQAChecker.cxx:70
 AliACORDEQAChecker.cxx:71
 AliACORDEQAChecker.cxx:72
 AliACORDEQAChecker.cxx:73
 AliACORDEQAChecker.cxx:74
 AliACORDEQAChecker.cxx:75
 AliACORDEQAChecker.cxx:76
 AliACORDEQAChecker.cxx:77
 AliACORDEQAChecker.cxx:78
 AliACORDEQAChecker.cxx:79
 AliACORDEQAChecker.cxx:80
 AliACORDEQAChecker.cxx:81
 AliACORDEQAChecker.cxx:82
 AliACORDEQAChecker.cxx:83
 AliACORDEQAChecker.cxx:84
 AliACORDEQAChecker.cxx:85
 AliACORDEQAChecker.cxx:86
 AliACORDEQAChecker.cxx:87
 AliACORDEQAChecker.cxx:88
 AliACORDEQAChecker.cxx:89
 AliACORDEQAChecker.cxx:90
 AliACORDEQAChecker.cxx:91
 AliACORDEQAChecker.cxx:92
 AliACORDEQAChecker.cxx:93
 AliACORDEQAChecker.cxx:94
 AliACORDEQAChecker.cxx:95
 AliACORDEQAChecker.cxx:96
 AliACORDEQAChecker.cxx:97
 AliACORDEQAChecker.cxx:98
 AliACORDEQAChecker.cxx:99
 AliACORDEQAChecker.cxx:100
 AliACORDEQAChecker.cxx:101
 AliACORDEQAChecker.cxx:102
 AliACORDEQAChecker.cxx:103
 AliACORDEQAChecker.cxx:104
 AliACORDEQAChecker.cxx:105
 AliACORDEQAChecker.cxx:106
 AliACORDEQAChecker.cxx:107
 AliACORDEQAChecker.cxx:108
 AliACORDEQAChecker.cxx:109
 AliACORDEQAChecker.cxx:110
 AliACORDEQAChecker.cxx:111
 AliACORDEQAChecker.cxx:112
 AliACORDEQAChecker.cxx:113
 AliACORDEQAChecker.cxx:114
 AliACORDEQAChecker.cxx:115
 AliACORDEQAChecker.cxx:116
 AliACORDEQAChecker.cxx:117
 AliACORDEQAChecker.cxx:118
 AliACORDEQAChecker.cxx:119
 AliACORDEQAChecker.cxx:120
 AliACORDEQAChecker.cxx:121
 AliACORDEQAChecker.cxx:122
 AliACORDEQAChecker.cxx:123
 AliACORDEQAChecker.cxx:124
 AliACORDEQAChecker.cxx:125
 AliACORDEQAChecker.cxx:126
 AliACORDEQAChecker.cxx:127
 AliACORDEQAChecker.cxx:128
 AliACORDEQAChecker.cxx:129
 AliACORDEQAChecker.cxx:130
 AliACORDEQAChecker.cxx:131
 AliACORDEQAChecker.cxx:132
 AliACORDEQAChecker.cxx:133
 AliACORDEQAChecker.cxx:134
 AliACORDEQAChecker.cxx:135
 AliACORDEQAChecker.cxx:136
 AliACORDEQAChecker.cxx:137
 AliACORDEQAChecker.cxx:138
 AliACORDEQAChecker.cxx:139
 AliACORDEQAChecker.cxx:140
 AliACORDEQAChecker.cxx:141
 AliACORDEQAChecker.cxx:142
 AliACORDEQAChecker.cxx:143
 AliACORDEQAChecker.cxx:144
 AliACORDEQAChecker.cxx:145
 AliACORDEQAChecker.cxx:146
 AliACORDEQAChecker.cxx:147
 AliACORDEQAChecker.cxx:148
 AliACORDEQAChecker.cxx:149
 AliACORDEQAChecker.cxx:150
 AliACORDEQAChecker.cxx:151
 AliACORDEQAChecker.cxx:152
 AliACORDEQAChecker.cxx:153
 AliACORDEQAChecker.cxx:154
 AliACORDEQAChecker.cxx:155
 AliACORDEQAChecker.cxx:156
 AliACORDEQAChecker.cxx:157
 AliACORDEQAChecker.cxx:158
 AliACORDEQAChecker.cxx:159
 AliACORDEQAChecker.cxx:160
 AliACORDEQAChecker.cxx:161
 AliACORDEQAChecker.cxx:162
 AliACORDEQAChecker.cxx:163
 AliACORDEQAChecker.cxx:164
 AliACORDEQAChecker.cxx:165
 AliACORDEQAChecker.cxx:166
 AliACORDEQAChecker.cxx:167
 AliACORDEQAChecker.cxx:168
 AliACORDEQAChecker.cxx:169
 AliACORDEQAChecker.cxx:170
 AliACORDEQAChecker.cxx:171
 AliACORDEQAChecker.cxx:172
 AliACORDEQAChecker.cxx:173
 AliACORDEQAChecker.cxx:174
 AliACORDEQAChecker.cxx:175
 AliACORDEQAChecker.cxx:176
 AliACORDEQAChecker.cxx:177
 AliACORDEQAChecker.cxx:178
 AliACORDEQAChecker.cxx:179
 AliACORDEQAChecker.cxx:180
 AliACORDEQAChecker.cxx:181
 AliACORDEQAChecker.cxx:182
 AliACORDEQAChecker.cxx:183
 AliACORDEQAChecker.cxx:184
 AliACORDEQAChecker.cxx:185
 AliACORDEQAChecker.cxx:186
 AliACORDEQAChecker.cxx:187
 AliACORDEQAChecker.cxx:188
 AliACORDEQAChecker.cxx:189
 AliACORDEQAChecker.cxx:190
 AliACORDEQAChecker.cxx:191
 AliACORDEQAChecker.cxx:192
 AliACORDEQAChecker.cxx:193
 AliACORDEQAChecker.cxx:194
 AliACORDEQAChecker.cxx:195
 AliACORDEQAChecker.cxx:196
 AliACORDEQAChecker.cxx:197