// @(#)root/treeplayer:$Name:  $:$Id: TSelectorDraw.h,v 1.8 2003/10/07 11:10:36 brun Exp $
// Author: Rene Brun   08/01/2003

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TSelectorDraw
#define ROOT_TSelectorDraw


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSelectorDraw                                                        //
//                                                                      //
// A specialized TSelector for TTree::Draw.                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TSelector
#include "TSelector.h"
#endif

class TTreeFormula;
class TTreeFormulaManager;
class TH1;

class TSelectorDraw : public TSelector {

protected:
    enum { kWarn = BIT(12) };

    TTree         *fTree;           //  Pointer to current Tree
    TTreeFormula  *fVar1;           //  Pointer to first variable formula
    TTreeFormula  *fVar2;           //  Pointer to second variable formula
    TTreeFormula  *fVar3;           //  Pointer to third variable formula
    TTreeFormula  *fVar4;           //  Pointer to fourth variable formula
    TTreeFormula  *fSelect;         //  Pointer to selection formula
    TTreeFormulaManager *fManager;  //  Pointer to the formula manager
    TObject       *fObject;         //! Pointer to object being filled (histogram, event list)
    TObject       *fTreeElist;      //  pointer to Tree Event list
    TH1           *fOldHistogram;   //! Pointer to previously used histogram
    Int_t          fAction;         //! Action type
    Int_t          fDraw;           //! Last entry loop number when object was drawn
    Int_t          fNfill;          //! Total number of histogram fills
    Int_t          fMultiplicity;   //  Indicator of the variability of the size of entries
    Int_t          fDimension;      //  Dimension of the current expression
    Int_t          fSelectedRows;   //  Number of selected entries
    Int_t          fOldEstimate;    //  value of Tree fEstimate when selector is called
    Int_t          fForceRead;      //  Forec Read flag
    Int_t          fNbins[4];       //  Number of bins per dimension
    Double_t       fVmin[4];        //  Minima of varexp columns
    Double_t       fVmax[4];        //  Maxima of varexp columns
    Double_t       fWeight;         //  Tree weight (see TTree::SetWeight)
    Double_t      *fV1;             //[fSelectedRows]Local buffer for variable 1
    Double_t      *fV2;             //[fSelectedRows]Local buffer for variable 2
    Double_t      *fV3;             //[fSelectedRows]Local buffer for variable 3
    Double_t      *fV4;             //[fSelectedRows]Local buffer for variable 4
    Double_t      *fW;              //[fSelectedRows]Local buffer for weights
    Bool_t         fVar1Multiple;   //  true if var1 has a variable index
    Bool_t         fVar2Multiple;   //  true if var2 has a variable index
    Bool_t         fVar3Multiple;   //  true if var3 has a variable index
    Bool_t         fVar4Multiple;   //  true if var4 has a variable index
    Bool_t         fSelectMultiple; //  true if selection has a variable index
    Bool_t         fCleanElist;     //  true if original Tree elist must be saved
    Bool_t         fObjEval;        //  true if fVar1 returns an object (or pointer to).

protected:
    virtual void      ClearFormula();
    virtual Bool_t    CompileVariables(const char *varexp="", const char *selection="");

public:
    TSelectorDraw();
    virtual ~TSelectorDraw();

    virtual void      Begin(TTree *tree);
    virtual Int_t     GetAction() const {return fAction;}
    virtual Bool_t    GetCleanElist() const {return fCleanElist;}
    virtual Int_t     GetDimension() const {return fDimension;}
    virtual Int_t     GetDrawFlag() const {return fDraw;}
    TObject          *GetObject() const {return fObject;}
    Int_t             GetMultiplicity() const   {return fMultiplicity;}
    const char       *GetNameByIndex(TString &varexp, Int_t *index,Int_t colindex);
    virtual Int_t     GetNfill() const {return fNfill;}
    TH1              *GetOldHistogram() const {return fOldHistogram;}
    TTreeFormula     *GetSelect() const    {return fSelect;}
    virtual Int_t     GetSelectedRows() const {return fSelectedRows;}
    TTreeFormula     *GetVar1() const {return fVar1;}
    TTreeFormula     *GetVar2() const {return fVar2;}
    TTreeFormula     *GetVar3() const {return fVar3;}
    TTreeFormula     *GetVar4() const {return fVar4;}
    virtual Double_t *GetV1() const   {return fV1;}
    virtual Double_t *GetV2() const   {return fV2;}
    virtual Double_t *GetV3() const   {return fV3;}
    virtual Double_t *GetV4() const   {return fV4;}
    virtual Double_t *GetW() const    {return fW;}
    virtual void      MakeIndex(TString &varexp, Int_t *index);
    virtual Bool_t    Notify();
    virtual Bool_t    Process(Int_t /*entry*/) { return kFALSE; }
    virtual void      ProcessFill(Int_t entry);
    virtual void      ProcessFillMultiple(Int_t entry);
    virtual void      ProcessFillObject(Int_t entry);
    virtual void      SetEstimate(Int_t n);
    virtual void      TakeAction();
    virtual void      TakeEstimate();
    virtual void      Terminate();

    ClassDef(TSelectorDraw,1)  //A specialized TSelector for TTree::Draw
};

#endif
