/** CbmMvdStripsDigi.cxx **@author V.Friese **@since 28.08.2006 **@version 2.0 **/ #include "CbmMvdStripsDigi.h" // ----- Bit fields for charge and time stamp -------------------------- const Int_t CbmMvdStripsDigi::fgkCharBits = 12; // in data0 const Int_t CbmMvdStripsDigi::fgkTimeBits = 14; // in data1 const Int_t CbmMvdStripsDigi::fgkAddrBits = CbmMvdStripsDigi::fgkStatBits + CbmMvdStripsDigi::fgkSectBits + CbmMvdStripsDigi::fgkSideBits + CbmMvdStripsDigi::fgkChanBits; // ------------------------------------------------------------------------- // ----- Bit shift for charge and time stamp --------------------------- const Int_t CbmMvdStripsDigi::fgkCharShift = CbmMvdStripsDigi::fgkAddrBits; const Int_t CbmMvdStripsDigi::fgkTimeShift = CbmMvdStripsDigi::fgkCharShift + CbmMvdStripsDigi::fgkCharBits; // ------------------------------------------------------------------------- // ----- Bit masks for charge and time stamp --------------------------- const Long64_t CbmMvdStripsDigi::fgkAddrMask = (1 << CbmMvdStripsDigi::fgkAddrBits) - 1; const Long64_t CbmMvdStripsDigi::fgkCharMask = (1 << CbmMvdStripsDigi::fgkCharBits) - 1; const Long64_t CbmMvdStripsDigi::fgkTimeMask = (1 << CbmMvdStripsDigi::fgkTimeBits) - 1; // ------------------------------------------------------------------------- // ----- Default constructor ------------------------------------------- CbmMvdStripsDigi::CbmMvdStripsDigi() : fData(0) { } // ------------------------------------------------------------------------- // ----- Standard constructor ------------------------------------------ CbmMvdStripsDigi::CbmMvdStripsDigi(std::vector index, Int_t station, Int_t sector, Int_t side, Int_t channel, Int_t adc, Int_t time) { AddIndex(index); fData = ( (DetectorId(station, sector, side, channel) >> 4) & fgkAddrMask ) | ( (adc & fgkCharMask) << fgkCharShift ) | ( (time & fgkTimeMask) << fgkTimeShift ) ; } // ------------------------------------------------------------------------- CbmMvdStripsDigi::CbmMvdStripsDigi(Int_t index, Int_t station, Int_t sector, Int_t side, Int_t channel, Int_t adc, Int_t time) { AddIndex(index,adc); fData = ( (DetectorId(station, sector, side, channel) >> 4) & fgkAddrMask ) | ( (adc & fgkCharMask) << fgkCharShift ) | ( (time & fgkTimeMask) << fgkTimeShift ) ; } // ----- Destructor ---------------------------------------------------- CbmMvdStripsDigi::~CbmMvdStripsDigi() { } // ------------------------------------------------------------------------- // ----- Add charge ---------------------------------------------------- void CbmMvdStripsDigi::AddAdc(Int_t adc) { Int_t maxAdc = (1 << fgkCharBits) - 1; Int_t newAdc = GetAdc() + adc; if ( newAdc > maxAdc ) newAdc = maxAdc; SetAdc(newAdc); } // ------------------------------------------------------------------------- // ----- Set new charge ------------------------------------------------ void CbmMvdStripsDigi::SetAdc(Int_t adc) { // First set old charge to zero fData = fData & ~(fgkCharMask << fgkCharShift); // Now set new charge fData = fData | ( (adc & fgkCharMask) << fgkCharShift ); } // ------------------------------------------------------------------------- ClassImp(CbmMvdStripsDigi)