#ifndef MARS_MJPedestal
#define MARS_MJPedestal

#ifndef MARS_MPedestalCam
#include "MPedestalCam.h"
#endif
#ifndef MARS_MBadPixelsCam
#include "MBadPixelsCam.h"
#endif

class TEnv;
class TCanvas;
class MParList;
class MSequence;
class MRunIter;
class MHCamera;
class TH1D;
class MExtractor;

class MJPedestal : public MParContainer
{
private:

  static const Double_t fgPedestalMin;
  static const Double_t fgPedestalMax;
  static const Double_t fgPedRmsMin;
  static const Double_t fgPedRmsMax;
  
  static const Float_t  fgRefPedClosedLids;
  static const Float_t  fgRefPedExtraGalactic;
  static const Float_t  fgRefPedGalactic;

  static const Float_t  fgRefPedRmsClosedLidsInner;
  static const Float_t  fgRefPedRmsExtraGalacticInner;
  static const Float_t  fgRefPedRmsGalacticInner;
  
  static const Float_t  fgRefPedRmsClosedLidsOuter;
  static const Float_t  fgRefPedRmsExtraGalacticOuter;
  static const Float_t  fgRefPedRmsGalacticOuter;
  
  TString fOutputPath;        // Directory where the F0-files get stored
  
  TEnv       *fEnv;           // Input setup-file
  MRunIter   *fRuns;          // Used pedestal runs
  MSequence  *fSequence;      // Sequence

  MExtractor *fExtractor;     // Signal extractor, used to find the nr. of used FADC slices
  
  MPedestalCam  fPedestalCam; // Created pedestal results
  MBadPixelsCam fBadPixels;   // Bad Pixels
  
  enum  Display_t { kDataCheckDisplay, kNormalDisplay }; // Possible Display types

  Display_t fDisplayType;     // Chosen Display type    
  
  Bool_t fDataCheck;          // Flag if the data check is run on raw data
  
  Bool_t ReadPedestalCam();
  Bool_t WriteResult();
  
  void   DisplayResult(MParList &plist);
  void   DisplayReferenceLines(MHCamera *cam, const Int_t what) const;
  void   DisplayOutliers(TH1D *hist) const;
  void   FixDataCheckHist(TH1D *hist) const;
  
  void   CheckEnv();
  
public:

  MJPedestal(const char *name=NULL, const char *title=NULL);
  ~MJPedestal();
  
  MPedestalCam &GetPedestalCam()            { return fPedestalCam; }
  const MBadPixelsCam &GetBadPixels() const { return fBadPixels;   }
  
  const char* GetOutputFile() const;
  const Bool_t IsDataCheck() const    { return fDataCheck;  }
  
  Bool_t Process();
  Bool_t ProcessFile();
  
  void SetBadPixels(const MBadPixelsCam &bad) { bad.Copy(fBadPixels); }
  void SetExtractor(MExtractor* ext) { fExtractor = ext; }
  void SetInput(MRunIter *iter) { fRuns = iter; }
  void SetSequence(MSequence *seq) { fSequence = seq; }
  void SetOutputPath(const char *path=".");
  void SetEnv(const char *env);
  
  void SetDataCheck(const Bool_t b=kTRUE) { fDataCheck = b; SetDataCheckDisplay(); }
  
  void SetDataCheckDisplay() { fDisplayType = kDataCheckDisplay; }
  void SetNormalDisplay()    { fDisplayType = kNormalDisplay;    }
  
  ClassDef(MJPedestal, 0) // Tool to create a pedestal file (MPedestalCam)
};

#endif
