#ifndef MARS_MRanForestCalc
#define MARS_MRanForestCalc

#ifndef MARS_MTask
#include "MTask.h"
#endif

#ifndef MARS_MHMatrix
#include "MHMatrix.h"
#endif

class MParList;
class MHadronness;
class MDataArray;
class MRanTree;
class MRanForest;

class MRanForestCalc : public MTask
{
private:
    Int_t  fNum;              // number of trees used to compute hadronness

    TString fHadronnessName;  // Name of container storing hadronness

    MHadronness *fHadroness;  //! Output container for calculated hadroness
    MDataArray  *fData;       //! Used to store the MDataChains to get the event values
    MRanForest  *fRanForest;
    MRanTree    *fRanTree;

    Int_t PreProcess(MParList *plist);
    Int_t Process();

    enum { kIsOwner = BIT(14) };

    Bool_t IsOwner() const { return TestBit(kIsOwner); }
    void SetOwner() { SetBit(kIsOwner); }

public:
    MRanForestCalc(const char *name=NULL, const char *title=NULL);
    ~MRanForestCalc();

    Int_t ReadEnv(const TEnv &env, TString prefix, Bool_t print);

    void SetHadronnessName(const TString name) { fHadronnessName = name; }
    TString GetHadronnessName() const { return fHadronnessName; }

    void SetUseNumTrees(UShort_t n=100) { fNum = n; }

    Bool_t Grow(MHMatrix *matrixg,MHMatrix *matrixh,Int_t ntree,
                Int_t numtry,Int_t ndsize,const char* treefile=0,
                const char* treename=0,const char* contname=0,
                const char* hgininame=0);

    Bool_t Fill(Int_t ntree,const char* treefile=0,const char* treename=0);


    ClassDef(MRanForestCalc, 0) // Task
};

#endif
