diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/CMakeLists.txt b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/CMakeLists.txt index a06f29cdbae8e5612f8ee03c27fb5dfdee523271..99c0cb64f3fdf76ebf5b9dd9c0f3970e021c5461 100644 --- a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/CMakeLists.txt +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/CMakeLists.txt @@ -8,6 +8,7 @@ find_package( CLHEP ) find_package( CORAL COMPONENTS CoralBase ) find_package( ROOT COMPONENTS Core RIO ) find_package( nlohmann_json ) +find_package( Boost COMPONENTS unit_test_framework ) # Component(s) in the package: atlas_add_component( PixelConditionsAlgorithms @@ -15,6 +16,13 @@ atlas_add_component( PixelConditionsAlgorithms INCLUDE_DIRS ${CLHEP_INCLUDE_DIRS} ${CORAL_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} LINK_LIBRARIES ${CLHEP_LIBRARIES} ${CORAL_LIBRARIES} ${ROOT_LIBRARIES} nlohmann_json::nlohmann_json AthenaBaseComps AthenaKernel AthenaPoolUtilities DetDescrConditions GaudiKernel GeoModelUtilities GeoPrimitives Identifier InDetCondTools InDetIdentifier InDetReadoutGeometry PathResolver PixelConditionsData PixelReadoutGeometryLib StoreGateLib TrkGeometry TrkSurfaces MuonReadoutGeometry TRT_ReadoutGeometry) +atlas_add_test( StringUtilities_test + SOURCES test/StringUtilities_test.cxx src/StringUtilities.cxx + INCLUDE_DIRS ${Boost_INCLUDE_DIRS} + LINK_LIBRARIES ${Boost_LIBRARIES} + POST_EXEC_SCRIPT "nopost.sh" +) + # Install files from the package: atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} ) atlas_install_joboptions( share/*.py ) diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelDeadMapCondAlg.cxx b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelDeadMapCondAlg.cxx index f01e5c8f4ba3e4698d01bf5df1448a9b4dddb5ea..b4a22844a1a9b31a4c1623ec20acdf1f11d66354 100644 --- a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelDeadMapCondAlg.cxx +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/PixelDeadMapCondAlg.cxx @@ -4,8 +4,10 @@ #include "PixelDeadMapCondAlg.h" #include "GaudiKernel/EventIDRange.h" +#include "StringUtilities.h" -#include <sstream> + +using PixelConditionsAlgorithms::parseDeadMapString; PixelDeadMapCondAlg::PixelDeadMapCondAlg(const std::string& name, ISvcLocator* pSvcLocator): ::AthReentrantAlgorithm(name, pSvcLocator) @@ -56,33 +58,15 @@ StatusCode PixelDeadMapCondAlg::execute(const EventContext& ctx) const { for (CondAttrListCollection::const_iterator attrList=readCdo->begin(); attrList!=readCdo->end(); ++attrList) { const CondAttrListCollection::AttributeList &payload = attrList->second; - // RUN-3 format if (payload.exists("data_array") and not payload["data_array"].isNull()) { const std::string &stringStatus = payload["data_array"].data<std::string>(); - - std::stringstream ss(stringStatus); - std::vector<std::string> component; - std::string buffer; - while (std::getline(ss,buffer,',')) { component.push_back(buffer); } - - for (int i=0; i<(int)component.size(); i++) { - std::stringstream checkModule(component[i]); - std::vector<std::string> moduleString; - while (std::getline(checkModule,buffer,':')) { moduleString.push_back(buffer); } - - if (moduleString.size()==2) { - std::stringstream checkModuleHash(moduleString[0]); - std::vector<std::string> moduleStringHash; - while (std::getline(checkModuleHash,buffer,'"')) { moduleStringHash.push_back(buffer); } - - int moduleHash = std::atoi(moduleStringHash[1].c_str()); - int moduleStatus = std::atoi(moduleString[1].c_str()); - - if (moduleStatus==0) { writeCdo->setModuleStatus(moduleHash, 1); } - else { writeCdo->setChipStatus(moduleHash, moduleStatus); } - } - + const auto & hashStatusVector = parseDeadMapString(stringStatus); + for (const auto & [hash, status] : hashStatusVector){ + //status ==0 means its the module status to be set to '1' + if (status==0) writeCdo->setModuleStatus(hash, 1); + //...any other status will set the chip status + else writeCdo->setChipStatus(hash, status); } } } diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/StringUtilities.cxx b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/StringUtilities.cxx new file mode 100644 index 0000000000000000000000000000000000000000..37cb8274fefb455c4193904cf4755420633b3aef --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/StringUtilities.cxx @@ -0,0 +1,43 @@ +/* + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration +*/ + +#include "StringUtilities.h" +#include <sstream> +//getline is in <string>, already included + +namespace PixelConditionsAlgorithms{ + + //parses the data_array string from the pixel dead map conditions db + std::vector<std::pair<int, int>>//module hash, module status + parseDeadMapString(const std::string & dataArrayString){ + std::vector<std::pair<int, int>> result; + if (dataArrayString.empty()) return result; + // + std::stringstream ss(dataArrayString); + std::vector<std::string> component; + std::string buffer; + while (std::getline(ss,buffer,',')) { + component.push_back(buffer); + } + for (const auto & elem : component) { + std::stringstream checkModule(elem); + std::vector<std::string> moduleString; + while (std::getline(checkModule,buffer,':')) { + moduleString.push_back(buffer); + } + if (moduleString.size()==2) { + std::stringstream checkModuleHash(moduleString[0]); + std::vector<std::string> moduleStringHash; + while (std::getline(checkModuleHash,buffer,'"')) { + moduleStringHash.push_back(buffer); + } + const int moduleHash = std::stoi(moduleStringHash[1]); + const int moduleStatus = std::stoi(moduleString[1]); + result.push_back({moduleHash, moduleStatus}); + } + } + // + return result; + } +} \ No newline at end of file diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/StringUtilities.h b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/StringUtilities.h new file mode 100644 index 0000000000000000000000000000000000000000..955fe8dc6dd8b00faeb3734996777b49302e251a --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/src/StringUtilities.h @@ -0,0 +1,18 @@ +/* + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef PixelConditionsAlgorithms_StringUtilities +#define PixelConditionsAlgorithms_StringUtilities + +#include <vector> +#include <utility> //for std::pair +#include <string> + +namespace PixelConditionsAlgorithms{ + + //parses the data_array string from the pixel dead map conditions db + std::vector<std::pair<int, int>>//module hash, module status + parseDeadMapString(const std::string & dataArrayString); +} +#endif diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/test/DeadMapTestString.h b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/test/DeadMapTestString.h new file mode 100644 index 0000000000000000000000000000000000000000..263de412eae0bc20a385146b5728af3ada4cd397 --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/test/DeadMapTestString.h @@ -0,0 +1,9 @@ +/* + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration +*/ +#include <string_view> +namespace PixelConditionsAlgorithms{ +//this defines a database string returned in data_array for PixelDeadMapCondAlg, for testing a parser +constexpr std::string_view + testString = R"({"12":0,"19":0,"53":0,"64":256,"65":0,"139":0,"147":0,"151":128,"152":0,"202":2,"273":0,"315":0,"442":0,"453":1,"455":96,"466":16384,"471":8192,"473":0,"487":0,"492":0,"494":512,"501":1024,"503":0,"517":128,"521":64,"527":0,"540":0,"546":0,"576":128,"623":0,"630":0,"633":256,"643":0,"645":256,"650":1,"659":1,"663":0,"670":1,"686":0,"708":0,"710":32768,"721":4,"769":2048,"783":0,"791":0,"792":0,"806":0,"819":0,"826":0,"832":0,"835":1024,"853":32768,"890":32768,"910":9,"953":32768,"967":0,"974":0,"981":0,"984":0,"991":0,"1002":0,"1004":0,"1005":0,"1008":16640,"1013":256,"1015":576,"1021":0,"1039":1024,"1044":0,"1046":0,"1050":0,"1052":32897,"1053":7944,"1059":18,"1075":36864,"1080":0,"1120":172,"1123":0,"1124":57408,"1125":0,"1128":32,"1130":8192,"1137":0,"1149":32768,"1150":168,"1167":0,"1171":0,"1177":128,"1184":51,"1187":32768,"1202":0,"1207":0,"1225":0,"1227":0,"1228":0,"1235":512,"1280":8192,"1287":16,"1315":4,"1333":256,"1339":0,"1351":0,"1360":12800,"1364":8,"1391":0,"1407":64,"1408":1,"1413":8,"1414":0,"1416":0,"1417":0,"1423":0,"1451":14,"1456":0,"1459":8192,"1461":36864,"1462":32768,"1475":0,"1476":0,"1498":512,"1500":32,"1502":8,"1520":4096,"1528":0,"1562":0,"1565":32768,"1566":0,"1576":8,"1591":32,"1592":1024,"1601":0,"1602":0,"1606":256,"1608":0,"1644":0,"1678":1024,"1682":0,"1690":0,"1700":13,"1729":0,"1732":192,"1746":0,"1747":0,"1776":8192,"1777":0,"1794":0,"1798":0,"1829":1024,"1835":1024,"1845":4,"1872":0,"1888":4096,"1920":0,"1921":0,"1976":0,"1981":0,"1984":256,"1992":0,"1995":16384,"2007":4096,"2010":4096,"2020":0,"2027":0,"2028":0})"; +} diff --git a/InnerDetector/InDetConditions/PixelConditionsAlgorithms/test/StringUtilities_test.cxx b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/test/StringUtilities_test.cxx new file mode 100644 index 0000000000000000000000000000000000000000..3be2840fca4b4eaa07b1fb898d3908f21c36a6f0 --- /dev/null +++ b/InnerDetector/InDetConditions/PixelConditionsAlgorithms/test/StringUtilities_test.cxx @@ -0,0 +1,59 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +*/ +/* + */ +/** + * @file PixelConditionsAlgorithms/test/StringUtilities_test.cxx + * @author Shaun Roe + * @date Aug, 2022 + * @brief Some tests for StringUtilities + */ + +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MAIN +#define BOOST_TEST_MODULE TEST_PixelConditionsAlgorithms + + +#include <boost/test/unit_test.hpp> +// +#include <utility> +#include <vector> + +#include "../src/StringUtilities.h" +#include "DeadMapTestString.h" +#include <stdexcept> + +using ValueType = std::pair<int, int>; +std::ostream & +operator<<(std::ostream & o, const ValueType& v){ + o<<"{"<<v.first<<", "<<v.second<<"}"; + return o; +} + +namespace boost::test_tools::tt_detail { + template<> + struct print_log_value<ValueType > { + void operator()( std::ostream& os, ValueType const& v){ + ::operator<<(os,v); + } + }; +} + +BOOST_AUTO_TEST_SUITE(PixelConditionsAlgorithmsStringUtilitiesTest) + BOOST_AUTO_TEST_CASE(parseDeadMapString){ + const std::string emptyString; + const auto result=PixelConditionsAlgorithms::parseDeadMapString(emptyString); + BOOST_TEST(result.empty(),"Parsing empty string should give empty result"); + const std::string validTestString{PixelConditionsAlgorithms::testString}; + const auto run3Result=PixelConditionsAlgorithms::parseDeadMapString(validTestString); + BOOST_TEST(run3Result.size() == 164, "Test string has 164 entries"); + //first entry is {12, 0}, the zero will cause the module status to be written as '1' + //in the Algorithm + BOOST_TEST(run3Result[0] == ValueType(12,0)); + //check entry three which should be {64, 256}, so should be a chip status + BOOST_TEST(run3Result[3] == ValueType(64,256)); + } + + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file