ROOT logo
#ifndef ALIBASECALIBVIEWER_H
#define ALIBASECALIBVIEWER_H

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Base class for the AliTPCCalibViewer and AliTRDCalibViewer               //
//  used for the calibration monitor                                         //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <TObject.h>
#include <TTree.h>
#include <TFile.h>
#include "TFriendElement.h"

#include "AliMathBase.h"

class TLegend;

class AliBaseCalibViewer : public TObject {
  public:
    AliBaseCalibViewer();
    AliBaseCalibViewer(const AliBaseCalibViewer &c);
    AliBaseCalibViewer(TTree* tree);
    AliBaseCalibViewer(const Char_t* fileName, const Char_t* treeName = "tree");
    AliBaseCalibViewer &operator = (const AliBaseCalibViewer & param);
    virtual ~AliBaseCalibViewer();
    virtual void Delete(Option_t* option = "");

    TString& GetAbbreviation()  { return fAbbreviation;  }
    TString& GetAppendString()  { return fAppendString; }
    void SetAbbreviation(const Char_t* abr) { fAbbreviation = abr; }
    void SetAppendString(const Char_t* str) { fAppendString = str; }

    //virtual void GetTimeInfoOCDB(const Char_t* runList, const Char_t* outFile,
    //Int_t firstRun, Int_t lastRun, UInt_t infoFlags,
    //const Char_t* ocdbStorage) = 0;

    virtual void     Draw(Option_t* opt="") { fTree->Draw(opt); }
    virtual Long64_t Draw(const Char_t* varexp, const TCut& selection, Option_t* option = "", 
        Long64_t nentries = 1000000000, Long64_t firstentry = 0) { 
      return fTree->Draw(varexp, selection, option, nentries, firstentry); 
    };
    virtual Long64_t Draw(const Char_t* varexp, const Char_t* selection, Option_t* option = "", 
        Long64_t nentries = 1000000000, Long64_t firstentry = 0) { 
      return fTree->Draw(varexp, selection, option, nentries, firstentry); 
    };

