#ifndef MARS_MFTriggerPattern
#define MARS_MFTriggerPattern

#ifndef MARS_MFilter
#include "MFilter.h"
#endif

class MTriggerPattern;

class MFTriggerPattern : public MFilter
{
public:
    enum Prescale_t {
        kUnPrescaled,
        kPrescaled
    };

private:
  MTriggerPattern *fPattern;        //!
  
  Byte_t fMaskRequiredPrescaled;    // Mask for filtering Trigger Pattern allowed
  Byte_t fMaskRequiredUnprescaled;  // Mask for filtering Trigger Pattern allowed
  Byte_t fMaskDeniedPrescaled;      // Mask for filtering Trigger Pattern denied
  Byte_t fMaskDeniedUnprescaled;    // Mask for filtering Trigger Pattern denied
  
  Bool_t fResult;                   //!
  
  Int_t PreProcess(MParList *pList);
  Int_t Process();
  
  Bool_t IsExpressionTrue() const;
  
public:
  MFTriggerPattern(const char *name=NULL, const char *title=NULL);
  MFTriggerPattern(MFTriggerPattern &trigpatt);
    
  void RequireTriggerLvl1(Prescale_t prescaled=kUnPrescaled);
  void RequireTriggerLvl2(Prescale_t prescaled=kUnPrescaled);
  void RequireCalibration(Prescale_t prescaled=kUnPrescaled);
  void RequirePedestal(Prescale_t prescaled=kUnPrescaled);
  void RequirePinDiode(Prescale_t prescaled=kUnPrescaled);
  
  void DenyTriggerLvl1(Prescale_t prescaled=kUnPrescaled);
  void DenyTriggerLvl2(Prescale_t prescaled=kUnPrescaled);
  void DenyCalibration(Prescale_t prescaled=kUnPrescaled);
  void DenyPedestal(Prescale_t prescaled=kUnPrescaled);
  void DenyPinDiode(Prescale_t prescaled=kUnPrescaled);
  
  void Require(TString patt, Prescale_t prescaled=kUnPrescaled);
  void Deny(TString patt, Prescale_t prescaled=kUnPrescaled);
  
  // Low level settings. USE THESE ONLY IF YOU ARE AN EXPERT!
  void SetMaskRequired(const Byte_t mask, Prescale_t prescaled=kUnPrescaled);
  void SetMaskDenied(const Byte_t mask, Prescale_t prescaled=kUnPrescaled);
  
  ClassDef(MFTriggerPattern, 1) // A Filter for the Trigger Pattern
};
    
#endif
