/** CbmTofFlibData.h ** @author Pierre-Alain Loizeau ** @date 04.05.2015 **/ /** @class CbmTofFlibData ** @brief Prototype class of TOF data unit ** @brief Data level: MicroSlice- FLES Input ** @version 1.0 ** ** The information is encoded into 1*8 bytes (1 Long64_t). ** Unique Address: 21 bits following electronics addressing scheme ** Fine Time [FT Digi Bin]: 7 bits with Bin Size defined as constant in this file ** Coarse Time [CT Digi Bin]: 26 bits with Bin Size defined as constant in this file ** Tot [Tot Digi Bin]: 10 bits with Bin Size defined as constant in this file ** ** In raw data mode, the time is relative to the last epoch. ** In pre-processed data mode (default), the time is relative to the beginning of the MicroSlice. **/ #ifndef TOFDATA_H #define TOFDATA_H 1 // c/c++ headers #include // to get fix bit width types class CbmTofFlibData { public: /** ** @brief Default constructor. **/ CbmTofFlibData(); /** ** @brief Constructor with assignment. ** @param[in] address Unique channel address. ** @param[in] time Absolute time [ps]. ** @param[in] tot Time Over Threshold [ps]. **/ CbmTofFlibData( unsigned address, double time, double tot ); /** ** @brief Constructor with assignment. ** @param[in] address Unique channel address. ** @param[in] time Absolute time [bins]. ** @param[in] tot Time Over Threshold [bins]. **/ CbmTofFlibData( unsigned address, int time, int tot ); /** ** @brief Constructor with assignment. ** @param[in] address Unique channel address. ** @param[in] coarse time Coarse time [bins]. ** @param[in] fine time Fine time [bins]. ** @param[in] tot Time Over Threshold [bins]. **/ CbmTofFlibData( unsigned address, int coarsetime, int finetime, int tot ); /** ** @brief Copy constructor. **/ CbmTofFlibData(const CbmTofFlibData&); /** ** @brief Destructor. **/ ~CbmTofFlibData(); /** Accessors **/ /** ** @brief Return address field. **/ unsigned GetAddress() const { return ( (flData >> fgkiAddressOffs) & fgklAddrMask ); }; /** ** @brief Return full time in ns. **/ double GetTime() const { return fgkdTimeBinSize * ( (flData >> fgkiTimeOffs) & fgklTimeMask ) / 1e3; }; /** ** @brief Return full time in Bins. **/ int GetTimeBin() const { return ( (flData >> fgkiTimeOffs) & fgklTimeMask ); }; /** ** @brief Return coarse time in coarse Bins. **/ int GetCoarseTime() const { return ( (flData >> fgkiCoarseTimeOffs) & fgklCoarseTimeMask ); }; /** ** @brief Return fine time in fine Bins. **/ int GetFineTime() const { return ( (flData >> fgkiFineTimeOffs) & fgklFineTimeMask ); }; /** ** @brief Return Time over threshold in ps. **/ double GetTot() const { return fgkdTotBinSize * ( (flData >> fgkiTotOffs) & fgkiTotOffs ); }; /** ** @brief Return Time over threshold in Bins. **/ int GetTotBin() const { return ( (flData >> fgkiTotOffs) & fgkiTotOffs ); }; /** ** @brief Full data access. **/ uint64_t GetData() const { return flData; }; /** ** @brief Sorting using the time, assumes Data are in same reference frame (e.g. same epoch). **/ bool operator <( const CbmTofFlibData& rhs) const; int Compare( const CbmTofFlibData* obj) const; /** Modifiers **/ void SetAddress( unsigned address); void SetTime( double time); void SetTime( int time); void SetCoarseTime( int coarsetime); void SetFineTime( int finetime); void SetTot( double tot); void SetTot( int tot); private: uint64_t flData; ///< Fully compressed data // ----- Bit fields sizes -------------------------------------------------- static const int fgkiAddressSize = 21; static const int fgkiTimeSize; // Assigned to fgkiCoarseTimeSize+fgkiFineTimeSize static const int fgkiFineTimeSize = 7; static const int fgkiCoarseTimeSize = 26; static const int fgkiTotSize = 10; // ----------------------------------------------------------------------------- // ----- Bit masks ----------------------------------------------------------- static const uint64_t fgklAddrMask; static const uint64_t fgklTimeMask; static const uint64_t fgklFineTimeMask; static const uint64_t fgklCoarseTimeMask; static const uint64_t fgklTotMask; // ----------------------------------------------------------------------------- // ----- Bit shifts -------------------------------------------------------- static const int fgkiAddressOffs; static const int fgkiTimeOffs; static const int fgkiFineTimeOffs; static const int fgkiCoarseTimeOffs; static const int fgkiTotOffs; // ----------------------------------------------------------------------------- static const double fgkdTimeBinSize; // [ps] => 41 943.40 ns ( > GET4 epoch, > trigger window) static const double fgkdTotBinSize; // [ps] => 0-51.200 range }; #endif // TOFDATA_H