    virtual const char* AddAbbreviations(Char_t* c, Bool_t printDrawCommand = kFALSE) = 0;
    // easy drawing of data, use '~' for abbreviation of '.fElements'
    virtual Int_t EasyDraw(const Char_t* drawCommand, const Char_t* sector, const Char_t* cuts = 0, 
        const Char_t* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const = 0;   
    // easy drawing of data, use '~' for abbreviation of '.fElements'
    virtual Int_t EasyDraw(const Char_t* drawCommand, Int_t sector, const Char_t* cuts = 0, 
        const Char_t* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const = 0;   
    // easy drawing of data, use '~' for abbreviation of '.fElements'
    virtual Int_t EasyDraw1D(const Char_t* drawCommand, const Char_t* sector, const Char_t* cuts = 0, 
        const Char_t* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const = 0;   
    // easy drawing of data, use '~' for abbreviation of '.fElements'
    virtual Int_t EasyDraw1D(const Char_t* drawCommand, Int_t sector, const Char_t* cuts = 0, 
        const Char_t* drawOptions = 0, Bool_t writeDrawCommand = kFALSE) const = 0;   
    // formats title and axis labels of histo, removes '.fElements'
    void FormatHistoLabels(TH1 *histo) const;   
    // draws 1d histograms and superimposes mean, median, ltm and several sigma cuts
    Int_t  DrawHisto1D(const Char_t* drawCommand, const Char_t* sector, const Char_t* cuts = 0, 
        const Char_t *sigmas = "2;4;6", Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, 
        Bool_t plotLTM = kTRUE) const; 
    // draws fraction of used pads over different sigma cuts
    Int_t     SigmaCut(const Char_t* drawCommand, const Char_t* sector, const Char_t* cuts = 0, 
        Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, 
        Bool_t plotLTM = kTRUE, Bool_t pm = kFALSE, const Char_t *sigmas = "", 
        Float_t sigmaStep = -1) const;    
    // draws an integrated histogram
    Int_t    Integrate(const Char_t* drawCommand, const Char_t* sector, const Char_t* cuts = 0, 
        Float_t sigmaMax = 5, Bool_t plotMean = kTRUE, Bool_t plotMedian = kTRUE, 
        Bool_t plotLTM = kTRUE, const Char_t *sigmas = "", Float_t sigmaStep = -1) const;    

    virtual TObjArray* GetListOfVariables(Bool_t printList = kFALSE) = 0;
    virtual TObjArray* GetListOfNormalizationVariables(Bool_t printList = kFALSE) const = 0;

    TFriendElement* AddReferenceTree(const Char_t* filename, const Char_t* treename = "tree", const Char_t* refname = "R");
    TFriendElement* AddFriend(const Char_t* treename, const Char_t* filename) 
    {return fTree->AddFriend(treename, filename);};
    TFriendElement* AddFriend(TTree* tree, const Char_t* alias, Bool_t warn=kFALSE) 
    {return fTree->AddFriend(tree, alias, warn);};
    TFriendElement* AddFriend(const Char_t* treename, TFile* file) 
    {return fTree->AddFriend(treename, file);};
    TTree * GetTree() const { return fTree;}

    TString* Fit(const Char_t* drawCommand, const Char_t* formula, const Char_t* cuts, 
        Double_t & chi2, TVectorD &fitParam, TMatrixD &covMatrix);
    static Double_t GetLTM(Int_t n, Double_t *array, Double_t *sigma = 0, Double_t fraction = 0.9);
    static Int_t GetBin(Float_t value, Int_t nbins, Double_t binLow, Double_t binUp);
    static TH1F* SigmaCut(Int_t n, Float_t *array, Float_t mean, Float_t sigma, Int_t nbins, 
        Float_t binLow, Float_t binUp, Float_t sigmaMax, Float_t sigmaStep = -1, Bool_t pm = kFALSE);
    static TH1F* SigmaCut(TH1F *histogram, Float_t mean, Float_t sigma, Float_t sigmaMax, 
        Float_t sigmaStep = -1, Bool_t pm = kFALSE);
    static TH1F* Integrate(TH1F *histogram, Float_t mean = 0, Float_t sigma = 0, 
        Float_t sigmaMax = 0, Float_t sigmaStep = -1);
    static TH1F* Integrate(Int_t n, Float_t *array, Int_t nbins, Float_t binLow, Float_t binUp, 
        Float_t mean = 0, Float_t sigma = 0, Float_t sigmaMax = 0, Float_t sigmaStep = -1);
    static TH1F* SigmaCut(Int_t n, Double_t *array, Double_t mean, Double_t sigma, 
        Int_t nbins, Double_t *xbins, Double_t sigmaMax);

  protected:
    TTree* fTree;     // tree containing visualization data (e.g. written by AliTPCCalPad::MakeTree(...)
    TFile* fFile;     // file that contains a calPads tree (e.g. written by AliTPCCalPad::MakeTree(...)
    TObjArray* fListOfObjectsToBeDeleted;  //Objects, that will be deleted when the destructor ist called
    Bool_t fTreeMustBeDeleted;  // decides weather the tree must be deleted in destructor or not 
    TString fAbbreviation;       // the abreviation for '.fElements'
    TString fAppendString;      // '.fElements', stored in a TStrig

    void DrawLines(TH1F *cutHistoMean, TVectorF nsigma, TLegend *legend, Int_t color, Bool_t pm) const;
    void DrawLines(TGraph *graph, TVectorF nsigma, TLegend *legend, Int_t color, Bool_t pm) const;


    ClassDef(AliBaseCalibViewer,1)    //  Base calibration viewer class
};

#endif
 AliBaseCalibViewer.h:1
 AliBaseCalibViewer.h:2
 AliBaseCalibViewer.h:3
 AliBaseCalibViewer.h:4
 AliBaseCalibViewer.h:5
 AliBaseCalibViewer.h:6
 AliBaseCalibViewer.h:7
 AliBaseCalibViewer.h:8
 AliBaseCalibViewer.h:9
 AliBaseCalibViewer.h:10
 AliBaseCalibViewer.h:11
 AliBaseCalibViewer.h:12
 AliBaseCalibViewer.h:13
 AliBaseCalibViewer.h:14
 AliBaseCalibViewer.h:15
 AliBaseCalibViewer.h:16
 AliBaseCalibViewer.h:17
 AliBaseCalibViewer.h:18
 AliBaseCalibViewer.h:19
 AliBaseCalibViewer.h:20
 AliBaseCalibViewer.h:21
 AliBaseCalibViewer.h:22
 AliBaseCalibViewer.h:23
 AliBaseCalibViewer.h:24
 AliBaseCalibViewer.h:25
 AliBaseCalibViewer.h:26
 AliBaseCalibViewer.h:27
 AliBaseCalibViewer.h:28
 AliBaseCalibViewer.h:29
 AliBaseCalibViewer.h:30
 AliBaseCalibViewer.h:31
 AliBaseCalibViewer.h:32
 AliBaseCalibViewer.h:33
 AliBaseCalibViewer.h:34
 AliBaseCalibViewer.h:35
 AliBaseCalibViewer.h:36
 AliBaseCalibViewer.h:37
 AliBaseCalibViewer.h:38
 AliBaseCalibViewer.h:39
 AliBaseCalibViewer.h:40
 AliBaseCalibViewer.h:41
 AliBaseCalibViewer.h:42
 AliBaseCalibViewer.h:43
 AliBaseCalibViewer.h:44
 AliBaseCalibViewer.h:45
 AliBaseCalibViewer.h:46
 AliBaseCalibViewer.h:47
 AliBaseCalibViewer.h:48
 AliBaseCalibViewer.h:49
 AliBaseCalibViewer.h:50
 AliBaseCalibViewer.h:51
 AliBaseCalibViewer.h:52
 AliBaseCalibViewer.h:53
 AliBaseCalibViewer.h:54
 AliBaseCalibViewer.h:55
 AliBaseCalibViewer.h:56
 AliBaseCalibViewer.h:57
 AliBaseCalibViewer.h:58
 AliBaseCalibViewer.h:59
 AliBaseCalibViewer.h:60
 AliBaseCalibViewer.h:61
 AliBaseCalibViewer.h:62
 AliBaseCalibViewer.h:63
 AliBaseCalibViewer.h:64
 AliBaseCalibViewer.h:65
 AliBaseCalibViewer.h:66
 AliBaseCalibViewer.h:67
 AliBaseCalibViewer.h:68
 AliBaseCalibViewer.h:69
 AliBaseCalibViewer.h:70
 AliBaseCalibViewer.h:71
 AliBaseCalibViewer.h:72
 AliBaseCalibViewer.h:73
 AliBaseCalibViewer.h:74
 AliBaseCalibViewer.h:75
 AliBaseCalibViewer.h:76
 AliBaseCalibViewer.h:77
 AliBaseCalibViewer.h:78
 AliBaseCalibViewer.h:79
 AliBaseCalibViewer.h:80
 AliBaseCalibViewer.h:81
 AliBaseCalibViewer.h:82
 AliBaseCalibViewer.h:83
 AliBaseCalibViewer.h:84
 AliBaseCalibViewer.h:85
 AliBaseCalibViewer.h:86
 AliBaseCalibViewer.h:87
 AliBaseCalibViewer.h:88
 AliBaseCalibViewer.h:89
 AliBaseCalibViewer.h:90
 AliBaseCalibViewer.h:91
 AliBaseCalibViewer.h:92
 AliBaseCalibViewer.h:93
 AliBaseCalibViewer.h:94
 AliBaseCalibViewer.h:95
 AliBaseCalibViewer.h:96
 AliBaseCalibViewer.h:97
 AliBaseCalibViewer.h:98
 AliBaseCalibViewer.h:99
 AliBaseCalibViewer.h:100
 AliBaseCalibViewer.h:101
 AliBaseCalibViewer.h:102
 AliBaseCalibViewer.h:103
 AliBaseCalibViewer.h:104
 AliBaseCalibViewer.h:105
 AliBaseCalibViewer.h:106
 AliBaseCalibViewer.h:107
 AliBaseCalibViewer.h:108
 AliBaseCalibViewer.h:109
 AliBaseCalibViewer.h:110
 AliBaseCalibViewer.h:111
 AliBaseCalibViewer.h:112
 AliBaseCalibViewer.h:113
 AliBaseCalibViewer.h:114
 AliBaseCalibViewer.h:115
 AliBaseCalibViewer.h:116
 AliBaseCalibViewer.h:117
 AliBaseCalibViewer.h:118
 AliBaseCalibViewer.h:119
 AliBaseCalibViewer.h:120