/** @file CbmStsFlibData.cxx ** @author Pierre-Alain Loizeau ** @date 05.05.2015 ** ** Code for Prototype class of STS data unit **/ #include "CbmStsFlibData.h" // ROOT Headers #include "TString.h" // It seems C++ standard force the initialization to be in cxx/cpp file (outside of class definition) // When not trivial constant values => To check if it should apply also to simple values maybe? const double CbmStsFlibData::fgkdTimeBinSize = 3.125; // [ns] => Clock cycle! const double CbmStsFlibData::fgkdAdcBinSize = 50.0; // [e-] => Probably FEE dependent // ----- Bit masks ----------------------------------------------------------- const uint64_t CbmStsFlibData::fgklAddrMask = (static_cast(1) << CbmStsFlibData::fgkiAddressSize) - 1; const uint64_t CbmStsFlibData::fgklTimeMask = (static_cast(1) << CbmStsFlibData::fgkiTimeSize) - 1; const uint64_t CbmStsFlibData::fgklAdcMask = (static_cast(1) << CbmStsFlibData::fgkiAdcSize) - 1; // ----------------------------------------------------------------------------- // ----- Bit shifts -------------------------------------------------------- const int CbmStsFlibData::fgkiAddressOffs = 0; const int CbmStsFlibData::fgkiTimeOffs = CbmStsFlibData::fgkiAddressOffs + CbmStsFlibData::fgkiAddressSize; const int CbmStsFlibData::fgkiAdcOffs = CbmStsFlibData::fgkiTimeOffs + CbmStsFlibData::fgkiTimeSize; // ----------------------------------------------------------------------------- CbmStsFlibData::CbmStsFlibData() : flData(0) { } CbmStsFlibData::CbmStsFlibData( unsigned address, double time, double charge) : flData(0) { SetAddress( address ); SetTime( time); SetCharge( charge); } CbmStsFlibData::CbmStsFlibData( unsigned address, int time, int adc) : flData(0) { SetAddress( address ); SetTime( time); SetAdc( adc); } CbmStsFlibData::CbmStsFlibData(const CbmStsFlibData& digiIn) : flData(digiIn.flData) { // flData = digiIn.GetData(); ///< Fully compressed data } CbmStsFlibData::~CbmStsFlibData() { } void CbmStsFlibData::SetAddress( unsigned address) { // First set old address to zero flData = flData & ~(fgklAddrMask << fgkiAddressOffs); // Now set new address flData = flData | ( (address & fgklAddrMask) << fgkiAddressOffs ); }; void CbmStsFlibData::SetTime(double time) { int iBinnedTime = static_cast( time / fgkdTimeBinSize ); // First set old time to zero flData = flData & ~(fgklTimeMask << fgkiTimeOffs); // Now set new time flData = flData | ( (iBinnedTime & fgklTimeMask) << fgkiTimeOffs ); }; void CbmStsFlibData::SetTime(int time) { // First set old time to zero flData = flData & ~(fgklTimeMask << fgkiTimeOffs); // Now set new time flData = flData | ( (time & fgklTimeMask) << fgkiTimeOffs ); }; void CbmStsFlibData::SetCharge(double charge) { int iBinnedAdc = static_cast( charge / fgkdAdcBinSize ); // First set old adc to zero flData = flData & ~(fgklAdcMask << fgkiAdcOffs); // Now set new adc flData = flData | ( (iBinnedAdc & fgklAdcMask) << fgkiAdcOffs ); }; void CbmStsFlibData::SetAdc(int adc) { // First set old adc to zero flData = flData & ~(fgklAdcMask << fgkiAdcOffs); // Now set new adc flData = flData | ( (adc & fgklAdcMask) << fgkiAdcOffs ); }; bool CbmStsFlibData::operator <( const CbmStsFlibData& rhs) const { return (this->GetTime() < rhs.GetTime()) ? true : false; } int CbmStsFlibData::Compare( const CbmStsFlibData* obj) const { if( this->GetTime() < obj->GetTime() ) // hit ... obj return -1; else if( this->GetTime() > obj->GetTime() ) // obj ... hit return 1; // obj = hit else return 0; }