#ifndef MARS_MCalibrationCalc
#define MARS_MCalibrationCalc

/////////////////////////////////////////////////////////////////////////////
//                                                                         //
// MCalibrationCalc                                                   //
//                                                                         //
// Integrates the time slices of the all pixels of a calibration event     //
// and substract the pedestal value                                        //
//                                                                         //
/////////////////////////////////////////////////////////////////////////////

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

class MRawEvtData;
class MRawRunHeader;

class MPedestalCam;
class MCalibrationCam;

class MTime;

class MCalibrationCalc : public MTask
{
private:

  MPedestalCam             *fPedestals;    // Pedestals of all pixels in the camera
  MCalibrationCam          *fCalibrations; // 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 fNrEvents;                         // Number of events  
  Int_t fOverFlow;                         // Number of events with saturated Low Gain

  Byte_t fFlags;                           // Flag for the fits used
  
  enum
    {
      kUseTFits = 1,
      kUseBPFit = 2,
      kUsePDFit = 3
    };

public:
  
  enum PulserColor_t  { kEGreen, kEBlue, kEUV };

private:

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

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

  void SetSkipTFits(Bool_t b=kTRUE)
      {b ? CLRBIT(fFlags, kUseTFits) : SETBIT(fFlags, kUseTFits);}
  void SetSkipBPFit(Bool_t b=kTRUE)
      {b ? CLRBIT(fFlags, kUseBPFit) : SETBIT(fFlags, kUseBPFit);}
  void SetSkipPDFit(Bool_t b=kTRUE)
      {b ? CLRBIT(fFlags, kUsePDFit) : SETBIT(fFlags, kUsePDFit);}

  void SetPulserColor(PulserColor_t color)    { fColor = color; }
  
  ClassDef(MCalibrationCalc, 1)   // Task to fill the Calibration Containers from raw data
};

#endif
