#ifndef MARS_MJCut
#define MARS_MJCut

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

class MTask;
class MDataSet;
class MParList;
class MHAlpha;
class MH;
class MWriteRootFile;
class MPointingPos;
class MHSrcPosCam;

class MJCut : public MJob
{
private:
    Bool_t  fStoreSummary;
    Bool_t  fStoreResult;
    Bool_t  fWriteOnly;
    Bool_t  fFullDisplay;
    Bool_t  fRndmSrcPos;
    //Bool_t  fSubstraction;

    TString fNameSummary;
    TString fNameResult;
    TString fNameOutput;

    TString fNameHist;
    TString fNameHistFS;

    MTask  *fCalcHadronness;
    MTask  *fCalcDisp;
    MTask  *fEstimateEnergy;

    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(const MParList &plist, const MDataSet &set) const;
    MHAlpha *CreateNewHist(MParList &plist, const char *name="") const;
    MH      *CreateNewHistFS(MParList &plist, const char *name="") const;

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

    Bool_t   FillSrcPosCam(const MDataSet &set, MPointingPos &source, MHSrcPosCam &srcpos);

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

    Int_t Process(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 EnableFullDisplay(Bool_t b=kTRUE)       { fFullDisplay  = b; }
    void EnableRandomSrcPos(Bool_t b=kTRUE)      { fRndmSrcPos   = b; }
    //void EnableSubstraction(Bool_t b=kTRUE)      { fSubstraction = b; }

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

    void SetNameHist(const char *name) { fNameHist=name; }
    void SetNameHistFS(const char *name) { fNameHistFS=name; }

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

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

#endif
