/** CbmStsDigi.h **@author V.Friese **@since 28.08.2006 **@version 2.0 ** ** Data class for digital STS information ** Data level: RAW ** ** The information is encoded into 8 bytes (1 Long64_t). ** Address: 25 bits ** - Station Nr. 4 bits ** - Sector Nr. 10 bits ** - Side (front/back) 1 bit ** - Channel Nr. 10 bits ** Charge (ADC): 12 bits ** Time (ns): 14 bits ** ** The time is relative to the event time. **/ #ifndef CBMSTSDIGI_H #define CBMSTSDIGI_H 1 #include "CbmDetectorList.h" #include "CbmStsDetectorId.h" #include "FairMultiLinkedData.h" #include "FairTimeStamp.h" #include class CbmStsDigi : public CbmStsDetectorId, public FairTimeStamp { public: /** Default constructor **/ CbmStsDigi(); /** Constructor from station number, sector number, ** front/back side and channel number **@param station station number (1 - 15) **@param sector sector number (1 - 1023) **@param side 0=front side; 1=back side **@param channel channel number (1 - 1023) **@param adc Charge ADC channel (0 - 4095) **@param time Time within event [ns] **/ // CbmStsDigi(std::vector index, Int_t station, Int_t sector, Int_t side, // Int_t channel, Int_t adc, Int_t time); CbmStsDigi(Int_t station, Int_t sector, Int_t side, Int_t channel, Int_t adc, Int_t time); /** Destructor **/ virtual ~CbmStsDigi(); /** Add charge **/ void AddAdc(Int_t adc); // void AddIndex(int index, int adc){ // AddLink(FairLink(kStsPoint, index, adc)); // } // void AddIndex(std::vector index){ // SetLinks(FairMultiLinkedData(kStsPoint, index)); // } /** Maximal number of ADC bits **/ static Int_t GetNofAdcBits() { return fgkCharBits; } /** Station number **/ Int_t GetStationNr() const { return StationNr(GetDetectorId()); } /** Sector number **/ Int_t GetSectorNr() const { return SectorNr(GetDetectorId()); } /** Side ( 0 = front, 1 = back ) **/ Int_t GetSide() const { return Side(GetDetectorId()); } /** Channel number **/ Int_t GetChannelNr() const { return ChannelNr(GetDetectorId()); } /** Charge **/ Int_t GetAdc() const { return ( (fData >> fgkCharShift) & fgkCharMask ); } /** Maximum ADC **/ static Int_t GetMaxAdc() { return ( (1 << fgkCharBits) - 1 ); } /** Time **/ Int_t GetTime() const { return ( (fData >> fgkTimeShift) & fgkTimeMask ); } /** Unique detector ID **/ Int_t GetDetectorId() const { return ( kSTS | ( (fData & fgkAddrMask) << 4) ); } virtual bool equal(FairTimeStamp* data) { CbmStsDigi* myDigi = dynamic_cast (data); if (myDigi != 0) { if (StationNr(GetDetectorId()) == myDigi->GetStationNr()) if (SectorNr(GetDetectorId())== myDigi->GetSectorNr()) if (ChannelNr(GetDetectorId())== myDigi->GetChannelNr()) if (Side(GetDetectorId())== myDigi->GetSide()) { return true; } } return false; } virtual bool operator<(const CbmStsDigi& myDigi) const { if (StationNr(GetDetectorId()) < myDigi.GetStationNr()) { return true; } else if (StationNr(GetDetectorId()) > myDigi.GetStationNr()) { return false; } if (SectorNr(GetDetectorId())< myDigi.GetSectorNr()) { return true; } else if (SectorNr(GetDetectorId())> myDigi.GetSectorNr()) { return false; } if (Side(GetDetectorId())< myDigi.GetSide()) { return true; } else if (Side(GetDetectorId())>myDigi.GetSide()) { return false; } if (ChannelNr(GetDetectorId())< myDigi.GetChannelNr()) { return true; } else if (ChannelNr(GetDetectorId())> myDigi.GetChannelNr()) { return false; } return false; } friend std::ostream& operator<<(std::ostream& out, CbmStsDigi& digi) { out << "CbmStsDigi at:" << " (" << digi.GetStationNr() << "/" << digi.GetSectorNr() << "/" << digi. GetSide() << ") " << " with TimeStamp: " << digi.GetTimeStamp() << std::endl; return out; } private: /** Data members **/ Long64_t fData; /** Modifiers **/ void SetAdc(Int_t charge); /** Static members for bit operations **/ static const Int_t fgkAddrBits; static const Int_t fgkCharBits; static const Int_t fgkTimeBits; static const Int_t fgkCharShift; static const Int_t fgkTimeShift; static const Long64_t fgkAddrMask; static const Long64_t fgkCharMask; static const Long64_t fgkTimeMask; ClassDef(CbmStsDigi,2); }; #endif