///
/// Implementation of AliQACheckerBase for MCH and MTR
///
-/// For the moment we only implement the checking of raw data QA for the tracker
-/// by looking at the occupancy at the manu level.
-/// We count the number of manus above a given occupancy threshold, and
-/// depending on that number, the resulting QA flag is warning, error or fatal.
-/// (there's no "info" type in this case).
-///
/// \author Laurent Aphecetche, Subatech
-#include "AliLog.h"
-#include "AliMUONVTrackerData.h"
-#include "AliMpManuIterator.h"
-#include "AliQA.h"
-#include <TDirectory.h>
-#include <TH1.h>
+#include "AliMUONRecoParam.h"
+#include "AliMUONTrackerQAChecker.h"
+#include "AliMUONTriggerQAChecker.h"
+#include "AliCodeTimer.h"
/// \cond CLASSIMP
ClassImp(AliMUONQAChecker)
//__________________________________________________________________
AliMUONQAChecker::AliMUONQAChecker() :
- AliQACheckerBase("MUON","MUON Quality Assurance Data Maker")
+ AliQACheckerBase("MUON","MUON Quality Assurance Data Maker"),
+fCheckers(new TObjArray)
{
/// ctor
+ fCheckers->SetOwner(kTRUE);
+ fCheckers->Add(new AliMUONTrackerQAChecker());
+ fCheckers->Add(new AliMUONTriggerQAChecker());
}
//__________________________________________________________________
AliMUONQAChecker::~AliMUONQAChecker()
{
/// dtor
+ delete fCheckers;
}
-//__________________________________________________________________
-AliMUONQAChecker::AliMUONQAChecker(const AliMUONQAChecker& qac) :
- AliQACheckerBase(qac.GetName(), qac.GetTitle())
-{
- /// copy ctor
-}
-
//______________________________________________________________________________
Double_t *
-AliMUONQAChecker::Check(AliQA::ALITASK_t /*index*/)
-{
- /// Check data
-
- AliError(Form("This method is not implemented. Should it be ? fDataSubDir = %p (%s)",
- fDataSubDir, ( fDataSubDir ? fDataSubDir->GetPath() : "")));
- return NULL;
-}
-
-//______________________________________________________________________________
-Double_t *
-AliMUONQAChecker::Check(AliQA::ALITASK_t index, TObjArray ** list)
+AliMUONQAChecker::Check(AliQAv1::ALITASK_t index,
+ TObjArray** list,
+ AliDetectorRecoParam * recoParam)
{
/// Check objects in list
- if ( index == AliQA::kRAW )
- {
- return CheckRaws(list);
- }
-
- if ( index == AliQA::kREC)
- {
- return CheckRecPoints(list);
- }
-
- if ( index == AliQA::kESD )
- {
- return CheckESD(list);
- }
+ AliCodeTimerAuto(AliQAv1::GetTaskName(index),0);
- AliWarning(Form("Checker for task %d not implement for the moment",index));
- return NULL;
-}
-
-//______________________________________________________________________________
-TH1*
-AliMUONQAChecker::GetHisto(TObjArray* list, const char* hname) const
-{
- /// Get a given histo from the list
- TH1* h = static_cast<TH1*>(list->FindObject(hname));
- if (!h)
+ TIter next(fCheckers);
+ AliMUONVQAChecker* qac;
+ AliMUONRecoParam* muonRecoParam = static_cast<AliMUONRecoParam*>(recoParam);
+ AliMUONVQAChecker::ECheckCode* ecc(0x0);
+ Double_t* rv = new Double_t[AliRecoParam::kNSpecies];
+ for ( Int_t i = 0; i < AliRecoParam::kNSpecies; ++i )
{
- AliError(Form("Did not find expected histo %s",hname));
+ rv[i] = -1.0;
}
- return h;
-}
-
-//______________________________________________________________________________
-Double_t *
-AliMUONQAChecker::CheckRecPoints(TObjArray ** list)
-{
- /// Check rec points
- /// Very binary check for the moment.
- Double_t * rv = new Double_t[AliRecoParam::kNSpecies] ;
- for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
- rv[specie] = 1.0 ;
-
- for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
- TH1* h = GetHisto(list[specie],"hTrackerNumberOfClustersPerDE");
-
- if ( !h ) rv[specie] = 0.75; // only a warning if histo not found, in order not to kill anything because QA failed...
-
- else if ( h->GetMean() == 0.0 ) rv[specie] = MarkHisto(*h,0.0);
- }
- return rv;
-}
-
-//______________________________________________________________________________
-Double_t
-AliMUONQAChecker::MarkHisto(TH1& histo, Double_t value) const
-{
- /// Mark histo as originator of some QA error/warning
-
- if ( value != 1.0 )
+ while ( ( qac = static_cast<AliMUONVQAChecker*>(next())) )
{
- histo.SetBit(AliQA::GetQABit());
- }
-
- return value;
-}
+ if ( index == AliQAv1::kRAW )
+ {
+ ecc = qac->CheckRaws(list,muonRecoParam);
+ }
-//______________________________________________________________________________
-Double_t *
-AliMUONQAChecker::CheckESD(TObjArray ** list)
-{
- /// Check ESD
-
- Double_t * rv = new Double_t[AliRecoParam::kNSpecies] ;
- for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
- rv[specie] = 1.0 ;
-
- for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
+ if ( index == AliQAv1::kREC)
+ {
+ ecc = qac->CheckRecPoints(list,muonRecoParam);
+ }
- TH1* h = GetHisto(list[specie],"hESDnTracks");
-
- if (!h) rv[specie] = 0.75;
-
- else if ( h->GetMean() == 0.0 ) rv[specie] = MarkHisto(*h,0.0); // no track -> fatal
-
- h = GetHisto(list[specie],"hESDMatchTrig");
-
- if (!h) rv[specie] = 0.75;
-
- else if (h->GetMean() == 0.0 ) rv[specie] = MarkHisto(*h,0.25); // no trigger matching -> error
- }
- return rv;
-}
-
-//______________________________________________________________________________
-Double_t *
-AliMUONQAChecker::CheckRaws(TObjArray ** list)
-{
- /// Check raws
-
- Double_t * rv = new Double_t[AliRecoParam::kNSpecies] ;
- for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++)
- rv[specie] = 1.0 ;
-
- for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
- TIter next(list[specie]);
- TObject* object;
- AliMUONVTrackerData* data(0x0);
-
- while ( (object=next()) && !data )
- {
- if (object->InheritsFrom("AliMUONVTrackerData"))
- {
- data = static_cast<AliMUONVTrackerData*>(object);
- }
- }
-
- if ( !data )
- {
- AliError("Did not find TrackerData in the list !");
- return NULL;
- }
-
- AliMpManuIterator it;
- Int_t detElemId;
- Int_t manuId;
- Int_t n50(0); // number of manus with occupancy above 0.5
- Int_t n75(0); // number of manus with occupancy above 0.75
- Int_t n(0); // number of manus with some occupancy
-
- while ( it.Next(detElemId,manuId) )
- {
- Float_t occ = data->Manu(detElemId,manuId,2);
- if (occ > 0 ) ++n;
- if (occ >= 0.5 ) ++n50;
- if (occ >= 0.75 ) ++n75;
- }
-
- AliInfo(Form("n %d n50 %d n75 %d",n,n50,n75));
-
- if ( n == 0 )
- {
- AliError("Oups. Got zero occupancy in all manus ?!");
- rv[specie] = 0.0;
- }
-
- if ( n75 )
- {
- AliError(Form("Got %d manus with occupancy above 0.75",n75));
- rv[specie] = 0.1;
- }
+ if ( index == AliQAv1::kESD )
+ {
+ ecc = qac->CheckESD(list,muonRecoParam);
+ }
- if ( n50 )
+ if ( ecc )
+ {
+ for ( Int_t i = 0; i < AliRecoParam::kNSpecies; ++i )
{
- AliWarning(Form("Got %d manus with occupancy above 0.5",n50));
- rv[specie] = 0.9;
+ switch ( ecc[i] )
+ {
+ case AliMUONVQAChecker::kInfo:
+ rv[i] = 1.0;
+ break;
+ case AliMUONVQAChecker::kWarning:
+ rv[i] = 0.75;
+ break;
+ case AliMUONVQAChecker::kError:
+ rv[i] = 0.25;
+ break;
+ case AliMUONVQAChecker::kFatal:
+ rv[i] = -1.0;
+ break;
+ default:
+ rv[i] = -1.0;
+ break;
+ }
}
+ }
}
+
+ delete[] ecc;
+
return rv;
}
//______________________________________________________________________________
-void AliMUONQAChecker::Init(const AliQA::DETECTORINDEX_t det)
+void AliMUONQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
{
- // intialises QA and QA checker settings
- AliQA::Instance(det) ;
- Float_t hiValue[AliQA::kNBIT] ;
- Float_t lowValue[AliQA::kNBIT] ;
- lowValue[AliQA::kINFO] = 0.999 ;
- hiValue[AliQA::kINFO] = 1.0 ;
- hiValue[AliQA::kWARNING] = 0.99 ;
- lowValue[AliQA::kWARNING] = 0.5 ;
- lowValue[AliQA::kERROR] = 0.0 ;
- hiValue[AliQA::kERROR] = 0.5 ;
- lowValue[AliQA::kFATAL] = -1.0 ;
- hiValue[AliQA::kFATAL] = 0.0 ;
+ /// intialises QA and QA checker settings
+ AliQAv1::Instance(det) ;
+ Float_t hiValue[AliQAv1::kNBIT] ;
+ Float_t lowValue[AliQAv1::kNBIT] ;
+ lowValue[AliQAv1::kINFO] = 0.999 ;
+ hiValue[AliQAv1::kINFO] = 1.0 ;
+ hiValue[AliQAv1::kWARNING] = 0.99 ;
+ lowValue[AliQAv1::kWARNING] = 0.5 ;
+ lowValue[AliQAv1::kERROR] = 0.0 ;
+ hiValue[AliQAv1::kERROR] = 0.5 ;
+ lowValue[AliQAv1::kFATAL] = -1.0 ;
+ hiValue[AliQAv1::kFATAL] = 0.0 ;
SetHiLo(&hiValue[0], &lowValue[0]) ;
}
//______________________________________________________________________________
void
-AliMUONQAChecker::SetQA(AliQA::ALITASK_t index, const Double_t * value) const
+AliMUONQAChecker::SetQA(AliQAv1::ALITASK_t index, Double_t * value) const
{
/// sets the QA according the return value of the Check
- AliQA * qa = AliQA::Instance(index);
+ AliQAv1 * qa = AliQAv1::Instance(index);
for (Int_t specie = 0 ; specie < AliRecoParam::kNSpecies ; specie++) {
- qa->UnSet(AliQA::kFATAL, specie);
- qa->UnSet(AliQA::kWARNING, specie);
- qa->UnSet(AliQA::kERROR, specie);
- qa->UnSet(AliQA::kINFO, 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(AliQA::kFATAL, specie) ;
+ qa->Set(AliQAv1::kFATAL, specie) ;
} else {
- if ( value[specie] >= fLowTestValue[AliQA::kFATAL] && value[specie] < fUpTestValue[AliQA::kFATAL] )
- qa->Set(AliQA::kFATAL, specie) ;
- else if ( value[specie] > fLowTestValue[AliQA::kERROR] && value[specie] <= fUpTestValue[AliQA::kERROR] )
- qa->Set(AliQA::kERROR, specie) ;
- else if ( value[specie] > fLowTestValue[AliQA::kWARNING] && value[specie] <= fUpTestValue[AliQA::kWARNING] )
- qa->Set(AliQA::kWARNING, specie) ;
- else if ( value[specie] > fLowTestValue[AliQA::kINFO] && value[specie] <= fUpTestValue[AliQA::kINFO] )
- qa->Set(AliQA::kINFO, specie) ;
+ 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) ;
}
}
}