ROOT logo
#ifndef ALIQADATAMAKER_H
#define ALIQADATAMAKER_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */


/* $Id$ */

//
//  Base Class:
//  Produces the data needed to calculate the quality assurance. 
//  All data must be mergeable objects.
//  Y. Schutz CERN July 2007
//


// --- ROOT system ---
#include <TH1.h>
#include <TObjArray.h>
#include <TNamed.h>  
#include <TArrayI.h>  
//class TCanvas ; 
class TClonesArray;
class TDirectory;
class TFile;  
class TObject; 
class TTree; 
class AliESDEvent;
class AliRawReader;
class AliDetectorRecoParam;

// --- Standard library ---

// --- AliRoot header files ---
#include "AliQAv1.h"
#include "AliRecoParam.h" 

class AliQADataMaker: public TNamed {
  
 public:

  AliQADataMaker(const Char_t * name="", const Char_t * title="") ;          // ctor
  AliQADataMaker(const AliQADataMaker& qadm) ;   
  virtual ~AliQADataMaker() ; // dtor
  //
  void   ForbidCloning(TH1* h, Bool_t v=kTRUE)                       {h->SetBit(AliQAv1::GetForbidCloningBit(),v);}
  Bool_t IsCloningForbidden(TH1* h)                            const {return h->TestBit(AliQAv1::GetForbidCloningBit());}
  Char_t* GetHistoTrigger(const TH1* h)                        const;
  //
  virtual Int_t Add2DigitsList(TH1 * hist, const Int_t index, const Bool_t expert = kFALSE, const Bool_t image = kFALSE)          = 0 ; 
  virtual Int_t Add2ESDsList(TH1 * hist, const Int_t index, const Bool_t expert = kFALSE, const Bool_t image = kFALSE)            = 0 ; 
  virtual Int_t Add2HitsList(TH1 * hist, const Int_t index, const Bool_t expert = kFALSE, const Bool_t image = kFALSE)            = 0 ; 
  virtual Int_t Add2RecPointsList(TH1 * hist, const Int_t index, const Bool_t expert = kFALSE, const Bool_t image = kFALSE)       = 0 ; 
  virtual Int_t Add2RawsList(TH1 * hist, const Int_t index, const Bool_t expert = kFALSE, const Bool_t image = kFALSE, const Bool_t saveForCorr = kFALSE)            = 0 ; 
  virtual Int_t Add2SDigitsList(TH1 * hist, const Int_t index, const Bool_t expert = kFALSE, const Bool_t image = kFALSE)         = 0 ; 
  virtual void        Exec(AliQAv1::TASKINDEX_t, TObject * data)             = 0 ;
  virtual void        EndOfCycle()                                           = 0 ;
  virtual void        EndOfCycle(AliQAv1::TASKINDEX_t )                      = 0 ;
  virtual void        EndOfDetectorCycle(AliQAv1::TASKINDEX_t task, TObjArray ** list ) = 0 ; 
  void                Finish() const ; 
  AliRecoParam::EventSpecie_t GetEventSpecie() const { return fEventSpecie ; }
  //
  virtual TObject*    GetDigitsData(const Int_t index)                       = 0 ; 
  virtual TObject*    GetESDsData(const Int_t index)                         = 0 ; 
  virtual TObject*    GetHitsData(const Int_t index)                         = 0 ; 
  virtual TObject*    GetRecPointsData(const Int_t index)                    = 0 ; 
  virtual TObject*    GetRawsData(const Int_t index)                         = 0 ; 
  virtual TObject*    GetSDigitsData(const Int_t index)                      = 0 ; 
  //
  virtual TH1*        GetDigitsData(const Int_t index, int cloneID)         = 0 ; 
  virtual TH1*        GetESDsData(const Int_t index, int cloneID)           = 0 ; 
  virtual TH1*        GetHitsData(const Int_t index, int cloneID)           = 0 ; 
  virtual TH1*        GetRecPointsData(const Int_t index, int cloneID)      = 0 ; 
  virtual TH1*        GetRawsData(const Int_t index, int cloneID)           = 0 ; 
  virtual TH1*        GetSDigitsData(const Int_t index, int cloneID)        = 0 ; 
  //
  virtual TObjArray*  GetDigitsDataOfTrigClass(int cloneID, TObjArray *dest=0)      = 0;
  virtual TObjArray*  GetSDigitsDataOfTrigClass(int cloneID, TObjArray *dest=0)     = 0;
  virtual TObjArray*  GetESDsDataOfTrigClass(int cloneID, TObjArray *dest=0)        = 0;
  virtual TObjArray*  GetHitsDataOfTrigClass(int cloneID, TObjArray *dest=0)        = 0;
  virtual TObjArray*  GetRecPointsDataOfTrigClass(int cloneID, TObjArray *dest=0)   = 0;
  virtual TObjArray*  GetRawsDataOfTrigClass(int cloneID, TObjArray *dest=0)        = 0;

