#ifndef MARS_MCalibrationCalc
#define MARS_MCalibrationCalc

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

class MPedestalCam;
class MCalibrationCam;
class MExtractedSignalCam;

class MCalibrationBlindPix;
class MCalibrationPINDiode;

class MTime;
class MRawEvtData;
class MRawRunHeader;

class MCalibrationCalc : public MTask
{
private:

  MPedestalCam             *fPedestals;    // Pedestals of all pixels in the camera
  MCalibrationCam          *fCalibrations; // Calibration events of all pixels in the camera
  MExtractedSignalCam      *fSignals;      // Calibration events of all pixels in the camera

  MRawEvtData              *fRawEvt;       // raw event data (time slices)
  MRawRunHeader            *fRunHeader;    // RunHeader information

  MTime                    *fEvtTime;      // Time of the event

  Int_t fEvents;                           // Number of events  
  Int_t fHistOverFlow;                     // Number of events with saturated Low Gain
  Int_t fCosmics;                          // Number of events due to supposed cosmics

  Byte_t fNumHiGainSamples; 
  Byte_t fNumLoGainSamples; 
  Float_t fSqrtHiGainSamples; 
  
  Float_t fConversionHiLo;
  Byte_t fFlags;                           // Flag for the fits used

  TString fExcludedPixelsFile;
  UInt_t  fNumExcludedPixels;
  
public:
  
  enum PulserColor_t  { kEGreen, kEBlue, kEUV, kECT1 };

private:

  PulserColor_t  fColor;
  
  Bool_t ReInit(MParList *pList); 
  Int_t PreProcess(MParList *pList);
  Int_t Process();
  Int_t PostProcess();
  
public:

  MCalibrationCalc(const char *name=NULL, const char *title=NULL);


private:

  enum  { kUseTimeFits, kUseBlindPixelFit, kUsePinDiodeFit };

public:

  // Skipping fits 
  void SkipTimeFits(Bool_t b=kTRUE)
      {b ? CLRBIT(fFlags, kUseTimeFits) : SETBIT(fFlags, kUseTimeFits);}
  void SkipBlindPixelFit(Bool_t b=kTRUE)
      {b ? CLRBIT(fFlags, kUseBlindPixelFit) : SETBIT(fFlags, kUseBlindPixelFit);}
  void SkipPinDiodeFit(Bool_t b=kTRUE)
      {b ? CLRBIT(fFlags, kUsePinDiodeFit) : SETBIT(fFlags, kUsePinDiodeFit);}

  // Setters 
  void SetPulserColor(PulserColor_t color)    { fColor = color; }
  void SetConversionHiLo(Float_t conv)         { fConversionHiLo = conv; }

  // Getters
  MCalibrationBlindPix *GetBlindPixel() const;
  MCalibrationPINDiode *GetPINDiode() const;

  // Exclude pixels from configuration file
  void ExcludePixelsFromAsciiFile(const char *file) { fExcludedPixelsFile = file;  }
  
  ClassDef(MCalibrationCalc, 1)   // Task to fill the Calibration Containers from raw data
};

#endif
