////////////////////////////////////////////////////////////////////////
/// \class RAT::DQRunProc
///
/// \brief   Data quality run processor
///
/// \author Ashley R. Back <a.r.back@qmul.ac.uk>
///
/// REVISION HISTORY:\n
///   2014-11-28 : a.r.back@qmul.ac.uk - Added average Nhit calculation
///                                      plus general tidying up for FTB
//    2017-02-07 : ms711@sussex.ac.uk - Bug fixes changing the clockCounts to
//                                      unsigned longs and the universal times to
//                                      unsigned ints
///
/// \details Similar to first pass run selection on SNO. Carries out\n
/// some basic run-level checks such as run type, correct active\n
/// triggers and correct run length.
///
////////////////////////////////////////////////////////////////////////

#ifndef __RAT_DQRunProc__
#define __RAT_DQRunProc__

#include <RAT/Processor.hh>
#include <RAT/DataQualityProc.hh>
#include <RAT/DB.hh>
#include <RAT/DBLink.hh>

class TH1D;

namespace RAT
{
  namespace DS
  {
    class Run;
    class Entry;
    class EV;
  }
}

namespace RAT
{

  class DQRunProc : public DataQualityProc
  {
  public:

    DQRunProc();

    virtual ~DQRunProc();

    virtual void BeginOfRun( DS::Run& run );

    virtual Processor::Result DSEvent( DS::Run& run, DS::Entry& ds );

    /// For each bit in trigType mask, checks against criteria. Match with criteria returns true
    virtual bool CheckTrigBit( const int trigger,
                               const int criteria,
                               const int bit,
                               int &failedBits ) const;

    virtual void EndOfRun( DS::Run& run );

  protected:
    virtual Processor::Result Event( DS::Entry& ds, DS::EV& ev );

    DBLinkPtr fDQChecks; ///<link to RATDB "DQCHECKS" table

    int fMCFlagCriteria;
    int fTrigCheckCriteria;
    double fTrigCheckThresh;
    unsigned int fMinRunLength;

    unsigned long int fFailedTrigCheckCount;

    unsigned int fFirstEventTime;
    unsigned int fLastEventTime;
    unsigned long fFirstEventCount10;
    unsigned long fLastEventCount10;
    unsigned long fFirstEventCount50;
    unsigned long fLastEventCount50;

    bool firstEventTimeSet;

    std::vector<int> fEventTimes;
    std::vector<int> fEventCount10s;
    std::vector<int> fEventCount50s;

    TH1D* fEventTimeHist;
    TH1D* fEventCount10Hist;
    TH1D* fEventCount50Hist;

    unsigned long int fNhitCount; ///<sums the NHits for every event in the run

  };

}// namespace RAT

#endif // DQRunProc