/** CbmStsFlibData.h ** @author Pierre-Alain Loizeau ** @date 04.05.2015 **/ /** @class CbmStsFlibData ** @brief Prototype class of STS data unit ** @brief Data level: MicroSlice- FLES Input ** @version 1.0 ** ** The information is encoded into 1*8 bytes (1 uint64_t). ** Unique Address: 21 bits following electronics addressing scheme ** TimeStamp [T Bin]: 33 bits with Bin Size defined as constant in this file ** ADC [ADC 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 STSDATA_H #define STSDATA_H 1 // c/c++ headers #include // to get fix bit width types class CbmStsFlibData { public: /** ** @brief Default constructor. **/ CbmStsFlibData(); /** ** @brief Constructor with assignment. ** @param[in] address Unique channel address. ** @param[in] time Absolute time [ps]. ** @param[in] ADC Charge [e]. **/ CbmStsFlibData( unsigned address, double time, double adc ); /** ** @brief Constructor with assignment. ** @param[in] address Unique channel address. ** @param[in] time Absolute time [bins]. ** @param[in] ADC Charge [bins]. **/ CbmStsFlibData( unsigned address, int time, int adc ); /** ** @brief Copy constructor. **/ CbmStsFlibData(const CbmStsFlibData&); /** ** @brief Destructor. **/ ~CbmStsFlibData(); /** 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 ); }; /** ** @brief Return full time in time bins. **/ int GetTimeBin() const { return ( (flData >> fgkiTimeOffs) & fgklTimeMask ); }; /** ** @brief Return Charge in electrons. **/ double GetCharge() const { return fgkdAdcBinSize * ( (flData >> fgkiAdcOffs) & fgkiAdcOffs ); }; /** ** @brief Return Adc value in bins. **/ int GetAdc() const { return ( (flData >> fgkiAdcOffs) & fgkiAdcOffs ); }; /** ** @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 CbmStsFlibData& rhs) const; int Compare( const CbmStsFlibData* obj) const; /** Modifiers **/ void SetAddress( unsigned address); void SetTime( double time); void SetTime( int time); void SetCharge( double charge); void SetAdc( int adc); private: uint64_t flData; ///< Fully compressed data // ----- Bit fields sizes -------------------------------------------------- static const int fgkiAddressSize = 21; static const int fgkiTimeSize = 33; static const int fgkiAdcSize = 10; // ----------------------------------------------------------------------------- // ----- Bit masks ----------------------------------------------------------- static const uint64_t fgklAddrMask; static const uint64_t fgklTimeMask; static const uint64_t fgklAdcMask; // ----------------------------------------------------------------------------- // ----- Bit shifts -------------------------------------------------------- static const int fgkiAddressOffs; static const int fgkiTimeOffs; static const int fgkiAdcOffs; // ----------------------------------------------------------------------------- static const double fgkdTimeBinSize; // [ns] => ???? ns static const double fgkdAdcBinSize; // [e-] => 0-???? range }; #endif // STSDATA_H