  //
  const Char_t *      GetDetectorDirName() const { return fDetectorDirName.Data() ; }
  TList *             GetParameterList() const { return fParameterList[AliRecoParam::AConvert(fEventSpecie)] ; }
  virtual const AliDetectorRecoParam * GetRecoParam() { return NULL ; }
  Int_t               GetRun() const { return fRun ; } 
  Int_t               Increment() { return ++fCycleCounter ; } 
  virtual TObjArray** Init(AliQAv1::TASKINDEX_t, Int_t cycles = -1)                                 = 0 ;
  TObjArray*          Init(AliQAv1::TASKINDEX_t, AliRecoParam::EventSpecie_t es, Int_t cycles = -1) ;
  virtual void        Init(AliQAv1::TASKINDEX_t, TObjArray ** list, Int_t run, Int_t cycles = -1)   = 0 ;
  virtual void        InitDigits()        = 0 ; 
  virtual void        InitESDs()          = 0 ; 
  virtual void        InitRaws()          = 0 ; 
  virtual void        InitRecPoints()     = 0 ; 
  Bool_t              IsCycleDone() const { return fCycleCounter > fCycle ? kTRUE : kFALSE ; }
  Bool_t              IsValidEventSpecie(Int_t eventSpecieIndex, TObjArray ** list) ; 
  void                Reset() { fCycleCounter = 0 ; }
  virtual void        ResetDetector(AliQAv1::TASKINDEX_t task) = 0 ;
  void                SetCycle(Int_t nevts) { fCycle = nevts ; } 
  void                SetWriteExpert() { fWriteExpert = kTRUE ; }
  virtual void        StartOfCycle(Int_t run = -1)                                                   = 0 ;
  virtual void        StartOfCycle(AliQAv1::TASKINDEX_t, Int_t run, const Bool_t sameCycle = kFALSE) = 0 ;
  void                UnSetWriteExpert() { fWriteExpert = kFALSE ; }
  Bool_t              WriteExpert() { return fWriteExpert ; }
  void                SetEventSpecie(AliRecoParam::EventSpecie_t es) {fEventSpecie = es;}
  void                SetEventSpecie(Int_t es) { SetEventSpecie(AliRecoParam::Convert(es)); }
  virtual void        SetRecoParam(const AliDetectorRecoParam *) {;}

  virtual void        InitRecPointsForTracker() {;} // needed by AliGlobalQADataMaker

