Skip to content
Snippets Groups Projects
THcTimeSyncEvtHandler.h 3.1 KiB
Newer Older
#ifndef THcTimeSyncEvtHandler_
#define THcTimeSyncEvtHandler_

/////////////////////////////////////////////////////////////////////
//
//   THcTimeSyncEvtHandler
//
/////////////////////////////////////////////////////////////////////

#include "THaEvtTypeHandler.h"
#include "Decoder.h"
#include <string>
#include <vector>
#include <map>

//class THaRunBase;
//class THaEvData;

class THcTimeSyncEvtHandler : public THaEvtTypeHandler {

public:

  THcTimeSyncEvtHandler(const char* name, const char* description);
  virtual ~THcTimeSyncEvtHandler();

  virtual Int_t Analyze(THaEvData *evdata);
  virtual EStatus Init( const TDatime& run_time);
  virtual void PrintStats();
  virtual void SetExpectedOffset(Int_t roc, Int_t offset);
  virtual void AddExpectedOffset(Int_t roc, Int_t offset);
  virtual Int_t End( THaRunBase* r=0 );
  virtual Int_t SetRewriteFile(const char *filename);
  virtual void SetBadROC(Int_t roc) {fBadROC = roc;}
  virtual void SetResync(Bool_t b) {fResync = b;}
  virtual void SetBadSyncSizeTrigger(Int_t sizetrigger) {fBadSyncSizeTrigger = sizetrigger;}
  virtual Int_t AllTdcsPresent(UInt_t *bank);
private:

  virtual void InitStats();
  virtual void AccumulateStats(Bool_t sync);

  Bool_t fFirstTime;
  Int_t fMasterRoc; // ROC with the TI master
  Int_t fNEvents;   // Number of events analyzed
  Int_t fSlippage;
  UInt_t fLastEvent[32000];
  UInt_t fSlippingBank[32000];
  Bool_t fWriteDelayed;
  Int_t fDumpNew;
  Int_t fBadROC;		// ROC to check and filter sync problems
  Bool_t fResync;		// If true, stop correcting events on sync
  Int_t fBadSyncSizeTrigger;
  Bool_t fLastEventWasSync;	// True when last event was sync event
  Bool_t fFirstTdcCheck;
  UInt_t fTdcMask;		  // Bit Pattern of TDC in ROC being checked

  Decoder::THaCodaFile* fCodaOut; // The CODA output file
  Int_t handle;

  typedef struct RocTimes {
    Bool_t has_ti_ttime;
    UInt_t ti_ttime;
    UInt_t ti_evcount;
    std::map<Int_t, UInt_t> fadcTimesMap;
    std::map<Int_t, UInt_t> ftdcEvCountMap;
    RocTimes() : has_ti_ttime(kFALSE) {
      fadcTimesMap.clear();
      ftdcEvCountMap.clear();
    }
  } RocTimes_t;

  typedef struct RocStats {
    Int_t ti_ttime_offset;
    Int_t ti_earlyslipcount;
    Int_t ti_lateslipcount;
    Int_t fadc_expected_offset;
    std::map<Int_t, Int_t> fadcOffsetMap;
    std::map<Int_t, Int_t> fadcEarlySlipCountMap;
    std::map<Int_t, Int_t> fadcLateSlipCountMap;
    std::map<Int_t, Int_t> ftdcEvCountWrongMap;
    std::map<Int_t, Int_t> ftdcEvCountOffsetMap;
    RocStats() : ti_ttime_offset(0), ti_earlyslipcount(0), ti_lateslipcount(0),
      fadc_expected_offset(0)
    {
      fadcOffsetMap.clear();
      fadcEarlySlipCountMap.clear();
      fadcLateSlipCountMap.clear();
      ftdcEvCountWrongMap.clear();
      ftdcEvCountOffsetMap.clear();
    }
  } RocStats_t;

  std::map<Int_t, RocTimes_t *> CrateTimeMap;
  std::map<Int_t, RocStats_t *> CrateStatsMap;
  std::map<Int_t, Int_t> ExpectedOffsetMap;

  THcTimeSyncEvtHandler(const THcTimeSyncEvtHandler& fh);
  THcTimeSyncEvtHandler& operator=(const THcTimeSyncEvtHandler& fh);

  ClassDef(THcTimeSyncEvtHandler,0)  // Hall C event type 125

};

#endif