#include <TString.h>
#include <TPaveText.h>
#include <TObjArray.h>
-#include "TList.h"
-
-// --- Standard library ---
+#include <TParameter.h>
+#include <TList.h>
// --- AliRoot header files ---
#include "AliLog.h"
+#include "AliCDBManager.h"
+#include "AliCDBEntry.h"
+#include "AliQAThresholds.h"
#include "AliZDCQAChecker.h"
ClassImp(AliZDCQAChecker)
+ //_________________________________________________________________
+AliZDCQAChecker::AliZDCQAChecker() :
+ AliQACheckerBase("ZDC","ZDC Quality Assurance Data Maker"),
+ fQAThresholds(NULL),
+ fZDCQAThr_ZNCTDCRefThr(-322.7),
+ fZDCQAThr_ZPCTDCRefThr(-321.4),
+ fZDCQAThr_ZNATDCRefThr(-321.6),
+ fZDCQAThr_ZPATDCRefThr(-321.7),
+ fZDCQAThr_ZEM1TDCRefThr(-316.2),
+ fZDCQAThr_ZEM2TDCRefThr(-315.4)
+{
+ //constructor
+}
+
//____________________________________________________________________________
void AliZDCQAChecker::Check(Double_t * test, AliQAv1::ALITASK_t index, TObjArray ** list,
const AliDetectorRecoParam * /*recoParam*/)
TObjArray messages;
messages.SetOwner(kTRUE);
+
+ GetThresholds();
for(Int_t specie = 0; specie<AliRecoParam::kNSpecies; specie++){
Int_t count = 0;
Float_t sumADCZNA=0., sumADCZNC=0., sumADCZPA=0., sumADCZPC=0.;
Float_t adcCZNA=0., adcCZNC=0., adcCZPA=0., adcCZPC=0.;
Float_t adcQZNA=0., adcQZNC=0., adcQZPA=0., adcQZPC=0.;
+ Int_t nentries = -99;
while((hdata = dynamic_cast<TH1 *>(next()))){
if(hdata){
Bool_t iDetPM = kTRUE;
// --- Checks
+ if(irawHisto==20) nentries = Int_t (hdata->GetEntries());
if(irawHisto==22){
Float_t resADC=0.;
for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
test[specie] += res;
count++;
}
+ if(nentries != -99) messages.Add(new TObjString(Form("#entries %d",nentries)));
+ else messages.Add(new TObjString("#entries not known"));
+ //
Float_t rv=1.;
if(hdata->GetNbinsX() != 0) rv = resADC/hdata->GetNbinsX();
if(rv == 1.) messages.Add(new TObjString("ADCs are OK!"));
else if(iDetPM==kFALSE){
- messages.Add(new TObjString("Problem with ADCs!"));
- messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL"));
- messages.Add(new TObjString("OR A STANDALONE_PEDESTAL RUN"));
+ messages.Add(new TObjString("Problem with some ADC!"));
+ messages.Add(new TObjString("IF THIS IS A PHYSICS RUN"));
}
else if(iDetPM==kTRUE) messages.Add(new TObjString("Minor problem with ADCs"));
SetupHisto(messages, *hdata, rv);
}
else if(irawHisto==23){
- Double_t refTDCs = -319.5;
+ // Reference values must be inserted in the order:
+ // ZNC, ZPC, ZNA, ZPA, ZEM1, ZEM2
+ // 2012 -> Reference values from RUN 177399
+ //Double_t refTDCs[6] = {-322.7,-321.4,-321.6,-321.7,-316.2,-315.4};
+ // 11/2012 -> QA threshold values x TDCs are read from configuration file
+ Double_t refTDCs[6];
+ refTDCs[0] = fZDCQAThr_ZNCTDCRefThr;
+ refTDCs[1] = fZDCQAThr_ZPCTDCRefThr;
+ refTDCs[2] = fZDCQAThr_ZNATDCRefThr;
+ refTDCs[3] = fZDCQAThr_ZPATDCRefThr;
+ refTDCs[4] = fZDCQAThr_ZEM1TDCRefThr;
+ refTDCs[5] = fZDCQAThr_ZEM2TDCRefThr;
+ //
Float_t resTDC=0.;
- for(int ibin=5; ibin<=6; ibin++){
- if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs)<2.){
+ for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
+ if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<3.){
res=1.;
}
- else if((TMath::Abs((hdata->GetBinContent(ibin))-refTDCs)>=2.) &&
- (TMath::Abs((hdata->GetBinContent(ibin))-refTDCs)<=3.)){
- res=0.9;
- }
- else{
- res=0.5;
+ else if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<5.){
+ res=0.8;
}
+ else res=0.5;
//
resTDC += res;
test[specie] += res;
count++;
}
Float_t rv=1.;
- if(hdata->GetNbinsX() != 0) rv = resTDC/2;
+ if(hdata->GetNbinsX() != 0) rv = resTDC/hdata->GetNbinsX();
if(rv == 1.) messages.Add(new TObjString("TDCs are OK!"));
- else if(rv<1 && rv>=0.9) messages.Add(new TObjString("Minor problem with TDCs"));
+ else if(rv<1. && rv>0.75) messages.Add(new TObjString("Minor problem with TDCs"));
else{
messages.Add(new TObjString("Serious problem in ZDC timing"));
- messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
- messages.Add(new TObjString("OR A STANDALONE_PEDESTAL RUN"));
+ messages.Add(new TObjString("IF THIS IS A PHYSICS RUN"));
}
SetupHisto(messages, *hdata, rv);
}
//
// Check ESD HIGH GAIN CHAIN histos
if(hdata->GetEntries()>0){
- if(esdInd==2) sumADCZNC = hdata->GetMean();
- else if(esdInd==3) sumADCZNA = hdata->GetMean();
- else if(esdInd==4) sumADCZPC = hdata->GetMean();
- else if(esdInd==5) sumADCZPA = hdata->GetMean();
- else if(esdInd==8) pmQZNC = hdata->GetMean();
- else if(esdInd==9) pmQZNA = hdata->GetMean();
- else if(esdInd==10) pmQZPC = hdata->GetMean();
- else if(esdInd==11) pmQZPA = hdata->GetMean();
- else if(esdInd==12) pmCZNC = hdata->GetMean();
- else if(esdInd==13) pmCZNA = hdata->GetMean();
- else if(esdInd==14) pmCZPC = hdata->GetMean();
- else if(esdInd==15) pmCZPA = hdata->GetMean();
+ if(esdInd==0) sumADCZNC = hdata->GetMean();
+ else if(esdInd==1) sumADCZNA = hdata->GetMean();
+ else if(esdInd==2) sumADCZPC = hdata->GetMean();
+ else if(esdInd==3) sumADCZPA = hdata->GetMean();
+ else if(esdInd==6) pmQZNC = hdata->GetMean();
+ else if(esdInd==7) pmQZNA = hdata->GetMean();
+ else if(esdInd==8) pmQZPC = hdata->GetMean();
+ else if(esdInd==9) pmQZPA = hdata->GetMean();
+ else if(esdInd==10) pmCZNC = hdata->GetMean();
+ else if(esdInd==11) pmCZNA = hdata->GetMean();
+ else if(esdInd==12) pmCZPC = hdata->GetMean();
+ else if(esdInd==13) pmCZPA = hdata->GetMean();
}
//
// --- Check whether (sum PMQi - PMC)/PMC < percentageDiff
// ====================================================================
// Checks for A-A events
// ====================================================================
- else if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kHighMult) {
+ if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kHighMult) {
if(list[specie]->GetEntries()==0){
AliWarning("\t The list to be checked is empty!");
return ;
Float_t sumADCZNA=0., sumADCZNC=0., sumADCZPA=0., sumADCZPC=0.;
Float_t adcCZNA=0., adcCZNC=0., adcCZPA=0., adcCZPC=0.;
Float_t adcQZNA=0., adcQZNC=0., adcQZPA=0., adcQZPC=0.;
+ Int_t nentries=-99;
while((hdata = dynamic_cast<TH1 *>(next()))){
if(hdata){
Bool_t iDetPM = kTRUE;
// --- Checks
+ if(irawHisto==20) nentries = Int_t (hdata->GetEntries());
if(irawHisto==22){
Float_t resADC=0.;
for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
test[specie] += res;
count++;
}
+ if(nentries != -99) messages.Add(new TObjString(Form("#entries %d",nentries)));
+ else messages.Add(new TObjString("#entries not known"));
+ //
Float_t rv=1.;
if(hdata->GetNbinsX() != 0) rv = resADC/hdata->GetNbinsX();
- if(rv == 1.) messages.Add(new TObjString("ADCs are OK!"));
+ if(rv > 0.98) messages.Add(new TObjString("ADCs are OK!"));
else if(iDetPM==kFALSE){
messages.Add(new TObjString("Problem with ADCs!"));
- messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
+ messages.Add(new TObjString("IF THIS IS A PHYSICS RUN"));
}
else if(iDetPM==kTRUE) messages.Add(new TObjString("Minor problem with ADCs"));
SetupHisto(messages, *hdata, rv);
}
else if(irawHisto==23){
- Double_t refTDCs[6] = {-83.0,-78.1,-80.2,-79.3,-81.0,-80.9};
+ // Reference values from RUN 137161
+ //Double_t refTDCs[6] = {-320.7,-319.0,-318.6,-319.9,-321.3,-320.8};
+ // 11/2012 -> QA threshold values x TDCs are read from configuration file
+ Double_t refTDCs[6];
+ refTDCs[0] = fZDCQAThr_ZNCTDCRefThr;
+ refTDCs[1] = fZDCQAThr_ZPCTDCRefThr;
+ refTDCs[2] = fZDCQAThr_ZNATDCRefThr;
+ refTDCs[3] = fZDCQAThr_ZPATDCRefThr;
+ refTDCs[4] = fZDCQAThr_ZEM1TDCRefThr;
+ refTDCs[5] = fZDCQAThr_ZEM2TDCRefThr;
+ //
Float_t resTDC=0.;
for(int ibin=1; ibin<=hdata->GetNbinsX(); ibin++){
- if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<4.){
+ if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<3.){
res=1.;
}
- else{
- res=0.5;
+ else if(TMath::Abs((hdata->GetBinContent(ibin))-refTDCs[ibin-1])<4.){
+ res=0.8;
}
+ else res=0.5;
//
resTDC += res;
test[specie] += res;
Float_t rv=1.;
if(hdata->GetNbinsX() != 0) rv = resTDC/hdata->GetNbinsX();
if(rv == 1.) messages.Add(new TObjString("TDCs are OK!"));
- else if(rv<1 && rv>0.9) messages.Add(new TObjString("Minor problem with TDCs"));
+ else if(rv<1 && rv>0.75) messages.Add(new TObjString("Minor problem with TDCs"));
else{
messages.Add(new TObjString("Serious problem in ZDC timing"));
- messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
+ messages.Add(new TObjString("IF THIS IS A PHYSICS RUN"));
}
SetupHisto(messages, *hdata, rv);
}
- else if(irawHisto==26){
- Double_t yZNC=hdata->GetBinContent(2);
- Double_t yZNA=hdata->GetBinContent(4);
- if(TMath::Abs(yZNC)<0.4 && TMath::Abs(yZNA)<0.4) res=1.;
- else res=0.5;
- test[specie] += res;
- count++;
- //
- printf(" yZNC = %1.2f yZNA = %1.2f -> res %1.2f\n",yZNC, yZNA,res);
- if(res == 1.) messages.Add(new TObjString("ZN positions are OK!"));
- else{
- messages.Add(new TObjString("Problem in ZN positions!"));
- messages.Add(new TObjString("IF THIS IS NOT A TECHNICAL RUN"));
- }
- SetupHisto(messages, *hdata, res);
- }
irawHisto++;
}
//
// Check ESD HIGH GAIN CHAIN histos
if(hdata->GetEntries()>0){
- if(esdInd==2) sumADCZNC = hdata->GetMean();
- else if(esdInd==3) sumADCZNA = hdata->GetMean();
- else if(esdInd==4) sumADCZPC = hdata->GetMean();
- else if(esdInd==5) sumADCZPA = hdata->GetMean();
- else if(esdInd==8) pmQZNC = hdata->GetMean();
- else if(esdInd==9) pmQZNA = hdata->GetMean();
- else if(esdInd==10) pmQZPC = hdata->GetMean();
- else if(esdInd==11) pmQZPA = hdata->GetMean();
- else if(esdInd==12) pmCZNC = hdata->GetMean();
- else if(esdInd==13) pmCZNA = hdata->GetMean();
- else if(esdInd==14) pmCZPC = hdata->GetMean();
- else if(esdInd==15) pmCZPA = hdata->GetMean();
+ if(esdInd==0) sumADCZNC = hdata->GetMean();
+ else if(esdInd==1) sumADCZNA = hdata->GetMean();
+ else if(esdInd==2) sumADCZPC = hdata->GetMean();
+ else if(esdInd==3) sumADCZPA = hdata->GetMean();
+ else if(esdInd==6) pmQZNC = hdata->GetMean();
+ else if(esdInd==7) pmQZNA = hdata->GetMean();
+ else if(esdInd==8) pmQZPC = hdata->GetMean();
+ else if(esdInd==9) pmQZPA = hdata->GetMean();
+ else if(esdInd==10) pmCZNC = hdata->GetMean();
+ else if(esdInd==11) pmCZNA = hdata->GetMean();
+ else if(esdInd==12) pmCZPC = hdata->GetMean();
+ else if(esdInd==13) pmCZPA = hdata->GetMean();
}
//
// --- Check whether 2*|Mean ZNA - Mean ZNC|/(Mean ZNA + Mean ZNC) < percentageDiff
// ====================================================================
// Checks for Calibration events
// ====================================================================
- else if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib) {
- AliWarning(Form("\n\t No check implemented in ZDC QA for %s task\n",taskName));
+ if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCalib) {
+ AliWarning(Form("\n\t No check implemented in ZDC QA for %s task in CALIBRATION events\n",taskName));
return ;
} // Calibration
// ====================================================================
// Checks for cosmic events
// ====================================================================
else if (AliRecoParam::ConvertIndex(specie) == AliRecoParam::kCosmic) {
- AliWarning(Form("\n\t No check implemented in ZDC QA for %s task\n",taskName));
+ AliWarning(Form("\n\t No check needed in ZDC QA for %s task in COSMIC events\n",taskName));
return ;
} // Cosmic
if(TMath::Abs(count)>1.e-10) test[specie] = test[specie]/count;
color = kGreen;
defaultText = "Everything is fine!";
}
- else if(code<1. && code>=0.9){
+ else if(code<1. && code>=0.85){
color = kYellow;
defaultText = "To be monitored in next runs";
}
- else if(code<0.9 && code>=0.6){
+ else if(code<0.85 && code>=0.6){
color = kOrange;
defaultText = "notify the expert DURING THE DAY!";
}
else if(code<0.6){
color = kRed;
- defaultText = "CALL THE EXPERT!!!!";
+ defaultText = "PLEASE CALL THE EXPERT!!!!";
}
//histo.SetFillColor(color);
histo.SetStats(kFALSE);
-
- histo.GetListOfFunctions()->Add(text);
+
+ TList* lst = histo.GetListOfFunctions();
+ if(!lst){
+ printf(" No list found\n");
+ }
+ else {
+ TObject *stats = lst->FindObject("stats");
+ lst->Remove(stats);
+ TObject *obj;
+ while ((obj = lst->First())) {
+ while(lst->Remove(obj)) { }
+ delete obj;
+ }
+ if(stats) lst->Add(stats);
+ lst->Add(text);
+ }
+}
+
+//______________________________________________________________
+void AliZDCQAChecker::GetThresholds()
+{
+ //
+ // Init the online thresholds from GRP generated by AMORE
+ //
+ AliCDBManager* man = AliCDBManager::Instance();
+ if(!man){
+ AliWarning("No CDB -> ZDC TDC thresholds not read from OCDB");
+ return;
+ }
+
+ AliCDBEntry* entry = man->Get("GRP/Calib/QAThresholds");
+ if(!entry){
+ AliWarning("No ZDC TDC thresholds object");
+ return;
+ }
+
+ TObjArray* obj = (TObjArray*) entry->GetObject();
+ if(!obj ){
+ AliWarning("No object inside OCDB entry GRP/Calib/QAThresholds");
+ return;
+ }
+
+ AliQAThresholds* thresholds = (AliQAThresholds*) obj->FindObject("ZDC");
+ if(!thresholds){
+ AliWarning("No object for ZDC thresholds inside OCDB object");
+ return;
+ }
+
+ TParameter<double>* myParam0 = (TParameter<double>*) thresholds->GetThreshold(0);
+ fZDCQAThr_ZNCTDCRefThr = myParam0->GetVal();
+
+ TParameter<double>* myParam1 = (TParameter<double>*) thresholds->GetThreshold(1);
+ fZDCQAThr_ZPCTDCRefThr = myParam1->GetVal();
+
+ TParameter<double>* myParam2 = (TParameter<double>*) thresholds->GetThreshold(2);
+ fZDCQAThr_ZNATDCRefThr = myParam2->GetVal();
+
+ TParameter<double>* myParam3 = (TParameter<double>*) thresholds->GetThreshold(3);
+ fZDCQAThr_ZPATDCRefThr = myParam3->GetVal();
+
+ TParameter<double>* myParam4 = (TParameter<double>*) thresholds->GetThreshold(4);
+ fZDCQAThr_ZEM1TDCRefThr = myParam4->GetVal();
+
+ TParameter<double>* myParam5 = (TParameter<double>*) thresholds->GetThreshold(5);
+ fZDCQAThr_ZEM2TDCRefThr = myParam5->GetVal();
+
+ PrintThresholds();
+}
+
+//_______________________________________________________________________________
+void AliZDCQAChecker::PrintThresholds()
+{
+ printf("\n #### ZDC QA Thresholds read from configuration file: \n");
+ printf(" \t fZDCQAThr_ZNCTDCRefThr %f \n",fZDCQAThr_ZNCTDCRefThr);
+ printf(" \t fZDCQAThr_ZPCTDCRefThr %f \n",fZDCQAThr_ZPCTDCRefThr);
+ printf(" \t fZDCQAThr_ZNATDCRefThr %f \n",fZDCQAThr_ZNATDCRefThr);
+ printf(" \t fZDCQAThr_ZPATDCRefThr %f \n",fZDCQAThr_ZPATDCRefThr);
+ printf(" \t fZDCQAThr_ZEM1TDCRefThr %f \n",fZDCQAThr_ZEM1TDCRefThr);
+ printf(" \t fZDCQAThr_ZEM2TDCRefThr %f \n\n",fZDCQAThr_ZEM2TDCRefThr);
}