// TODO comment to be changed /** CbmMuchBeamTimeDigi.cxx **@author M.Ryzhinskiy **@since 19.03.07 **@version 1.0 ** ** Data class for digital MUCH information ** Data level: RAW ** ** **/ #include "CbmMuchBeamTimeDigi.h" #include "CbmMuchAddress.h" #include "CbmMuchDigiMatch.h" #include // ------------------------------------------------------------------------- const Int_t CbmMuchBeamTimeDigi::fgkCharBits = 12; const Int_t CbmMuchBeamTimeDigi::fgkTimeBits = 14; const Int_t CbmMuchBeamTimeDigi::fgkAddrBits = 32; // ------------------------------------------------------------------------- // ----- Bit shift for charge and time stamp --------------------------- const Int_t CbmMuchBeamTimeDigi::fgkAddrShift = 0; const Int_t CbmMuchBeamTimeDigi::fgkCharShift = CbmMuchBeamTimeDigi::fgkAddrShift + CbmMuchBeamTimeDigi::fgkAddrBits; const Int_t CbmMuchBeamTimeDigi::fgkTimeShift = CbmMuchBeamTimeDigi::fgkCharShift + CbmMuchBeamTimeDigi::fgkCharBits; // ------------------------------------------------------------------------- // ----- Bit masks for charge and time stamp --------------------------- const Long64_t CbmMuchBeamTimeDigi::fgkAddrMask = (1LL << CbmMuchBeamTimeDigi::fgkAddrBits) - 1; const Long64_t CbmMuchBeamTimeDigi::fgkCharMask = (1LL << CbmMuchBeamTimeDigi::fgkCharBits) - 1; const Long64_t CbmMuchBeamTimeDigi::fgkTimeMask = (1LL << CbmMuchBeamTimeDigi::fgkTimeBits) - 1; // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- CbmMuchBeamTimeDigi::CbmMuchBeamTimeDigi() : CbmDigi(), fData(0), fTime(0), fMatch(0) { } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- CbmMuchBeamTimeDigi::CbmMuchBeamTimeDigi(Int_t address, Int_t charge, ULong_t time) : CbmDigi(), fData(0), fTime(time), fMatch(0) { fData |= (address & fgkAddrMask) << fgkAddrShift; fData |= (charge & fgkCharMask) << fgkCharShift; fData |= (time & fgkTimeMask) << fgkTimeShift; } // ------------------------------------------------------------------------- CbmMuchBeamTimeDigi::CbmMuchBeamTimeDigi(CbmMuchBeamTimeDigi* digi) : CbmDigi(*digi), fData(digi->fData), fTime(digi->fTime), fMatch(0) { } CbmMuchBeamTimeDigi::CbmMuchBeamTimeDigi(CbmMuchBeamTimeDigi* digi,CbmMuchDigiMatch* match) : CbmDigi(*digi), fData(digi->fData), fTime(digi->fTime), fMatch(new CbmMuchDigiMatch(match)) { } CbmMuchBeamTimeDigi::CbmMuchBeamTimeDigi(const CbmMuchBeamTimeDigi& rhs) : CbmDigi(rhs), fData(rhs.fData), fTime(rhs.fTime), fMatch(NULL) { if (NULL != rhs.fMatch) { fMatch = new CbmMuchDigiMatch(*(rhs.fMatch)); } } CbmMuchBeamTimeDigi& CbmMuchBeamTimeDigi::operator=(const CbmMuchBeamTimeDigi& rhs) { if (this != &rhs) { CbmDigi::operator=(rhs); fData = rhs.fData; fTime = rhs.fTime; if (NULL != rhs.fMatch) { std::auto_ptr tmp(new CbmMuchDigiMatch(*rhs.fMatch)); delete fMatch; fMatch = tmp.release(); } else { fMatch = NULL; } } return *this; } // ----- Add charge ---------------------------------------------------- void CbmMuchBeamTimeDigi::AddAdc(Int_t adc) { Int_t newAdc = GetAdc() + adc; if (newAdc > fgkCharMask) newAdc = fgkCharMask; SetAdc(newAdc); } // ------------------------------------------------------------------------- // ----- Set new charge ------------------------------------------------ void CbmMuchBeamTimeDigi::SetAdc(Int_t adc) { // reset to 0 fData &= ~(fgkCharMask << fgkCharShift); // set new value fData |= (adc & fgkCharMask) << fgkCharShift; } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- void CbmMuchBeamTimeDigi::SetTime(ULong_t time) { // reset to 0 fData &= ~(fgkTimeMask << fgkTimeShift); // set new value fData |= (time & fgkTimeMask) << fgkTimeShift; fTime = time; } // ------------------------------------------------------------------------- ClassImp(CbmMuchBeamTimeDigi)