#ifndef MARS_MExtractedSignalPix
#define MARS_MExtractedSignalPix

#ifndef MARS_MParContainer
#include "MParContainer.h"
#endif

class MExtractedSignalPix : public MParContainer
{
private:
    // FIXME: We can only store ONE signal. Everything else takes
    //        too much storage space - will change in the future.
    Float_t fExtractedSignalHiGain;      // mean value of the extracted signal
    Float_t fExtractedSignalHiGainError; // error of the mean value of the extracted signal
    Float_t fExtractedSignalLoGain;      // mean value of the extracted signal
    Float_t fExtractedSignalLoGainError; // error of the mean value of the extracted signal

    Bool_t fIsLoGainUsed;
    Byte_t fNumHiGainSaturated;
    Byte_t fNumLoGainSaturated;

    // FIXME: Will be removed. Must be stored in MArrivalTime
    Float_t fMeanArrivalTime;
    Float_t fWidthArrivalTime;
    Float_t fTailArrivalTime;

public:

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

    void Clear(Option_t *o="");

    // Setter
    void SetExtractedSignal(Float_t sig, Float_t sigerr)   
    {
        fExtractedSignalHiGain = sig; fExtractedSignalHiGainError = sigerr;
    }

    void SetExtractedSignal(Float_t sighi, Float_t sighierr,Float_t siglo, Float_t sigloerr)   
    {
        fExtractedSignalHiGain = sighi;
        fExtractedSignalHiGainError = sighierr;
        fExtractedSignalLoGain = siglo;
        fExtractedSignalLoGainError = sigloerr;
    }

    void SetGainSaturation(Bool_t sat, Byte_t higain, Byte_t logain) 
    {
        fIsLoGainUsed = sat; fNumHiGainSaturated = higain; fNumLoGainSaturated = logain;
    }

    void SetArrivalTimes(Float_t mean, Float_t width, Float_t tail) 
    {
        fMeanArrivalTime = mean; fWidthArrivalTime = width; fTailArrivalTime = tail;
    }

    // Getter
    Float_t GetExtractedSignalHiGain()      const { return fExtractedSignalHiGain; }
    Float_t GetExtractedSignalHiGainError() const { return fExtractedSignalHiGainError; }

    Float_t GetExtractedSignalLoGain()      const { return fExtractedSignalLoGain; }
    Float_t GetExtractedSignalLoGainError() const { return fExtractedSignalLoGainError; }

    Float_t GetMeanArrivalTime()            const { return fMeanArrivalTime; }
    Float_t GetWidthArrivalTime()           const { return fWidthArrivalTime; }
    Float_t GetTailArrivalTime()            const { return fTailArrivalTime; }


    Bool_t IsLoGainUsed() const { return fIsLoGainUsed; }
    Bool_t IsValid() const      { return fExtractedSignalHiGain >= 0. || fExtractedSignalHiGainError >= 0.; }

    void PrintOut();

    ClassDef(MExtractedSignalPix, 0)	// Storage Container for Extracted Signal information of one pixel
};

#endif

