ROOT logo
#ifndef HTRB3TDCITERATOR_H
#define HTRB3TDCITERATOR_H

#include "htrb3tdcmessage.h"

class HTrb3TdcIterator {
   protected:

      enum { DummyEpoch = 0xffffffff };

      UInt_t*  fBuf;        //! pointer on raw data
      UInt_t   fBuflen;     //! length of raw data
      Bool_t       fSwapped;    //! true if raw data are swapped

      HTrb3TdcMessage  fMsg;  //! current message
      UInt_t  fCurEpoch;    //! current epoch

      // base::LocalStampConverter  fConv;   //! use to covert time stamps in seconds

   public:

      HTrb3TdcIterator() :
         fBuf(0),
         fBuflen(0),
         fSwapped(false),
         fMsg(),
         fCurEpoch(DummyEpoch)
         //fConv()
      {
         // we have 11 bits for coarse stamp and 32 bits for epoch
         // each bin is 5 ns
         // fConv.SetTimeSystem(11+32, HTrb3TdcMessage::coarseUnit());
      }

      void assign(UInt_t* buf, UInt_t len, Bool_t swapped = true)
      {
         fBuf = buf;
         fBuflen = len;
         fSwapped = swapped;
         fMsg.assign(0);

         if (fBuflen == 0) fBuf = 0;
         fCurEpoch = DummyEpoch;
      }

//      void assign(hadaq::RawSubevent* subev, UInt_t indx, UInt_t datalen)
//      {
//         if (subev!=0)
//            assign(subev->GetDataPtr(indx), datalen, subev->IsSwapped());
//      }

      /** One should call method to set current reference epoch */
      void setRefEpoch(UInt_t epoch)
      {
         //fConv.MoveRef(((uint64_t) epoch) << 11);
      }

      Bool_t next()
      {
         if (fBuf==0) return kFALSE;

         if (fSwapped)
            fMsg.assign((((UChar_t *) fBuf)[0] << 24) | (((UChar_t *) fBuf)[1] << 16) | (((UChar_t *) fBuf)[2] << 8) | (((UChar_t *) fBuf)[3]));
         else
            fMsg.assign(*fBuf);

         if (fMsg.isEpochMsg()) fCurEpoch = fMsg.getEpochValue();

         fBuf++;
         if (--fBuflen == 0) fBuf = 0;

         return kTRUE;
      }

      /** Returns 39-bit value, which combines epoch and coarse counter.
       * Time bin is 5 ns  */
      uint64_t getMsgStamp() const
      { return (isCurEpoch() ? ((uint64_t) fCurEpoch) << 11 : 0) | (fMsg.isHitMsg() ? fMsg.getHitTmCoarse() : 0); }

      inline Double_t getMsgTimeCoarse() const
      { return getMsgStamp() * HTrb3TdcMessage::coarseUnit();  /*fConv.ToSeconds(getMsgStamp()) */; }

      inline Double_t getMsgTimeFine() const
      { return fMsg.isHitMsg() ? HTrb3TdcMessage::simpleFineCalibr(fMsg.getHitTmFine()) : 0.; }

      HTrb3TdcMessage& msg() { return fMsg; }

      /** Returns true, if current epoch was assigned */
      Bool_t isCurEpoch() const { return fCurEpoch != DummyEpoch; }

      /** Clear current epoch value */
      void clearCurEpoch() { fCurEpoch = DummyEpoch; }

      /** Return value of current epoch */
      UInt_t getCurEpoch() const { return fCurEpoch; }

      void printmsg()
      {
         Double_t tm = -1.;
         if (msg().isHitMsg() || msg().isEpochMsg())
            tm = getMsgTimeCoarse() - getMsgTimeFine();
         msg().print(tm);
      }

//   ClassDef(HTrb3TdcIterator,0);
};