  Int_t               IsClonedPerTrigClass(Int_t index, TObjArray ** list);
  Bool_t              IsOrigHistoKept(Int_t index, TObjArray ** list);
  Bool_t              MatchesToTriggers(UInt_t hpos) const;
  //
  virtual TObjArray* GetMatchingDigitsData(const Int_t index, TObjArray* optDest=0)     = 0 ; 
  virtual TObjArray* GetMatchingESDsData(const Int_t index, TObjArray* optDest=0)       = 0 ; 
  virtual TObjArray* GetMatchingHitsData(const Int_t index, TObjArray* optDest=0)       = 0 ; 
  virtual TObjArray* GetMatchingRecPointsData(const Int_t index, TObjArray* optDest=0)  = 0 ; 
  virtual TObjArray* GetMatchingRawsData(const Int_t index, TObjArray* optDest=0)       = 0 ; 
  virtual TObjArray* GetMatchingSDigitsData(const Int_t index, TObjArray* optDest=0)    = 0 ; 
  //
  virtual TH1*       GetMatchingRawsHisto(Int_t index, Int_t trigId)       = 0;
  virtual TH1*       GetMatchingDigitsHisto(Int_t index, Int_t trigId)     = 0;
  virtual TH1*       GetMatchingSDigitsHisto(Int_t index, Int_t trigId)    = 0;
  virtual TH1*       GetMatchingHitsHisto(Int_t index, Int_t trigId)       = 0;
  virtual TH1*       GetMatchingRecPointsHisto(Int_t index, Int_t trigId)  = 0;
  virtual TH1*       GetMatchingESDsHisto(Int_t index, Int_t trigId)       = 0;
  //
  virtual TObjArray* GetMatchingRawsHistosSet(const Int_t* indexList, Int_t nHist,Int_t trigId)       = 0;
  virtual TObjArray* GetMatchingDigitsHistosSet(const Int_t* indexList, Int_t nHist,Int_t trigId)     = 0;
  virtual TObjArray* GetMatchingSDigitsHistosSet(const Int_t* indexList, Int_t nHist,Int_t trigId)    = 0;
  virtual TObjArray* GetMatchingHitsHistosSet(const Int_t* indexList, Int_t nHist,Int_t trigId)       = 0;
  virtual TObjArray* GetMatchingRecPointsHistosSet(const Int_t* indexList, Int_t nHist,Int_t trigId)  = 0;
  virtual TObjArray* GetMatchingESDsHistosSet(const Int_t* indexList, Int_t nHist,Int_t trigId)       = 0;
  //
  virtual Int_t  FillHitsData(Int_t index, double x)                   = 0;
  virtual Int_t  FillDigitsData(Int_t index, double x)                 = 0;
  virtual Int_t  FillSDigitsData(Int_t index, double x)                = 0;
  virtual Int_t  FillRawsData(Int_t index, double x)                   = 0;
  virtual Int_t  FillRecPointsData(Int_t index, double x)              = 0;
  virtual Int_t  FillESDsData(Int_t index, double x)                   = 0;
  //
  virtual Int_t  FillHitsData(Int_t index, double x, double y)         = 0;
  virtual Int_t  FillDigitsData(Int_t index, double x, double y)       = 0;
  virtual Int_t  FillSDigitsData(Int_t index, double x, double y)      = 0;
  virtual Int_t  FillRawsData(Int_t index, double x, double y)         = 0;
  virtual Int_t  FillRecPointsData(Int_t index, double x, double y)    = 0;
  virtual Int_t  FillESDsData(Int_t index, double x, double y)         = 0;
  //
  virtual Int_t  FillHitsData(Int_t index, double x, double y, double z)         = 0;
  virtual Int_t  FillDigitsData(Int_t index, double x, double y, double z)       = 0;
  virtual Int_t  FillSDigitsData(Int_t index, double x, double y, double z)      = 0;
  virtual Int_t  FillRawsData(Int_t index, double x, double y, double z)         = 0;
  virtual Int_t  FillRecPointsData(Int_t index, double x, double y, double z)    = 0;
  virtual Int_t  FillESDsData(Int_t index, double x, double y, double z)         = 0;
  //
  virtual Int_t  SetHitsDataBinContent(Int_t index, int bin, double w)        = 0;
  virtual Int_t  SetDigitsDataBinContent(Int_t index, int bin, double w)      = 0;
  virtual Int_t  SetSDigitsDataBinContent(Int_t index, int bin, double w)     = 0;
  virtual Int_t  SetRawsDataBinContent(Int_t index, int bin, double w)        = 0;
  virtual Int_t  SetRecPointsDataBinContent(Int_t index, int bin, double w)   = 0;
  virtual Int_t  SetESDsDataBinContent(Int_t index, int bin, double w)        = 0;
  //
  virtual Int_t  SetHitsDataBinContent(Int_t index, int binX, int binY, double w)        = 0;
  virtual Int_t  SetDigitsDataBinContent(Int_t index, int binX, int binY, double w)      = 0;
  virtual Int_t  SetSDigitsDataBinContent(Int_t index, int binX, int binY, double w)     = 0;
  virtual Int_t  SetRawsDataBinContent(Int_t index, int binX, int binY, double w)        = 0;
  virtual Int_t  SetRecPointsDataBinContent(Int_t index, int binX, int binY, double w)   = 0;
  virtual Int_t  SetESDsDataBinContent(Int_t index, int binX, int binY, double w)        = 0;
  //
  virtual Int_t  SetHitsDataBinError(Int_t index, int bin, double err)        = 0;
  virtual Int_t  SetDigitsDataBinError(Int_t index, int bin, double err)      = 0;
  virtual Int_t  SetSDigitsDataBinError(Int_t index, int bin, double err)     = 0;
  virtual Int_t  SetRawsDataBinError(Int_t index, int bin, double err)        = 0;
  virtual Int_t  SetRecPointsDataBinError(Int_t index, int bin, double err)   = 0;
  virtual Int_t  SetESDsDataBinError(Int_t index, int bin, double err)        = 0;
  //
  virtual Int_t  SetHitsDataBinError(Int_t index, int binX, int binY, double err)        = 0;
  virtual Int_t  SetDigitsDataBinError(Int_t index, int binX, int binY, double err)      = 0;
  virtual Int_t  SetSDigitsDataBinError(Int_t index, int binX, int binY, double err)     = 0;
  virtual Int_t  SetRawsDataBinError(Int_t index, int binX, int binY, double err)        = 0;
  virtual Int_t  SetRecPointsDataBinError(Int_t index, int binX, int binY, double err)   = 0;
  virtual Int_t  SetESDsDataBinError(Int_t index, int binX, int binY, double err)        = 0;
  //
  virtual Int_t  ResetHitsData(Int_t index, Option_t *opt="")                 = 0;
  virtual Int_t  ResetDigitsData(Int_t index, Option_t *opt="")               = 0;
  virtual Int_t  ResetSDigitsData(Int_t index, Option_t *opt="")              = 0;
  virtual Int_t  ResetRawsData(Int_t index, Option_t *opt="")                 = 0;
  virtual Int_t  ResetRecPointsData(Int_t index, Option_t *opt="")            = 0;
  virtual Int_t  ResetESDsData(Int_t index, Option_t *opt="")                 = 0;
  //
  virtual Int_t  ResetStatsHitsData(Int_t index)                              = 0;
  virtual Int_t  ResetStatsDigitsData(Int_t index)                            = 0;
  virtual Int_t  ResetStatsSDigitsData(Int_t index)                           = 0;
  virtual Int_t  ResetStatsRawsData(Int_t index)                              = 0;
  virtual Int_t  ResetStatsRecPointsData(Int_t index)                         = 0;
  virtual Int_t  ResetStatsESDsData(Int_t index)                              = 0;
  //
  void           ResetEvCountCycle(AliRecoParam::EventSpecie_t isp, AliQAv1::TASKINDEX_t task);
  void           ResetEvCountTotal(AliRecoParam::EventSpecie_t isp, AliQAv1::TASKINDEX_t task);
  void           ResetEvCountCycle(AliRecoParam::EventSpecie_t isp)     {fEvCountCycle[AliRecoParam::AConvert(isp)].Reset();}
  void           ResetEvCountTotal(AliRecoParam::EventSpecie_t isp)     {fEvCountTotal[AliRecoParam::AConvert(isp)].Reset();}
  void           ResetEvCountCycle()                                    {for (int isp=AliRecoParam::kNSpecies;isp--;) ResetEvCountCycle(AliRecoParam::ConvertIndex(isp));}
  void           ResetEvCountTotal()                                    {for (int isp=AliRecoParam::kNSpecies;isp--;) ResetEvCountTotal(AliRecoParam::ConvertIndex(isp));}
  //
  Int_t          GetEvCountCycle(AliRecoParam::EventSpecie_t sp, AliQAv1::TASKINDEX_t task, Int_t trCl=-1) const;
  Int_t          GetEvCountTotal(AliRecoParam::EventSpecie_t sp, AliQAv1::TASKINDEX_t task, Int_t trCl=-1) const;
  Int_t          GetEvCountCycle(AliQAv1::TASKINDEX_t task,Int_t trCl=-1)          const {return GetEvCountCycle(fEventSpecie,task,trCl);}
  Int_t          GetEvCountTotal(AliQAv1::TASKINDEX_t task,Int_t trCl=-1)          const {return GetEvCountCycle(fEventSpecie,task,trCl);}
  //
  Int_t          GetEvCountCycleRaws(Int_t trCl=-1)                       const {return GetEvCountCycle(AliQAv1::kRAWS,trCl);}
  Int_t          GetEvCountCycleHits(Int_t trCl=-1)                       const {return GetEvCountCycle(AliQAv1::kHITS,trCl);}
  Int_t          GetEvCountCycleSDigits(Int_t trCl=-1)                    const {return GetEvCountCycle(AliQAv1::kSDIGITS,trCl);}
  Int_t          GetEvCountCycleDigits(Int_t trCl=-1)                     const {return GetEvCountCycle(AliQAv1::kDIGITS,trCl);}
  Int_t          GetEvCountCycleRecPoints(Int_t trCl=-1)                  const {return GetEvCountCycle(AliQAv1::kRECPOINTS,trCl);}
  Int_t          GetEvCountCycleESDS(Int_t trCl=-1)                       const {return GetEvCountCycle(AliQAv1::kESDS,trCl);}
  //
  Int_t          GetEvCountTotalRaws(Int_t trCl=-1)                       const {return GetEvCountTotal(AliQAv1::kRAWS,trCl);}
  Int_t          GetEvCountTotalHits(Int_t trCl=-1)                       const {return GetEvCountTotal(AliQAv1::kHITS,trCl);}
  Int_t          GetEvCountTotalSDigits(Int_t trCl=-1)                    const {return GetEvCountTotal(AliQAv1::kSDIGITS,trCl);}
  Int_t          GetEvCountTotalDigits(Int_t trCl=-1)                     const {return GetEvCountTotal(AliQAv1::kDIGITS,trCl);}
  Int_t          GetEvCountTotalRecPoints(Int_t trCl=-1)                  const {return GetEvCountTotal(AliQAv1::kRECPOINTS,trCl);}
  Int_t          GetEvCountTotalESDS(Int_t trCl=-1)                       const {return GetEvCountTotal(AliQAv1::kESDS,trCl);}
  //
  void           IncEvCountCycle(AliQAv1::TASKINDEX_t task, Int_t diff=1);
  void           IncEvCountTotal(AliQAv1::TASKINDEX_t task, Int_t diff=1);
  //
  void           IncEvCountCycleRaws(Int_t diff=1)                              {IncEvCountCycle(AliQAv1::kRAWS, diff);}
  void           IncEvCountCycleHits(Int_t diff=1)                              {IncEvCountCycle(AliQAv1::kHITS, diff);}
  void           IncEvCountCycleSDigits(Int_t diff=1)                           {IncEvCountCycle(AliQAv1::kSDIGITS, diff);}
  void           IncEvCountCycleDigits(Int_t diff=1)                            {IncEvCountCycle(AliQAv1::kDIGITS, diff);}
  void           IncEvCountCycleRecPoints(Int_t diff=1)                         {IncEvCountCycle(AliQAv1::kRECPOINTS, diff);}
  void           IncEvCountCycleTrackSegments(Int_t diff=1)                     {IncEvCountCycle(AliQAv1::kTRACKSEGMENTS, diff);}
  void           IncEvCountCycleRecParticles(Int_t diff=1)                      {IncEvCountCycle(AliQAv1::kRECPARTICLES, diff);}
  void           IncEvCountCycleESDs(Int_t diff=1)                              {IncEvCountCycle(AliQAv1::kESDS, diff);}
  //
  void           IncEvCountTotalRaws(Int_t diff=1)                              {IncEvCountTotal(AliQAv1::kRAWS, diff);}
  void           IncEvCountTotalHits(Int_t diff=1)                              {IncEvCountTotal(AliQAv1::kHITS, diff);}
  void           IncEvCountTotalSDigits(Int_t diff=1)                           {IncEvCountTotal(AliQAv1::kSDIGITS, diff);}
  void           IncEvCountTotalDigits(Int_t diff=1)                            {IncEvCountTotal(AliQAv1::kDIGITS, diff);}
  void           IncEvCountTotalRecPoints(Int_t diff=1)                         {IncEvCountTotal(AliQAv1::kRECPOINTS, diff);}
  void           IncEvCountTotalTrackSegments(Int_t diff=1)                     {IncEvCountTotal(AliQAv1::kTRACKSEGMENTS, diff);}
  void           IncEvCountTotalRecParticles(Int_t diff=1)                      {IncEvCountTotal(AliQAv1::kRECPARTICLES, diff);}
  void           IncEvCountTotalESDs(Int_t diff=1)                              {IncEvCountTotal(AliQAv1::kESDS, diff);}
  //
  virtual void   ClonePerTrigClass(AliQAv1::TASKINDEX_t task) = 0;
  //
  static Int_t   SetEventTrigClasses(const char* triggers);
  static const   TObjArray& GetEventTrigClasses()                           {return fgEventTrigClasses;}
  static TNamed* GetTrigClass(Int_t i)                                      {return fgTrigClasses ? (TNamed*)fgTrigClasses->At(i) : 0;}
  static const char* GetTrigClassName(Int_t i)                              {return fgTrigClasses ? (i<0||i>=GetNTrigClasses() ? "TriggerBlind":GetTrigClass(i)->GetName()) : 0;}
  static TNamed* GetEventTrigClass(Int_t i)                                 {return (TNamed*)fgEventTrigClasses.At(i);}
  static Int_t   GetNEventTrigClasses()                                     {return fgEventTrigClasses.GetEntriesFast();}
  static void    ResetEventTrigClasses()                                    {fgEventTrigClasses.Clear(); fgEventTrigClasses.SetUniqueID(0);}
  static Int_t   GetNTrigClasses()                                          {return fgTrigClasses ? fgTrigClasses->GetEntriesFast() : 0;}
  static Bool_t  IsEventTriggerSet()                                        {return fgEventTrigClasses.GetUniqueID()>0;}
  static void    SetCloningRequest(TObjArray* aliases, TObjArray* histos);
  //
  static TObjArray*  GetDataOfTrigClass(TObjArray *  arr,  Int_t cloneID, TObjArray *dest=0);
  static TObjArray*  GetDataOfTrigClass(TObjArray ** list, Int_t specieIndex, int cloneID, TObjArray *dest);
  //
  static const char* GetTriggerPrefix() {return fgkTriggerPrefix;}
  //
 protected: 
  virtual void   ClonePerTrigClassL(TObjArray ** list, AliQAv1::TASKINDEX_t task);
  virtual Int_t  ClonePerTrigClassA(TObjArray * list, const char* hnm, const char* triggers, Bool_t keepOriginal=kFALSE);
  virtual Int_t  ClonePerTrigClassH(Int_t index, TObjArray* list, TObjArray* trigArr, Bool_t keepOriginal=kFALSE);
  //
  Int_t          Add2List(TH1 * hist, const Int_t index, TObjArray ** list, const Bool_t expert = kFALSE, const Bool_t image = kFALSE, const Bool_t saveForCorr = kFALSE) ;
  TH1 *          CloneMe(TH1 * hist, Int_t specie) const ; 
  virtual void   DefaultEndOfDetectorCycle(AliQAv1::TASKINDEX_t task ) ; 
  TObject *      GetData(TObjArray ** list, const Int_t index);
  TH1*           GetData(TObjArray ** list, const Int_t index, Int_t cloneID);
  TObjArray*     GetDataOfTrigClass(TObjArray ** list, Int_t cloneID, TObjArray *dest=0);
  virtual void   InitHits()          = 0 ; 
  //virtual void   InitRecParticles()  = 0 ; 
  virtual void   InitSDigits()       = 0 ; 
  //virtual void   InitTrackSegments()  = 0 ; 
  virtual void   MakeESDs(AliESDEvent * )          = 0 ; 
  virtual void   MakeHits()         = 0 ; 
  virtual void   MakeHits(TTree * )                = 0 ;  
  virtual void   MakeDigits()       = 0 ;  
  virtual void   MakeDigits(TTree * )              = 0 ; 
  //virtual void   MakeRecParticles( ) = 0 ; 
  virtual void   MakeRaws(AliRawReader *)          = 0 ; 
  virtual void   MakeRecPoints(TTree * )           = 0 ; 
  virtual void   MakeSDigits()      = 0 ;  
  virtual void   MakeSDigits(TTree * )             = 0 ;  
  //virtual void   MakeTrackSegments(TTree * )		 = 0 ;  
  void           ResetCycle() { fCurrentCycle++ ; fCycleCounter = 0 ; } 
  virtual void   StartOfDetectorCycle()            = 0 ;
  //
  TH1*           GetMatchingHisto(TObjArray ** list, Int_t index, Int_t trigId);
  TObjArray*     GetMatchingHistosSet(TObjArray ** list, const Int_t* indexList, Int_t nHist, Int_t trigId);
  TObjArray*     GetMatchingHistos(TObjArray ** list, Int_t index, TObjArray* optDest=0);
  Bool_t         CheckCloningConsistency(TObjArray ** list, const Int_t* indexList, Int_t nHist, Bool_t checkTriggers=kFALSE);
  Int_t          FillData(TObjArray ** list, Int_t index, double x);
  Int_t          FillData(TObjArray ** list, Int_t index, double x, double y);
  Int_t          FillData(TObjArray ** list, Int_t index, double x, double y, double z);
  Int_t          SetDataBinContent(TObjArray ** list, Int_t index, int bin, double w);
  Int_t          SetDataBinContent(TObjArray ** list, Int_t index, int binX, int binY, double w);
  Int_t          SetDataBinError(TObjArray ** list, Int_t index, int bin, double err);
  Int_t          SetDataBinError(TObjArray ** list, Int_t index, int binX, int binY, double err);
  Int_t          ResetData(TObjArray ** list, Int_t index, Option_t* option = "");
  Int_t          ResetStatsData(TObjArray ** list, Int_t index);
  //
  TFile *        fOutput ;          //! output root file
  TDirectory *   fDetectorDir ;     //! directory for the given detector in the file
  TString        fDetectorDirName ; //! detector directory name in the quality assurance data file
  Int_t          fCurrentCycle ;    //! current cycle number
  Int_t          fCycle ;           //! length (# events) of the QA data acquisition cycle  
  Int_t          fCycleCounter ;    //! cycle counter
  Bool_t         fWriteExpert ;     //! flag to write or not the expert QA data
  TList **       fParameterList ;   //! list of QA data parameters
  Int_t          fRun ;             //! run number
  AliRecoParam::EventSpecie_t fEventSpecie ; //! event specie, see AliRecoParam
  TClonesArray * fDigitsArray ;    //! array to hold the sdigits
  TArrayI        fEvCountCycle[AliRecoParam::kNSpecies];  // cycle event counters per specie and per task and eventually per trigger class
  TArrayI        fEvCountTotal[AliRecoParam::kNSpecies];  // total event counters per specie and per task and eventually per trigger class
  //
  static TObjArray     fgEventTrigClasses;   // array of indices of fired trigger classes for current event (indices of fgTriggeClasses)
  static TObjArray*    fgCloningRequest;     // set of histogram names and trigger aliases
  static TObjArray*    fgTrigClasses;        // set of trigger_aliases and corresponding trigger names 
  static const Char_t* fgkTriggerPrefix;     // special prefix to separate the trigger name from histo name  
 private:
  AliQADataMaker& operator = (const AliQADataMaker& /*qadm*/); // Not implemented

