///
/// 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 "AliQA.h"
-#include "AliMUONVTrackerData.h"
-#include "AliMpManuIterator.h"
-#include <TDirectory.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
-}
-
-//__________________________________________________________________
-AliMUONQAChecker::AliMUONQAChecker(const AliMUONQAChecker& qac) :
- AliQACheckerBase(qac.GetName(), qac.GetTitle())
-{
- /// copy ctor
-}
-
-//______________________________________________________________________________
-const 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 0.0;
+ delete fCheckers;
}
//______________________________________________________________________________
-const Double_t
-AliMUONQAChecker::Check(AliQA::ALITASK_t index, TObjArray * list)
+void
+AliMUONQAChecker::Check(Double_t* rv, AliQAv1::ALITASK_t index,
+ TObjArray** list,
+ const AliDetectorRecoParam * recoParam)
{
/// Check objects in list
- if ( index == AliQA::kRAW )
- {
- return CheckRaws(list);
- }
+ AliCodeTimerAuto(AliQAv1::GetTaskName(index),0);
- AliWarning(Form("Checker for task %d not implement for the moment",index));
- return 0.0;
-}
+ TIter next(fCheckers);
+ AliMUONVQAChecker* qac;
+ const AliMUONRecoParam* muonRecoParam = static_cast<const AliMUONRecoParam*>(recoParam);
+ AliMUONVQAChecker::ECheckCode* ecc(0x0);
-//______________________________________________________________________________
-const Double_t
-AliMUONQAChecker::CheckRaws(TObjArray * list)
-{
- TIter next(list);
- 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 0.0;
- }
-
- 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) )
+ for ( Int_t i = 0; i < AliRecoParam::kNSpecies; ++i )
{
- Float_t occ = data->Manu(detElemId,manuId,2);
- if (occ > 0 ) ++n;
- if (occ >= 0.5 ) ++n50;
- if (occ >= 0.75 ) ++n75;
+ rv[i] = -1.0;
}
-
- AliInfo(Form("n %d n50 %d n75 %d",n,n50,n75));
- if ( n == 0 )
- {
- AliError("Oups. Got zero occupancy in all manus ?!");
- return 0.0;
- }
-
- if ( n75 )
+ while ( ( qac = static_cast<AliMUONVQAChecker*>(next())) )
{
- AliError(Form("Got %d manus with occupancy above 0.75",n75));
- return 0.1;
- }
+ if ( index == AliQAv1::kRAW )
+ {
+ ecc = qac->CheckRaws(list,muonRecoParam);
+ }
+
+ if ( index == AliQAv1::kREC)
+ {
+ ecc = qac->CheckRecPoints(list,muonRecoParam);
+ }
- if ( n50 )
- {
- AliWarning(Form("Got %d manus with occupancy above 0.5",n50));
- return 0.9;
+ if ( index == AliQAv1::kESD )
+ {
+ ecc = qac->CheckESD(list,muonRecoParam);
+ }
+
+ if ( ecc )
+ {
+ for ( Int_t i = 0; i < AliRecoParam::kNSpecies; ++i )
+ {
+ 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 1.0;
+//______________________________________________________________________________
+void AliMUONQAChecker::Init(const AliQAv1::DETECTORINDEX_t det)
+{
+ /// 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
+ /// sets the QA according the return value of the Check
- AliQA * qa = AliQA::Instance(index);
-
- qa->UnSet(AliQA::kFATAL);
- qa->UnSet(AliQA::kWARNING);
- qa->UnSet(AliQA::kERROR);
- qa->UnSet(AliQA::kINFO);
+ AliQAv1 * qa = AliQAv1::Instance(index);
- if ( value == 1.0 )
- {
- qa->Set(AliQA::kINFO);
- }
- else if ( value == 0.0 )
- {
- qa->Set(AliQA::kFATAL);
- }
- else if ( value > 0.5 )
- {
- qa->Set(AliQA::kWARNING);
- }
- else
- {
- qa->Set(AliQA::kERROR);
+ 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) ;
+ }
}
}