#ifndef FILLFARRUNQUALITY_H
#define FILLFARRUNQUALITY_H

#include "JobControl/JobCModule.h"

#include "TFile.h"
#include "TTree.h"
#include "TString.h"

#include "RawReadout.h"

class MomNavigator;      

class FillFarRunQuality : public JobCModule
{
public:
  FillFarRunQuality();
  ~FillFarRunQuality();
  void BeginJob();      
  JobCResult Get(MomNavigator *mom);          
  // JobCResult Ana(const MomNavigator *mom);   
  const Registry& DefaultConfig() const;
  void Config(const Registry& r);
  void HandleCommand(JobCommand* command);
  void EndJob();                           

private:

  TFile* fRunQualityFile;
  TTree* fRunQualityTree;

  TString fRunQualityFileName;
  Int_t fWriteToDatabase;
  Int_t fReadFromDatabase;
  Int_t fWriteOutResults;

  Int_t fTime;
  Int_t fRecord;
  Int_t fCounter;
  Int_t fGoodCounter;
  Int_t fHvStatus;
  Int_t fHvStatusSM1;
  Int_t fHvStatusSM2;
  Int_t fReadoutStatus;
  Int_t fTimeFrame;

  Int_t fSource;
  Int_t fRun;
  Int_t fSubRun;
  Int_t fRunType;  
  Int_t fRopMask;
  Int_t fCrateMask;
  Int_t fTriggerMask;
  Int_t fStartTime;
  Int_t fEndTime;
  Int_t fTimeFrames;
  Int_t fSnarls;
  Int_t fGoodSnarls;
  Int_t fSnarlRateMin;
  Int_t fSnarlRateMax;
  Float_t fSnarlRateMean;
  Float_t fSnarlRateMedian;
  Int_t fTriggersPlane;
  Int_t fTriggersEnergy;
  Int_t fTriggersSpill;
  Int_t fTriggersRealSpill;
  Int_t fTriggersFakeSpill;
  Int_t fPhysicsRun;
  Int_t fModifiedRun;
  Int_t fTestRun;
  Int_t fGoodRun;

  Int_t* fSnarlRates;
  Int_t* fCrateRates;

  void WriteToDatabase();
  void ReadFromDatabase();
  void WriteOutResults();
  void WriteOutFile();

  void ProcessHeader(TObject* obj);
  void ProcessBlock(TObject* obj);

  void EndSubRun();
  void WriteSubRun();

  void Reset();

  RawReadout* fRawReadout;
};

#endif