#endif
 htrb3tdciterator.h:1
 htrb3tdciterator.h:2
 htrb3tdciterator.h:3
 htrb3tdciterator.h:4
 htrb3tdciterator.h:5
 htrb3tdciterator.h:6
 htrb3tdciterator.h:7
 htrb3tdciterator.h:8
 htrb3tdciterator.h:9
 htrb3tdciterator.h:10
 htrb3tdciterator.h:11
 htrb3tdciterator.h:12
 htrb3tdciterator.h:13
 htrb3tdciterator.h:14
 htrb3tdciterator.h:15
 htrb3tdciterator.h:16
 htrb3tdciterator.h:17
 htrb3tdciterator.h:18
 htrb3tdciterator.h:19
 htrb3tdciterator.h:20
 htrb3tdciterator.h:21
 htrb3tdciterator.h:22
 htrb3tdciterator.h:23
 htrb3tdciterator.h:24
 htrb3tdciterator.h:25
 htrb3tdciterator.h:26
 htrb3tdciterator.h:27
 htrb3tdciterator.h:28
 htrb3tdciterator.h:29
 htrb3tdciterator.h:30
 htrb3tdciterator.h:31
 htrb3tdciterator.h:32
 htrb3tdciterator.h:33
 htrb3tdciterator.h:34
 htrb3tdciterator.h:35
 htrb3tdciterator.h:36
 htrb3tdciterator.h:37
 htrb3tdciterator.h:38
 htrb3tdciterator.h:39
 htrb3tdciterator.h:40
 htrb3tdciterator.h:41
 htrb3tdciterator.h:42
 htrb3tdciterator.h:43
 htrb3tdciterator.h:44
 htrb3tdciterator.h:45
 htrb3tdciterator.h:46
 htrb3tdciterator.h:47
 htrb3tdciterator.h:48
 htrb3tdciterator.h:49
 htrb3tdciterator.h:50
 htrb3tdciterator.h:51
 htrb3tdciterator.h:52
 htrb3tdciterator.h:53
 htrb3tdciterator.h:54
 htrb3tdciterator.h:55
 htrb3tdciterator.h:56
 htrb3tdciterator.h:57
 htrb3tdciterator.h:58
 htrb3tdciterator.h:59
 htrb3tdciterator.h:60
 htrb3tdciterator.h:61
 htrb3tdciterator.h:62
 htrb3tdciterator.h:63
 htrb3tdciterator.h:64
 htrb3tdciterator.h:65
 htrb3tdciterator.h:66
 htrb3tdciterator.h:67
 htrb3tdciterator.h:68
 htrb3tdciterator.h:69
 htrb3tdciterator.h:70
 htrb3tdciterator.h:71
 htrb3tdciterator.h:72
 htrb3tdciterator.h:73
 htrb3tdciterator.h:74
 htrb3tdciterator.h:75
 htrb3tdciterator.h:76
 htrb3tdciterator.h:77
 htrb3tdciterator.h:78
 htrb3tdciterator.h:79
 htrb3tdciterator.h:80
 htrb3tdciterator.h:81
 htrb3tdciterator.h:82
 htrb3tdciterator.h:83
 htrb3tdciterator.h:84
 htrb3tdciterator.h:85
 htrb3tdciterator.h:86
 htrb3tdciterator.h:87
 htrb3tdciterator.h:88
 htrb3tdciterator.h:89
 htrb3tdciterator.h:90
 htrb3tdciterator.h:91
 htrb3tdciterator.h:92
 htrb3tdciterator.h:93
 htrb3tdciterator.h:94
 htrb3tdciterator.h:95
 htrb3tdciterator.h:96
 htrb3tdciterator.h:97
 htrb3tdciterator.h:98
 htrb3tdciterator.h:99
 htrb3tdciterator.h:100
 htrb3tdciterator.h:101
 htrb3tdciterator.h:102
 htrb3tdciterator.h:103
 htrb3tdciterator.h:104
 htrb3tdciterator.h:105
 htrb3tdciterator.h:106
 htrb3tdciterator.h:107
 htrb3tdciterator.h:108