  ClassDef(AliQADataMaker,5)  // description 
    
};

//____________________________________________________________________________
inline Bool_t AliQADataMaker::IsOrigHistoKept(Int_t index, TObjArray ** list) {
  // check if the histogram was cloned and the original is kept
  TObject* h = GetData(list,index); if (!h) return kFALSE; 
  return (!h->TestBit(AliQAv1::GetClonedBit())) || h->TestBit(AliQAv1::GetOrigHistoKeptBit());
}   

//____________________________________________________________________________
inline Int_t AliQADataMaker::IsClonedPerTrigClass(Int_t index, TObjArray ** list)
{
  // if the historgam was cloned per trigger, return number of clones, otherwise, return 0
  TObject* obj = GetData(list, index);
  if (!obj || !obj->TestBit(AliQAv1::GetClonedBit())) return 0;
  return ((TObjArray*)obj)->GetEntriesFast();
}

//____________________________________________________________________________
inline Bool_t AliQADataMaker::MatchesToTriggers(UInt_t hpos) const
{
  // check if the position hpos of clones TObjArray matches to one of event triggers classes
  // if the event trigger was not set, every position is matching
  if (!IsEventTriggerSet()) return kTRUE; // if triggers are not set, then this is a call from EndOfCycle
  for (int itc=GetNEventTrigClasses();itc--;) if (fgEventTrigClasses.UncheckedAt(itc)->GetUniqueID()==hpos) return kTRUE;
  return kFALSE;
}

