#ifndef MARS_MJCut
#define MARS_MJCut

#ifndef MARS_MJob
#include "MJob.h"
#endif

class MTask;
class MDataSet;
class MWriteRootFile;

class MJCut : public MJob
{
private:
    Bool_t  fStoreSummary;
    Bool_t  fStoreResult;
    Bool_t  fWriteOnly;

    TString fNameSummary;
    TString fNameResult;
    TString fNameOutput;

    MTask *fEstimateEnergy;
    MTask *fCalcHadronness;

    TString GetOutputFile(UInt_t num) const;
    Bool_t  CheckEnvLocal();
    void    SetupWriter(MWriteRootFile &write, const char *name) const;
    Bool_t  WriteTasks(UInt_t num, TObjArray &cont) const;
    Bool_t  WriteResult(UInt_t num) const;

    Bool_t  CanStoreSummary() const { return !fPathOut.IsNull() && fStoreSummary; }
    Bool_t  CanStoreResult() const  { return !fPathOut.IsNull() && fStoreResult;  }

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

    Bool_t ProcessFile(const MDataSet &set);

    void EnableStorageOfSummary(Bool_t b=kTRUE)  { fStoreSummary = b; } // See SetNameSummary
    void EnableStorageOfResult(Bool_t b=kTRUE)   { fStoreResult  = b; } // See SetNameResult
    void EnableWriteOnly(Bool_t b=kTRUE)         { fWriteOnly    = b; }

    void SetNameSummaryFile(const char *name="");
    void SetNameResultFile(const char *name="");
    void SetNameOutFile(const char *name="")      { fNameOutput=name; }

    void SetEnergyEstimator(const MTask *task=0);
    void SetHadronnessCalculator(const MTask *task=0);

    ClassDef(MJCut, 0) // Standard program to perform g/h-seperation cuts
};

#endif
