diff --git a/core/data/sts/CbmStsAddress.cxx b/core/data/sts/CbmStsAddress.cxx index a7e55fb61077f1dbf548f511baa8e41a8899260f..81fb9c7959790c8937fc625f72bad6cd735765a1 100644 --- a/core/data/sts/CbmStsAddress.cxx +++ b/core/data/sts/CbmStsAddress.cxx @@ -20,7 +20,7 @@ namespace CbmStsAddress { // ----- Definition of address bit field ------------------------------ - const UShort_t kBits[kCurrentVersion + 1][kStsNofLevels] = { + const uint16_t kBits[kCurrentVersion + 1][kStsNofLevels] = { // Version 0 (until 23 August 2017) { @@ -49,7 +49,7 @@ namespace CbmStsAddress // ----- Bit shifts ----------------------------------------------------- - const Int_t kShift[kCurrentVersion + 1][kStsNofLevels] = { + const int32_t kShift[kCurrentVersion + 1][kStsNofLevels] = { {0, kShift[0][0] + kBits[0][0], kShift[0][1] + kBits[0][1], kShift[0][2] + kBits[0][2], kShift[0][3] + kBits[0][3], kShift[0][4] + kBits[0][4], kShift[0][5] + kBits[0][5]}, @@ -59,7 +59,7 @@ namespace CbmStsAddress // ----- Bit masks ----------------------------------------------------- - const Int_t kMask[kCurrentVersion + 1][kStsNofLevels] = { + const int32_t kMask[kCurrentVersion + 1][kStsNofLevels] = { {(1 << kBits[0][0]) - 1, (1 << kBits[0][1]) - 1, (1 << kBits[0][2]) - 1, (1 << kBits[0][3]) - 1, (1 << kBits[0][4]) - 1, (1 << kBits[0][5]) - 1, (1 << kBits[0][6]) - 1}, @@ -72,39 +72,39 @@ namespace CbmStsAddress // ----- Construct address from element Ids ------------------------------ -Int_t CbmStsAddress::GetAddress(UInt_t unit, UInt_t ladder, UInt_t halfladder, UInt_t module, UInt_t sensor, - UInt_t side, UInt_t version) +int32_t CbmStsAddress::GetAddress(uint32_t unit, uint32_t ladder, uint32_t halfladder, uint32_t module, uint32_t sensor, + uint32_t side, uint32_t version) { assert(version <= kCurrentVersion); // Catch overrun of allowed ranges - UInt_t maxUnit = (1 << kBits[version][kStsUnit]) - 1; + uint32_t maxUnit = (1 << kBits[version][kStsUnit]) - 1; if (unit > maxUnit) { LOG(error) << "Unit Id " << unit << " exceeds maximum " << maxUnit; return 0; } - UInt_t maxLadder = (1 << kBits[version][kStsLadder]) - 1; + uint32_t maxLadder = (1 << kBits[version][kStsLadder]) - 1; if (ladder > maxLadder) { LOG(error) << "Ladder Id " << ladder << " exceeds maximum " << maxLadder; return 0; } - UInt_t maxHalfLadder = (1 << kBits[version][kStsHalfLadder]) - 1; + uint32_t maxHalfLadder = (1 << kBits[version][kStsHalfLadder]) - 1; if (halfladder > maxHalfLadder) { LOG(error) << "HalfLadder Id " << halfladder << " exceeds maximum " << maxHalfLadder; return 0; } - UInt_t maxModule = (1 << kBits[version][kStsModule]) - 1; + uint32_t maxModule = (1 << kBits[version][kStsModule]) - 1; if (module > maxModule) { LOG(error) << "Module Id " << module << " exceeds maximum " << maxModule; return 0; } - UInt_t maxSensor = (1 << kBits[version][kStsSensor]) - 1; + uint32_t maxSensor = (1 << kBits[version][kStsSensor]) - 1; if (sensor > maxSensor) { LOG(error) << "Sensor Id " << sensor << " exceeds maximum " << maxSensor; return 0; } - UInt_t maxSide = (1 << kBits[version][kStsSide]) - 1; + uint32_t maxSide = (1 << kBits[version][kStsSide]) - 1; if (side > maxSide) { LOG(error) << "Side Id " << side << " exceeds maximum " << maxSide; return 0; @@ -119,14 +119,14 @@ Int_t CbmStsAddress::GetAddress(UInt_t unit, UInt_t ladder, UInt_t halfladder, U // ----- Construct address from array of element Ids ---------------------- -Int_t CbmStsAddress::GetAddress(UInt_t* elementId, UInt_t version) +int32_t CbmStsAddress::GetAddress(uint32_t* elementId, uint32_t version) { assert(version <= kCurrentVersion); - Int_t address = ToIntegralType(ECbmModuleId::kSts) << kShift[version][kStsSystem]; - for (Int_t level = 1; level < kStsNofLevels; level++) { - UInt_t maxId = (1 << kBits[version][level]) - 1; + int32_t address = ToIntegralType(ECbmModuleId::kSts) << kShift[version][kStsSystem]; + for (int32_t level = 1; level < kStsNofLevels; level++) { + uint32_t maxId = (1 << kBits[version][level]) - 1; if (elementId[level] > maxId) { LOG(error) << "Id " << elementId[level] << " for STS level " << level << " exceeds maximum " << maxId; return 0; @@ -141,12 +141,12 @@ Int_t CbmStsAddress::GetAddress(UInt_t* elementId, UInt_t version) // ----- Construct address from address of descendant element ------------ -Int_t CbmStsAddress::GetMotherAddress(Int_t address, Int_t level) +int32_t CbmStsAddress::GetMotherAddress(int32_t address, int32_t level) { assert(level >= kStsSystem && level < kStsNofLevels); if (level == kStsNofLevels - 1) return address; - UInt_t version = GetVersion(address); - Int_t motherAdd = (address & ((1 << kShift[version][level + 1]) - 1)); + uint32_t version = GetVersion(address); + int32_t motherAdd = (address & ((1 << kShift[version][level + 1]) - 1)); motherAdd = motherAdd | (version << kVersionShift); return motherAdd; } @@ -154,17 +154,17 @@ Int_t CbmStsAddress::GetMotherAddress(Int_t address, Int_t level) // ----- Get the index of an element ------------------------------------- -UInt_t CbmStsAddress::GetElementId(Int_t address, Int_t level) +uint32_t CbmStsAddress::GetElementId(int32_t address, int32_t level) { assert(level >= kStsSystem && level < kStsNofLevels); - UInt_t version = GetVersion(address); + uint32_t version = GetVersion(address); return (address & (kMask[version][level] << kShift[version][level])) >> kShift[version][level]; } // --------------------------------------------------------------------------- // ----- Get System ID --------------------------------------------------- -ECbmModuleId CbmStsAddress::GetSystemId(Int_t address) +ECbmModuleId CbmStsAddress::GetSystemId(int32_t address) { return static_cast<ECbmModuleId>(GetElementId(address, kStsSystem)); // return GetElementId(address, kStsSystem); @@ -173,19 +173,19 @@ ECbmModuleId CbmStsAddress::GetSystemId(Int_t address) // ----- Get the version number from the address ------------------------- -UInt_t CbmStsAddress::GetVersion(Int_t address) +uint32_t CbmStsAddress::GetVersion(int32_t address) { - return UInt_t((address & (kVersionMask << kVersionShift)) >> kVersionShift); + return uint32_t((address & (kVersionMask << kVersionShift)) >> kVersionShift); } // --------------------------------------------------------------------------- // ----- Construct address by changing the index of an element ------------ -Int_t CbmStsAddress::SetElementId(Int_t address, Int_t level, UInt_t newId) +int32_t CbmStsAddress::SetElementId(int32_t address, int32_t level, uint32_t newId) { assert(level >= kStsSystem && level < kStsNofLevels); - UInt_t version = GetVersion(address); - UInt_t maxId = (1 << kBits[version][level]) - 1; + uint32_t version = GetVersion(address); + uint32_t maxId = (1 << kBits[version][level]) - 1; if (newId > maxId) { LOG(fatal) << "Id " << newId << " for STS level " << level << " exceeds maximum " << maxId; return 0; @@ -194,9 +194,28 @@ Int_t CbmStsAddress::SetElementId(Int_t address, Int_t level, UInt_t newId) } // ------------------------------------------------------------------------- +// ----- Pack Digi Address -------------------------------------------- +int32_t CbmStsAddress::PackDigiAddress(int32_t address) +{ + const int32_t kDMask = kMask[1][kStsUnit] << kShift[1][kStsUnit] | kMask[1][kStsLadder] << kShift[1][kStsLadder] + | kMask[1][kStsHalfLadder] << kShift[1][kStsHalfLadder] + | kMask[1][kStsModule] << kShift[1][kStsModule]; + + int32_t ret = (address & kDMask) >> kShift[1][kStsUnit]; + return ret; +} +// ------------------------------------------------------------------------- + +// ----- Unpack Digi Address ------------------------------------------- +int32_t CbmStsAddress::UnpackDigiAddress(int32_t digiAddress) +{ + return digiAddress << kShift[1][kStsUnit] | ToIntegralType(ECbmModuleId::kSts) << kShift[1][kStsSystem] + | 1u << kVersionShift; +} +// ------------------------------------------------------------------------- // ----- String output ------------------------------------------------- -std::string CbmStsAddress::ToString(Int_t address) +std::string CbmStsAddress::ToString(int32_t address) { std::stringstream ss; diff --git a/core/data/sts/CbmStsAddress.h b/core/data/sts/CbmStsAddress.h index 454e7488e8ebaf9f9232a0c309372e0fa27a511a..e62a00feb13b4fed2b36a6a5cc3d10a807bb623a 100644 --- a/core/data/sts/CbmStsAddress.h +++ b/core/data/sts/CbmStsAddress.h @@ -12,8 +12,6 @@ #include "CbmDefs.h" // for ECbmModuleId -#include <RtypesCore.h> // for Int_t, UInt_t - #include <sstream> // for string /** Enumerator for the hierarchy levels of the STS setup **/ @@ -50,13 +48,13 @@ enum EStsElementLevel namespace CbmStsAddress { - const UInt_t kCurrentVersion = 1; + const uint32_t kCurrentVersion = 1; // --- These values are not to be changed if backward compatibility // --- shall be maintained. - const Int_t kVersionSize = 4; // Bits for version number - const Int_t kVersionShift = 28; // First bit for version number - const Int_t kVersionMask = (1 << kVersionSize) - 1; + const int32_t kVersionSize = 4; // Bits for version number + const int32_t kVersionShift = 28; // First bit for version number + const int32_t kVersionMask = (1 << kVersionSize) - 1; /** @brief Construct address @@ -69,15 +67,15 @@ namespace CbmStsAddress ** @param channel Channel number ** @return Unique element address **/ - Int_t GetAddress(UInt_t unit = 0, UInt_t ladder = 0, UInt_t halfladder = 0, UInt_t module = 0, UInt_t sensor = 0, - UInt_t side = 0, UInt_t version = kCurrentVersion); + int32_t GetAddress(uint32_t unit = 0, uint32_t ladder = 0, uint32_t halfladder = 0, uint32_t module = 0, + uint32_t sensor = 0, uint32_t side = 0, uint32_t version = kCurrentVersion); /** @brief Construct address ** @param elementIds Array of element indices in their mother volumes ** @return Unique element address **/ - Int_t GetAddress(UInt_t* elementId, UInt_t version); + int32_t GetAddress(uint32_t* elementId, uint32_t version); /** @brief Construct the address of an element from the address of a @@ -89,7 +87,7 @@ namespace CbmStsAddress ** This strips of the address information of all hierarchy levels ** below the desired one. **/ - Int_t GetMotherAddress(Int_t address, Int_t level); + int32_t GetMotherAddress(int32_t address, int32_t level); /** @brief Get the index of an element @@ -97,13 +95,13 @@ namespace CbmStsAddress ** @param level Hierarchy level ** @return Element index **/ - UInt_t GetElementId(Int_t address, Int_t level); + uint32_t GetElementId(int32_t address, int32_t level); /** @brief Get system Id (should be ECbmModuleId::kSts) ** @param address Unique element address **/ - ECbmModuleId GetSystemId(Int_t address); + ECbmModuleId GetSystemId(int32_t address); /** @brief Extract version number @@ -113,7 +111,7 @@ namespace CbmStsAddress ** The version is encoded in the last 6 bits (58 to 63). ** The maximal number of versions is 64. **/ - UInt_t GetVersion(Int_t address); + uint32_t GetVersion(int32_t address); /** @brief Set the index of an element, leaving the other element levels @@ -123,13 +121,27 @@ namespace CbmStsAddress ** @param newId New element index ** @return New address **/ - Int_t SetElementId(Int_t address, Int_t level, UInt_t newId); + int32_t SetElementId(int32_t address, int32_t level, uint32_t newId); + + + /** @brief Strip address to contain only unit, (half)ladder and module. + ** @param address Full address + ** @return 17 bit address that can be stored in a Digi + **/ + int32_t PackDigiAddress(int32_t address); + + + /** @brief Add version and system to compressed address that's stored in a digi + ** @param digiAddress Compressed address from digi + ** @return Full address + **/ + int32_t UnpackDigiAddress(int32_t digiAddress); /** @brief String output ** @param address Unique element address **/ - std::string ToString(Int_t address); + std::string ToString(int32_t address); } // Namespace CbmStsAddress