#endif // AliQADataMaker_H
 AliQADataMaker.h:1
 AliQADataMaker.h:2
 AliQADataMaker.h:3
 AliQADataMaker.h:4
 AliQADataMaker.h:5
 AliQADataMaker.h:6
 AliQADataMaker.h:7
 AliQADataMaker.h:8
 AliQADataMaker.h:9
 AliQADataMaker.h:10
 AliQADataMaker.h:11
 AliQADataMaker.h:12
 AliQADataMaker.h:13
 AliQADataMaker.h:14
 AliQADataMaker.h:15
 AliQADataMaker.h:16
 AliQADataMaker.h:17
 AliQADataMaker.h:18
 AliQADataMaker.h:19
 AliQADataMaker.h:20
 AliQADataMaker.h:21
 AliQADataMaker.h:22
 AliQADataMaker.h:23
 AliQADataMaker.h:24
 AliQADataMaker.h:25
 AliQADataMaker.h:26
 AliQADataMaker.h:27
 AliQADataMaker.h:28
 AliQADataMaker.h:29
 AliQADataMaker.h:30
 AliQADataMaker.h:31
 AliQADataMaker.h:32
 AliQADataMaker.h:33
 AliQADataMaker.h:34
 AliQADataMaker.h:35
 AliQADataMaker.h:36
 AliQADataMaker.h:37
 AliQADataMaker.h:38
 AliQADataMaker.h:39
 AliQADataMaker.h:40
 AliQADataMaker.h:41
 AliQADataMaker.h:42
 AliQADataMaker.h:43
 AliQADataMaker.h:44
 AliQADataMaker.h:45
 AliQADataMaker.h:46
 AliQADataMaker.h:47
 AliQADataMaker.h:48
 AliQADataMaker.h:49
 AliQADataMaker.h:50
 AliQADataMaker.h:51
 AliQADataMaker.h:52
 AliQADataMaker.h:53
 AliQADataMaker.h:54
 AliQADataMaker.h:55
 AliQADataMaker.h:56
 AliQADataMaker.h:57
 AliQADataMaker.h:58
 AliQADataMaker.h:59
 AliQADataMaker.h:60
 AliQADataMaker.h:61
 AliQADataMaker.h:62
 AliQADataMaker.h:63
 AliQADataMaker.h:64
 AliQADataMaker.h:65
 AliQADataMaker.h:66
 AliQADataMaker.h:67
 AliQADataMaker.h:68
 AliQADataMaker.h:69
 AliQADataMaker.h:70
 AliQADataMaker.h:71
 AliQADataMaker.h:72
 AliQADataMaker.h:73
 AliQADataMaker.h:74
 AliQADataMaker.h:75
 AliQADataMaker.h:76
 AliQADataMaker.h:77
 AliQADataMaker.h:78
 AliQADataMaker.h:79
 AliQADataMaker.h:80
 AliQADataMaker.h:81
 AliQADataMaker.h:82
 AliQADataMaker.h:83
 AliQADataMaker.h:84
 AliQADataMaker.h:85
 AliQADataMaker.h:86
 AliQADataMaker.h:87
 AliQADataMaker.h:88
 AliQADataMaker.h:89
 AliQADataMaker.h:90
 AliQADataMaker.h:91
 AliQADataMaker.h:92
 AliQADataMaker.h:93
 AliQADataMaker.h:94
 AliQADataMaker.h:95
 AliQADataMaker.h:96
 AliQADataMaker.h:97
 AliQADataMaker.h:98
 AliQADataMaker.h:99
 AliQADataMaker.h:100
 AliQADataMaker.h:101
 AliQADataMaker.h:102
 AliQADataMaker.h:103
 AliQADataMaker.h:104
 AliQADataMaker.h:105
 AliQADataMaker.h:106
 AliQADataMaker.h:107
 AliQADataMaker.h:108
 AliQADataMaker.h:109
 AliQADataMaker.h:110
 AliQADataMaker.h:111
 AliQADataMaker.h:112
 AliQADataMaker.h:113
 AliQADataMaker.h:114
 AliQADataMaker.h:115
 AliQADataMaker.h:116
 AliQADataMaker.h:117
 AliQADataMaker.h:118
 AliQADataMaker.h:119
 AliQADataMaker.h:120
 AliQADataMaker.h:121
 AliQADataMaker.h:122
 AliQADataMaker.h:123
 AliQADataMaker.h:124
 AliQADataMaker.h:125
 AliQADataMaker.h:126
 AliQADataMaker.h:127
 AliQADataMaker.h:128
 AliQADataMaker.h:129
 AliQADataMaker.h:130
 AliQADataMaker.h:131
 AliQADataMaker.h:132
 AliQADataMaker.h:133
 AliQADataMaker.h:134
 AliQADataMaker.h:135
 AliQADataMaker.h:136
 AliQADataMaker.h:137
 AliQADataMaker.h:138
 AliQADataMaker.h:139
 AliQADataMaker.h:140
 AliQADataMaker.h:141
 AliQADataMaker.h:142
 AliQADataMaker.h:143
 AliQADataMaker.h:144
 AliQADataMaker.h:145
 AliQADataMaker.h:146
 AliQADataMaker.h:147
 AliQADataMaker.h:148
 AliQADataMaker.h:149
 AliQADataMaker.h:150
 AliQADataMaker.h:151
 AliQADataMaker.h:152
 AliQADataMaker.h:153
 AliQADataMaker.h:154
 AliQADataMaker.h:155
 AliQADataMaker.h:156
 AliQADataMaker.h:157
 AliQADataMaker.h:158
 AliQADataMaker.h:159
 AliQADataMaker.h:160
 AliQADataMaker.h:161
 AliQADataMaker.h:162
 AliQADataMaker.h:163
 AliQADataMaker.h:164
 AliQADataMaker.h:165
 AliQADataMaker.h:166
 AliQADataMaker.h:167
 AliQADataMaker.h:168
 AliQADataMaker.h:169
 AliQADataMaker.h:170
 AliQADataMaker.h:171
 AliQADataMaker.h:172
 AliQADataMaker.h:173
 AliQADataMaker.h:174
 AliQADataMaker.h:175
 AliQADataMaker.h:176
 AliQADataMaker.h:177
 AliQADataMaker.h:178
 AliQADataMaker.h:179
 AliQADataMaker.h:180
 AliQADataMaker.h:181
 AliQADataMaker.h:182
 AliQADataMaker.h:183
 AliQADataMaker.h:184
 AliQADataMaker.h:185
 AliQADataMaker.h:186
 AliQADataMaker.h:187
 AliQADataMaker.h:188
 AliQADataMaker.h:189
 AliQADataMaker.h:190
 AliQADataMaker.h:191
 AliQADataMaker.h:192
 AliQADataMaker.h:193
 AliQADataMaker.h:194
 AliQADataMaker.h:195
 AliQADataMaker.h:196
 AliQADataMaker.h:197
 AliQADataMaker.h:198
 AliQADataMaker.h:199
 AliQADataMaker.h:200
 AliQADataMaker.h:201
 AliQADataMaker.h:202
 AliQADataMaker.h:203
 AliQADataMaker.h:204
 AliQADataMaker.h:205
 AliQADataMaker.h:206
 AliQADataMaker.h:207
 AliQADataMaker.h:208
 AliQADataMaker.h:209
 AliQADataMaker.h:210
 AliQADataMaker.h:211
 AliQADataMaker.h:212
 AliQADataMaker.h:213
 AliQADataMaker.h:214
 AliQADataMaker.h:215
 AliQADataMaker.h:216
 AliQADataMaker.h:217
 AliQADataMaker.h:218
 AliQADataMaker.h:219
 AliQADataMaker.h:220
 AliQADataMaker.h:221
 AliQADataMaker.h:222
 AliQADataMaker.h:223
 AliQADataMaker.h:224
 AliQADataMaker.h:225
 AliQADataMaker.h:226
 AliQADataMaker.h:227
 AliQADataMaker.h:228
 AliQADataMaker.h:229
 AliQADataMaker.h:230
 AliQADataMaker.h:231
 AliQADataMaker.h:232
 AliQADataMaker.h:233
 AliQADataMaker.h:234
 AliQADataMaker.h:235
 AliQADataMaker.h:236
 AliQADataMaker.h:237
 AliQADataMaker.h:238
 AliQADataMaker.h:239
 AliQADataMaker.h:240
 AliQADataMaker.h:241
 AliQADataMaker.h:242
 AliQADataMaker.h:243
 AliQADataMaker.h:244
 AliQADataMaker.h:245
 AliQADataMaker.h:246
 AliQADataMaker.h:247
 AliQADataMaker.h:248
 AliQADataMaker.h:249
 AliQADataMaker.h:250
 AliQADataMaker.h:251
 AliQADataMaker.h:252
 AliQADataMaker.h:253
 AliQADataMaker.h:254
 AliQADataMaker.h:255
 AliQADataMaker.h:256
 AliQADataMaker.h:257
 AliQADataMaker.h:258
 AliQADataMaker.h:259
 AliQADataMaker.h:260
 AliQADataMaker.h:261
 AliQADataMaker.h:262
 AliQADataMaker.h:263
 AliQADataMaker.h:264
 AliQADataMaker.h:265
 AliQADataMaker.h:266
 AliQADataMaker.h:267
 AliQADataMaker.h:268
 AliQADataMaker.h:269
 AliQADataMaker.h:270
 AliQADataMaker.h:271
 AliQADataMaker.h:272
 AliQADataMaker.h:273
 AliQADataMaker.h:274
 AliQADataMaker.h:275
 AliQADataMaker.h:276
 AliQADataMaker.h:277
 AliQADataMaker.h:278
 AliQADataMaker.h:279
 AliQADataMaker.h:280
 AliQADataMaker.h:281
 AliQADataMaker.h:282
 AliQADataMaker.h:283
 AliQADataMaker.h:284
 AliQADataMaker.h:285
 AliQADataMaker.h:286
 AliQADataMaker.h:287
 AliQADataMaker.h:288
 AliQADataMaker.h:289
 AliQADataMaker.h:290
 AliQADataMaker.h:291
 AliQADataMaker.h:292
 AliQADataMaker.h:293
 AliQADataMaker.h:294
 AliQADataMaker.h:295
 AliQADataMaker.h:296
 AliQADataMaker.h:297
 AliQADataMaker.h:298
 AliQADataMaker.h:299
 AliQADataMaker.h:300
 AliQADataMaker.h:301
 AliQADataMaker.h:302
 AliQADataMaker.h:303
 AliQADataMaker.h:304
 AliQADataMaker.h:305
 AliQADataMaker.h:306
 AliQADataMaker.h:307
 AliQADataMaker.h:308
 AliQADataMaker.h:309
 AliQADataMaker.h:310
 AliQADataMaker.h:311
 AliQADataMaker.h:312
 AliQADataMaker.h:313
 AliQADataMaker.h:314
 AliQADataMaker.h:315
 AliQADataMaker.h:316
 AliQADataMaker.h:317
 AliQADataMaker.h:318
 AliQADataMaker.h:319
 AliQADataMaker.h:320
 AliQADataMaker.h:321
 AliQADataMaker.h:322
 AliQADataMaker.h:323
 AliQADataMaker.h:324
 AliQADataMaker.h:325
 AliQADataMaker.h:326
 AliQADataMaker.h:327
 AliQADataMaker.h:328
 AliQADataMaker.h:329
 AliQADataMaker.h:330
 AliQADataMaker.h:331
 AliQADataMaker.h:332
 AliQADataMaker.h:333
 AliQADataMaker.h:334
 AliQADataMaker.h:335
 AliQADataMaker.h:336
 AliQADataMaker.h:337
 AliQADataMaker.h:338
 AliQADataMaker.h:339
 AliQADataMaker.h:340
 AliQADataMaker.h:341
 AliQADataMaker.h:342
 AliQADataMaker.h:343
 AliQADataMaker.h:344
 AliQADataMaker.h:345
 AliQADataMaker.h:346
 AliQADataMaker.h:347
 AliQADataMaker.h:348
 AliQADataMaker.h:349
 AliQADataMaker.h:350
 AliQADataMaker.h:351
 AliQADataMaker.h:352
 AliQADataMaker.h:353
 AliQADataMaker.h:354
 AliQADataMaker.h:355
 AliQADataMaker.h:356
 AliQADataMaker.h:357
 AliQADataMaker.h:358
 AliQADataMaker.h:359
 AliQADataMaker.h:360