From 0fbc05de7cdffd93bd384de78ae4e8e1e87cb188 Mon Sep 17 00:00:00 2001 From: scott snyder <snyder@bnl.gov> Date: Wed, 8 Jul 2020 16:27:20 +0200 Subject: [PATCH] TrigT1CaloMappingTools: Make mapping methods const. Declare IL1CaloMappingTool::mapping() as const. Also update tools to use extends<>. Further notes: PpmCoolMappingTool relies on a BeginRun incident, and so is not thread-safe. It should work as long as the run doesn't actually change during processing, but fixing things for the general case will need further work. PpmCoolOrBuiltinMappingTool should work, but it really should determine its configuration during initialize() rather than during event processing. Removed caching in PpmMappingTool. Instead, restructure to use arrays rather than std::map. --- .../TrigT1CaloMappingTools/CMakeLists.txt | 3 +- .../src/CpmMappingTool.cxx | 16 +- .../src/CpmMappingTool.h | 19 +- .../src/JemMappingTool.cxx | 16 +- .../src/JemMappingTool.h | 16 +- .../src/PpmCoolMappingTool.cxx | 105 +++++----- .../src/PpmCoolMappingTool.h | 29 ++- .../src/PpmCoolOrBuiltinMappingTool.cxx | 52 ++--- .../src/PpmCoolOrBuiltinMappingTool.h | 31 ++- .../src/PpmMappingTool.cxx | 193 +++++++----------- .../src/PpmMappingTool.h | 51 ++--- 11 files changed, 209 insertions(+), 322 deletions(-) diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt b/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt index b93a3aaa750..e20905e1ac9 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt @@ -11,6 +11,7 @@ atlas_depends_on_subdirs( PRIVATE Calorimeter/CaloTriggerTool Control/AthenaBaseComps Control/StoreGate + Control/CxxUtils DetectorDescription/Identifier GaudiKernel Trigger/TrigT1/TrigT1CaloToolInterfaces ) @@ -19,5 +20,5 @@ atlas_depends_on_subdirs( PRIVATE atlas_add_component( TrigT1CaloMappingTools src/*.cxx src/components/*.cxx - LINK_LIBRARIES CaloIdentifier CaloTriggerToolLib AthenaBaseComps StoreGateLib SGtests Identifier GaudiKernel ) + LINK_LIBRARIES CxxUtils CaloIdentifier CaloTriggerToolLib AthenaBaseComps StoreGateLib SGtests Identifier GaudiKernel ) diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx index 38eefc95c06..0a58ccc4e1a 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.cxx @@ -23,18 +23,6 @@ const int CpmMappingTool::s_etaBinsPerRow; const double CpmMappingTool::s_etaGran = 0.1; const double CpmMappingTool::s_phiGran = M_PI/32.; -CpmMappingTool::CpmMappingTool(const std::string& type, - const std::string& name, - const IInterface* parent) - : AthAlgTool(type, name, parent) -{ - declareInterface<IL1CaloMappingTool>(this); -} - -CpmMappingTool::~CpmMappingTool() -{ -} - // Initialise the mappings #ifndef PACKAGE_VERSION @@ -58,7 +46,7 @@ StatusCode CpmMappingTool::finalize() // Return eta, phi and layer mapping for given crate/module/channel bool CpmMappingTool::mapping(const int crate, const int module, - const int channel, double& eta, double& phi, int& layer) + const int channel, double& eta, double& phi, int& layer) const { if (crate < 0 || crate >= s_crates || module < 1 || module > s_modules || channel < 0 || channel >= s_channels) return false; @@ -99,7 +87,7 @@ bool CpmMappingTool::mapping(const int crate, const int module, // Return crate, module and channel mapping for given eta/phi/layer bool CpmMappingTool::mapping(const double /*eta*/, const double /*phi*/, - const int /*layer*/, int& crate, int& module, int& channel) + const int /*layer*/, int& crate, int& module, int& channel) const { // Not implemented crate = 0; diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h index d6fc878ffc5..d300818a102 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/CpmMappingTool.h @@ -29,24 +29,21 @@ namespace LVL1 { * @author Peter Faulkner */ -class CpmMappingTool : virtual public IL1CaloMappingTool, - public AthAlgTool { - +class CpmMappingTool : public extends<AthAlgTool, IL1CaloMappingTool> +{ public: + + using base_class::base_class; - CpmMappingTool(const std::string& type, const std::string& name, - const IInterface* parent); - virtual ~CpmMappingTool(); - - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; /// Return eta, phi and layer mapping for given crate/module/channel virtual bool mapping(int crate, int module, int channel, - double& eta, double& phi, int& layer); + double& eta, double& phi, int& layer) const override; /// Return crate, module and channel mapping for given eta/phi/layer virtual bool mapping(double eta, double phi, int layer, - int& crate, int& module, int& channel); + int& crate, int& module, int& channel) const override; private: diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx index 307270f96bd..02cf7ebe08e 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.cxx @@ -27,18 +27,6 @@ const double JemMappingTool::s_etaGran = 0.2; const double JemMappingTool::s_phiGran = M_PI/16.; -JemMappingTool::JemMappingTool(const std::string& type, - const std::string& name, - const IInterface* parent) - : AthAlgTool(type, name, parent) -{ - declareInterface<IL1CaloMappingTool>(this); -} - -JemMappingTool::~JemMappingTool() -{ -} - // Initialise the mappings #ifndef PACKAGE_VERSION @@ -84,7 +72,7 @@ StatusCode JemMappingTool::finalize() // Return eta, phi and layer mapping for given crate/module/channel bool JemMappingTool::mapping(const int crate, const int module, - const int channel, double& eta, double& phi, int& layer) + const int channel, double& eta, double& phi, int& layer) const { if (crate < 0 || crate >= s_crates || module < 0 || module >= s_modules || channel < 0 || channel >= s_channels) return false; @@ -132,7 +120,7 @@ bool JemMappingTool::mapping(const int crate, const int module, // Return crate, module and channel mapping for given eta/phi/layer bool JemMappingTool::mapping(const double /*eta*/, const double /*phi*/, - const int /*layer*/, int& crate, int& module, int& channel) + const int /*layer*/, int& crate, int& module, int& channel) const { // Not implemented crate = 0; diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h index b6466a239c1..5641ab7fe20 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/JemMappingTool.h @@ -31,24 +31,22 @@ namespace LVL1 { * @author Peter Faulkner */ -class JemMappingTool : virtual public IL1CaloMappingTool, - public AthAlgTool { +class JemMappingTool : public extends<AthAlgTool, IL1CaloMappingTool> +{ public: - JemMappingTool(const std::string& type, const std::string& name, - const IInterface* parent); - virtual ~JemMappingTool(); + using base_class::base_class; - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; /// Return eta, phi and layer mapping for given crate/module/channel virtual bool mapping(int crate, int module, int channel, - double& eta, double& phi, int& layer); + double& eta, double& phi, int& layer) const override; /// Return crate, module and channel mapping for given eta/phi/layer virtual bool mapping(double eta, double phi, int layer, - int& crate, int& module, int& channel); + int& crate, int& module, int& channel) const override; private: diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx index 182b296046d..a81b48b24b7 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.cxx @@ -13,7 +13,6 @@ #include "CaloIdentifier/CaloID_Exception.h" #include "CaloIdentifier/CaloLVL1_ID.h" #include "CaloIdentifier/TTOnlineID.h" -#include "CaloTriggerTool/CaloTriggerTowerService.h" #include "Identifier/Identifier.h" #include "Identifier/HWIdentifier.h" @@ -24,22 +23,6 @@ namespace LVL1 { const int PpmCoolMappingTool::s_maxTableEntries; -PpmCoolMappingTool::PpmCoolMappingTool(const std::string& type, - const std::string& name, const IInterface* parent) - : AthAlgTool(type, name, parent), - m_ttSvc("CaloTriggerTowerService"), - m_lvl1Helper(0), m_l1ttonlineHelper(0) -{ - declareInterface<IL1CaloMappingTool>(this); - - declareProperty("CaloTriggerTowerService", m_ttSvc); - -} - -PpmCoolMappingTool::~PpmCoolMappingTool() -{ -} - // Initialise the mappings #ifndef PACKAGE_VERSION @@ -108,12 +91,55 @@ StatusCode PpmCoolMappingTool::finalize() void PpmCoolMappingTool::handle(const Incident& inc) { + // FIXME: not thread safe --- won't work if there's more than one run + // in the input. if (inc.type()=="BeginRun") { if (msgLvl(MSG::DEBUG)) { msg(MSG::DEBUG) << "Resetting mapping table at start of run" << endmsg; } - m_idTable.clear(); + bool verbose = msgLvl(MSG::VERBOSE); + m_idTable.resize (s_maxTableEntries); + for (int index = 0; index < s_maxTableEntries; ++index) { + const int channel = index & 0x3f; + const int module = (index >> 6) & 0x0f; + const int crate = index >> 10; + const int slot = module + 5; + const int pin = channel % 16; + const int asic = channel / 16; + + Identifier ttId(0); + Identifier invalidId(0); + try { + if (verbose) { + msg(MSG::VERBOSE) << "crate/module/channel " << crate << "/" + << module << "/" << channel + << " maps to crate/slot/pin/asic " << crate << "/" + << slot << "/" << pin << "/" << asic << endmsg; + } + const HWIdentifier id = m_l1ttonlineHelper->channelId(crate, slot, pin, + asic); + if (verbose) { + msg(MSG::VERBOSE) << "hardware_id: " << id << endmsg; + } + ttId = m_ttSvc->cnvToIdentifier(id, true); + if (verbose) { + msg(MSG::VERBOSE) << "tower_id: " << ttId << endmsg; + } + } + catch (const CaloID_Exception&) { ttId = invalidId; } + if (ttId == invalidId) { + m_idTable[index] = 0; + } + else { + const int side = (m_lvl1Helper->pos_neg_z(ttId) == 1) ? 1 : 2; + const int sample = m_lvl1Helper->sampling(ttId); + const int region = m_lvl1Helper->region(ttId); + const int ieta = m_lvl1Helper->eta(ttId); + const int iphi = m_lvl1Helper->phi(ttId); + m_idTable[index] = (side<<14)+(sample<<13)+(region<<11)+(ieta<<6)+iphi; + } + } } return; } @@ -121,7 +147,7 @@ void PpmCoolMappingTool::handle(const Incident& inc) // Return eta, phi and layer mapping for given crate/module/channel bool PpmCoolMappingTool::mapping(const int crate, const int module, - const int channel, double& eta, double& phi, int& layer) + const int channel, double& eta, double& phi, int& layer) const { if (crate < 0 || crate >= 8 || module < 0 || module >= 16 || channel < 0 || channel >= 64) return false; @@ -131,43 +157,8 @@ bool PpmCoolMappingTool::mapping(const int crate, const int module, bool verbose = msgLvl(MSG::VERBOSE); - if (m_idTable.empty()) { - m_idTable.reserve(s_maxTableEntries); - m_idTable.assign(s_maxTableEntries, 0); - } - if (m_idTable[index] == 0) { - const int slot = module + 5; - const int pin = channel % 16; - const int asic = channel / 16; - - Identifier ttId(0); - Identifier invalidId(0); - try { - if (verbose) { - msg(MSG::VERBOSE) << "crate/module/channel " << crate << "/" - << module << "/" << channel - << " maps to crate/slot/pin/asic " << crate << "/" - << slot << "/" << pin << "/" << asic << endmsg; - } - const HWIdentifier id = m_l1ttonlineHelper->channelId(crate, slot, pin, - asic); - if (verbose) { - msg(MSG::VERBOSE) << "hardware_id: " << id << endmsg; - } - ttId = m_ttSvc->cnvToIdentifier(id, true); - if (verbose) { - msg(MSG::VERBOSE) << "tower_id: " << ttId << endmsg; - } - } - catch (const CaloID_Exception&) { ttId = invalidId; } - if (ttId == invalidId) return false; - - const int side = (m_lvl1Helper->pos_neg_z(ttId) == 1) ? 1 : 2; - const int sample = m_lvl1Helper->sampling(ttId); - const int region = m_lvl1Helper->region(ttId); - const int ieta = m_lvl1Helper->eta(ttId); - const int iphi = m_lvl1Helper->phi(ttId); - m_idTable[index] = (side<<14)+(sample<<13)+(region<<11)+(ieta<<6)+iphi; + if (index >= static_cast<int>(m_idTable.size()) || m_idTable[index] == 0) { + return false; } const unsigned int entry = m_idTable[index]; const int side = ((entry>>14) == 1) ? 1 : -1; @@ -194,7 +185,7 @@ bool PpmCoolMappingTool::mapping(const int crate, const int module, // Return crate, module and channel mapping for given eta/phi/layer bool PpmCoolMappingTool::mapping(const double eta, const double phi, - const int layer, int& crate, int& module, int& channel) + const int layer, int& crate, int& module, int& channel) const { if (eta <= -4.9 || eta >= 4.9 || phi <= 0. || phi >= 2.*M_PI) return false; diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h index 6afbbfe036d..686bfbd8cef 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolMappingTool.h @@ -12,10 +12,10 @@ #include "GaudiKernel/Incident.h" #include "GaudiKernel/ToolHandle.h" +#include "CaloTriggerTool/CaloTriggerTowerService.h" #include "TrigT1CaloToolInterfaces/IL1CaloMappingTool.h" class CaloLVL1_ID; -class CaloTriggerTowerService; class IInterface; class StatusCode; class TTOnlineID; @@ -30,33 +30,30 @@ namespace LVL1 { * @author Peter Faulkner */ -class PpmCoolMappingTool : virtual public IL1CaloMappingTool, - public IIncidentListener, - public AthAlgTool { - +class PpmCoolMappingTool : public extends<AthAlgTool, IL1CaloMappingTool, IIncidentListener> +{ public: - PpmCoolMappingTool(const std::string& type, const std::string& name, - const IInterface* parent); - virtual ~PpmCoolMappingTool(); + using base_class::base_class; - virtual StatusCode initialize(); - virtual StatusCode finalize(); - virtual void handle(const Incident&); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; + virtual void handle(const Incident&) override; /// Return eta, phi and layer mapping for given crate/module/channel virtual bool mapping(int crate, int module, int channel, - double& eta, double& phi, int& layer); + double& eta, double& phi, int& layer) const override; /// Return crate, module and channel mapping for given eta/phi/layer virtual bool mapping(double eta, double phi, int layer, - int& crate, int& module, int& channel); + int& crate, int& module, int& channel) const override; private: // Tools and helpers - ToolHandle<CaloTriggerTowerService> m_ttSvc; - const CaloLVL1_ID* m_lvl1Helper; - const TTOnlineID* m_l1ttonlineHelper; + ToolHandle<CaloTriggerTowerService> m_ttSvc + { this, "CaloTriggerTowerService", "CaloTriggerTowerService" }; + const CaloLVL1_ID* m_lvl1Helper = nullptr; + const TTOnlineID* m_l1ttonlineHelper = nullptr; /// Mapping lookup table std::vector<unsigned int> m_idTable; diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx index 2b02417fc6a..58a2187b891 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.cxx @@ -13,24 +13,6 @@ namespace LVL1 { -PpmCoolOrBuiltinMappingTool::PpmCoolOrBuiltinMappingTool(const std::string& type, - const std::string& name, const IInterface* parent) - : AthAlgTool(type, name, parent), - m_coolTool("LVL1::PpmCoolMappingTool/PpmCoolMappingTool"), - m_builtinTool("LVL1::PpmMappingTool/PpmMappingTool"), - m_coolCheckDone(false) -{ - declareInterface<IL1CaloMappingTool>(this); - - declareProperty("CoolMappingTool", m_coolTool); - declareProperty("BuiltinMappingTool", m_builtinTool); - -} - -PpmCoolOrBuiltinMappingTool::~PpmCoolOrBuiltinMappingTool() -{ -} - // Initialise the mappings #ifndef PACKAGE_VERSION @@ -68,7 +50,7 @@ StatusCode PpmCoolOrBuiltinMappingTool::finalize() // Return eta, phi and layer mapping for given crate/module/channel bool PpmCoolOrBuiltinMappingTool::mapping(const int crate, const int module, - const int channel, double& eta, double& phi, int& layer) + const int channel, double& eta, double& phi, int& layer) const { bool rc = false; if (coolWorks()) { @@ -82,7 +64,7 @@ bool PpmCoolOrBuiltinMappingTool::mapping(const int crate, const int module, // Return crate, module and channel mapping for given eta/phi/layer bool PpmCoolOrBuiltinMappingTool::mapping(const double eta, const double phi, - const int layer, int& crate, int& module, int& channel) + const int layer, int& crate, int& module, int& channel) const { bool rc = false; if (coolWorks()) { @@ -95,35 +77,37 @@ bool PpmCoolOrBuiltinMappingTool::mapping(const double eta, const double phi, // Check if COOL mappings are working -bool PpmCoolOrBuiltinMappingTool::coolWorks() +bool PpmCoolOrBuiltinMappingTool::coolWorks() const { - if ( !m_coolCheckDone ) { + // FIXME: This should be determined during initialization! + + if (!m_coolCheck.isValid()) { const double testEta = 3.8375; const double testPhi = M_PI/16.; const int testLayer = 1; int crate = 0; int module = 0; int channel = 0; - m_coolCheckResult = ((m_coolTool->mapping(testEta, testPhi, testLayer, - crate, module, channel)) && - !(crate == 4 && module == 8 && channel == 48)); - if (m_coolCheckResult) { + bool result = ((m_coolTool->mapping(testEta, testPhi, testLayer, + crate, module, channel)) && + !(crate == 4 && module == 8 && channel == 48)); + if (result) { const double tolerance = 0.01; double eta = 0.; double phi = 0.; int layer = 0; - m_coolCheckResult = ((m_coolTool->mapping(crate, module, channel, - eta, phi, layer)) && - (fabs(eta-testEta) < tolerance) && - (fabs(phi-testPhi) < tolerance) && - (layer == testLayer)); + result = ((m_coolTool->mapping(crate, module, channel, + eta, phi, layer)) && + (fabs(eta-testEta) < tolerance) && + (fabs(phi-testPhi) < tolerance) && + (layer == testLayer)); } - m_coolCheckDone = true; - if (m_coolCheckResult) { + if (result) { msg(MSG::INFO) << "COOL mappings selected" << endmsg; } else msg(MSG::INFO) << "Built-in mappings selected" << endmsg; + m_coolCheck.set (result); } - return m_coolCheckResult; + return *m_coolCheck.ptr(); } } // end namespace diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h index fc8cb0ba1e2..1ddbc055b02 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmCoolOrBuiltinMappingTool.h @@ -11,6 +11,7 @@ #include "GaudiKernel/ToolHandle.h" #include "TrigT1CaloToolInterfaces/IL1CaloMappingTool.h" +#include "CxxUtils/CachedValue.h" class IInterface; class StatusCode; @@ -25,40 +26,36 @@ namespace LVL1 { * @author Peter Faulkner */ -class PpmCoolOrBuiltinMappingTool : virtual public IL1CaloMappingTool, - public AthAlgTool { - +class PpmCoolOrBuiltinMappingTool : public extends<AthAlgTool, IL1CaloMappingTool> +{ public: - PpmCoolOrBuiltinMappingTool(const std::string& type, const std::string& name, - const IInterface* parent); - virtual ~PpmCoolOrBuiltinMappingTool(); + using base_class::base_class; - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; /// Return eta, phi and layer mapping for given crate/module/channel virtual bool mapping(int crate, int module, int channel, - double& eta, double& phi, int& layer); + double& eta, double& phi, int& layer) const override; /// Return crate, module and channel mapping for given eta/phi/layer virtual bool mapping(double eta, double phi, int layer, - int& crate, int& module, int& channel); + int& crate, int& module, int& channel) const override; private: /// Check if COOL mappings are working - bool coolWorks(); + bool coolWorks() const; /// COOL mapping tool - ToolHandle<IL1CaloMappingTool> m_coolTool; + ToolHandle<IL1CaloMappingTool> m_coolTool + { this, "CoolMappingTool", "LVL1::PpmCoolMappingTool/PpmCoolMappingTool" }; /// Built-in mapping tool - ToolHandle<IL1CaloMappingTool> m_builtinTool; + ToolHandle<IL1CaloMappingTool> m_builtinTool + { this, "BuiltinMappingTool", "LVL1::PpmMappingTool/PpmMappingTool" }; /// COOL mapping check done flag - bool m_coolCheckDone; - /// COOL mapping check result - bool m_coolCheckResult; - + mutable CxxUtils::CachedValue<bool> m_coolCheck; }; } // end namespace diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx index e4e7f3ea82c..3715f4b6397 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration */ #include <cmath> @@ -18,20 +18,6 @@ const int PpmMappingTool::s_crates; const int PpmMappingTool::s_modules; const int PpmMappingTool::s_channels; -PpmMappingTool::PpmMappingTool(const std::string& type, - const std::string& name, - const IInterface* parent) - : AthAlgTool(type, name, parent), - m_crateInfo(0), m_currentMap(0), - m_etaPhiMap(0) -{ - declareInterface<IL1CaloMappingTool>(this); -} - -PpmMappingTool::~PpmMappingTool() -{ -} - #ifndef PACKAGE_VERSION #define PACKAGE_VERSION "unknown" #endif @@ -40,57 +26,41 @@ StatusCode PpmMappingTool::initialize() { msg(MSG::INFO) << "Initializing " << name() << " - package version " << PACKAGE_VERSION << endmsg; + setupMap(); + setupInverseMap(); return StatusCode::SUCCESS; } StatusCode PpmMappingTool::finalize() { - std::vector<CoordinateMap*>::iterator pos; - for (pos = m_coordMaps.begin(); pos != m_coordMaps.end(); ++pos) { - delete *pos; - } - delete m_crateInfo; - delete m_etaPhiMap; - return StatusCode::SUCCESS; } // Return eta, phi and layer mapping for given crate/module/channel bool PpmMappingTool::mapping(const int crate, const int module, - const int channel, double& eta, double& phi, int& layer) + const int channel, double& eta, double& phi, int& layer) const { if (crate < 0 || crate >= s_crates || module < 0 || module >= s_modules || channel < 0 || channel >= s_channels) return false; - if (!m_currentMap || crate != m_currentCrate || module != m_currentModule) { - - // Find the relevant mapping - - if ( !m_crateInfo ) setupMap(); - CrateMap::const_iterator cpos = m_crateInfo->find(crate); - if (cpos == m_crateInfo->end()) return false; - const ModuleMap& modMap(cpos->second); - ModuleMap::const_iterator mpos = modMap.find(module); - if (mpos == modMap.end()) return false; - const ModuleInfo modInfo(mpos->second); - const Offsets etaPhiOff = modInfo.first; - m_currentMap = modInfo.second; - m_etaOffset = etaPhiOff.first; - m_phiOffset = etaPhiOff.second; - m_currentCrate = crate; - m_currentModule = module; - } + const ModuleMap& modMap = m_crateInfo[crate]; + const ModuleInfo& modInfo = modMap[module]; + const double etaOffset = modInfo.first.first; + const double phiOffset = modInfo.first.second; + const CoordinateMap* currentMap = modInfo.second; + + if (!currentMap) return false; // Set the output - CoordinateMap::const_iterator pos = m_currentMap->find(channel); - if (pos == m_currentMap->end()) return false; - ChannelCoordinate relCoord(pos->second); - relCoord.setEta(relCoord.eta() + m_etaOffset); + ChannelCoordinate relCoord = (*currentMap)[channel]; + if (relCoord.layer() == ChannelCoordinate::NONE) return false; + + relCoord.setEta(relCoord.eta() + etaOffset); eta = etaSim(relCoord); - phi = relCoord.phi() + m_phiOffset; + phi = relCoord.phi() + phiOffset; layer = (relCoord.layer() == ChannelCoordinate::EM) ? 0 : 1; return true; } @@ -98,14 +68,13 @@ bool PpmMappingTool::mapping(const int crate, const int module, // Return crate, module and channel mapping for given eta/phi/layer bool PpmMappingTool::mapping(const double eta, const double phi, - const int layer, int& crate, int& module, int& channel) + const int layer, int& crate, int& module, int& channel) const { const unsigned int invalidChanId = s_crates*s_modules*s_channels; - if ( !m_etaPhiMap ) setupInverseMap(); const unsigned int key = etaPhiKey(eta, phi); - EtaPhiMap::iterator iter = m_etaPhiMap->find(key); - if (iter == m_etaPhiMap->end()) { + EtaPhiMap::const_iterator iter = m_etaPhiMap.find(key); + if (iter == m_etaPhiMap.end()) { msg(MSG::WARNING) << "Invalid eta/phi: " << eta << "/" << phi << endmsg; return false; @@ -126,8 +95,6 @@ bool PpmMappingTool::mapping(const double eta, const double phi, void PpmMappingTool::setupMap() { - m_crateInfo = new CrateMap; - // Input to Output channel mappings. // Inputs are numbered 1-16 (x4) and outputs 0-63 // There are four output sets obtained by adding 0,4,8,12 to out @@ -265,155 +232,155 @@ void PpmMappingTool::setupMap() // Construct coordinate maps for each module type // Four blocks of each type make up the complete map - for (int i = 0; i < 12; ++i) m_coordMaps.push_back(new CoordinateMap); + for (int i = 0; i < 12; ++i) m_coordMaps.push_back(std::make_unique<CoordinateMap>()); for (int block = 0; block < 4; ++block) { const int incr = block * 4; - std::vector<CoordinateMap*>::iterator pos = m_coordMaps.begin(); + std::vector<std::unique_ptr<CoordinateMap> >::iterator pos = m_coordMaps.begin(); // Map 0 : Type 1 EM addCoords(4,4,0.1,M_PI/32.,0.,block*M_PI/8.,in1,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); ++pos; // Map 1 : Type 1 Had addCoords(4,4,0.1,M_PI/32.,0.,block*M_PI/8.,in1,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); ++pos; // Map 2 : Type 2 EM addCoords(4,1,0.1,M_PI/32.,0.0,block*M_PI/8.,in2a,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); addCoords(2,2,0.2,M_PI/16.,0.1,block*M_PI/8.,in2b,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); ++pos; // Map 3 : Type 2 Had addCoords(4,1,0.1,M_PI/32.,0.0,block*M_PI/8.,in2a,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); addCoords(2,2,0.2,M_PI/16.,0.1,block*M_PI/8.,in2b,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); ++pos; // Map 4 : Type 3 EM addCoords(2,2,0.2,M_PI/16.,0.0,block*M_PI/8.,in3a,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); addCoords(4,1,0.1,M_PI/32.,0.4,block*M_PI/8.,in3b,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); ++pos; // Map 5 : Type 3 Had addCoords(2,2,0.2,M_PI/16.,0.0,block*M_PI/8.,in3a,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); addCoords(4,1,0.1,M_PI/32.,0.4,block*M_PI/8.,in3b,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); ++pos; // Map 6 : Type 4 EM positive eta addCoords(4,1,0.2,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); addCoords(4,1,0.1,M_PI/16.,0.2,block*M_PI/4.,in4b,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); ++pos; // Map 7 : Type 4 Had positive eta addCoords(4,1,0.2,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); addCoords(4,1,0.1,M_PI/16.,0.2,block*M_PI/4.,in4b,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); ++pos; // Map 8 : Type 4 EM negative eta addCoords(4,1,0.1,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); addCoords(4,1,0.2,M_PI/16.,0.1,block*M_PI/4.,in4b,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); ++pos; // Map 9 : Type 4 Had negative eta addCoords(4,1,0.1,M_PI/16.,0.0,block*M_PI/4.,in4a,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); addCoords(4,1,0.2,M_PI/16.,0.1,block*M_PI/4.,in4b,out,incr, - ChannelCoordinate::HAD, *pos); + ChannelCoordinate::HAD, **pos); ++pos; // Map 10 : Type 5 EM FCAL addCoords(4,4,0.425,M_PI/8.,0.0,block*M_PI/2.,in5,out,incr, - ChannelCoordinate::EM, *pos); + ChannelCoordinate::EM, **pos); ++pos; // Map 11 : Type 6 Had FCAL2 and FCAL3 addCoords(4,2,0.85,M_PI/8.,0.0,block*M_PI/2.,in6a,out,incr, - ChannelCoordinate::FCAL2, *pos); + ChannelCoordinate::FCAL2, **pos); addCoords(4,2,0.85,M_PI/8.,0.0,block*M_PI/2.,in6b,out,incr, - ChannelCoordinate::FCAL3, *pos); + ChannelCoordinate::FCAL3, **pos); } // Fill crate map - std::vector<CoordinateMap*>::const_iterator pos = m_coordMaps.begin(); + std::vector<std::unique_ptr<CoordinateMap> >::const_iterator pos = m_coordMaps.begin(); // Map 0 : all of crates 0,1 // crate 2 modules 1,2,5,6,9,10,13,14 // crate 3 modules 2,3,6,7,10,11,14,15 - addMods(0,0,4,4, 0.0,0.0,0.4,M_PI/2.,*pos); - addMods(1,0,4,4,-1.6,0.0,0.4,M_PI/2.,*pos); - addMods(2,1,4,2, 1.6,0.0,0.4,M_PI/2.,*pos); - addMods(3,2,4,2,-2.4,0.0,0.4,M_PI/2.,*pos); + addMods(0,0,4,4, 0.0,0.0,0.4,M_PI/2.,pos->get()); + addMods(1,0,4,4,-1.6,0.0,0.4,M_PI/2.,pos->get()); + addMods(2,1,4,2, 1.6,0.0,0.4,M_PI/2.,pos->get()); + addMods(3,2,4,2,-2.4,0.0,0.4,M_PI/2.,pos->get()); ++pos; // Map 1 : crate 4 modules 1,2,5,6,9,10,13,14 // crate 5 modules 2,3,6,7,10,11,14,15 // all of crates 6,7 - addMods(4,1,4,2, 1.6,0.0,0.4,M_PI/2.,*pos); - addMods(5,2,4,2,-2.4,0.0,0.4,M_PI/2.,*pos); - addMods(6,0,4,4, 0.0,0.0,0.4,M_PI/2.,*pos); - addMods(7,0,4,4,-1.6,0.0,0.4,M_PI/2.,*pos); + addMods(4,1,4,2, 1.6,0.0,0.4,M_PI/2.,pos->get()); + addMods(5,2,4,2,-2.4,0.0,0.4,M_PI/2.,pos->get()); + addMods(6,0,4,4, 0.0,0.0,0.4,M_PI/2.,pos->get()); + addMods(7,0,4,4,-1.6,0.0,0.4,M_PI/2.,pos->get()); ++pos; // Map 2 : crate 2 modules 3,7,11,15 - addMods(2,3,4,1, 2.4,0.0,0.5,M_PI/2.,*pos); + addMods(2,3,4,1, 2.4,0.0,0.5,M_PI/2.,pos->get()); ++pos; // Map 3 : crate 4 modules 3,7,11,15 - addMods(4,3,4,1, 2.4,0.0,0.5,M_PI/2.,*pos); + addMods(4,3,4,1, 2.4,0.0,0.5,M_PI/2.,pos->get()); ++pos; // Map 4 : crate 3 modules 1,5,9,13 - addMods(3,1,4,1,-2.9,0.0,0.5,M_PI/2.,*pos); + addMods(3,1,4,1,-2.9,0.0,0.5,M_PI/2.,pos->get()); ++pos; // Map 5 : crate 5 modules 1,5,9,13 - addMods(5,1,4,1,-2.9,0.0,0.5,M_PI/2.,*pos); + addMods(5,1,4,1,-2.9,0.0,0.5,M_PI/2.,pos->get()); ++pos; // Map 6 : crate 2 modules 4,12 - addMods(2, 4,1,1, 2.9,0.0,0.3,M_PI,*pos); - addMods(2,12,1,1, 2.9,M_PI,0.3,M_PI,*pos); + addMods(2, 4,1,1, 2.9,0.0,0.3,M_PI,pos->get()); + addMods(2,12,1,1, 2.9,M_PI,0.3,M_PI,pos->get()); ++pos; // Map 7 : crate 4 modules 4,12 - addMods(4, 4,1,1, 2.9,0.0,0.3,M_PI,*pos); - addMods(4,12,1,1, 2.9,M_PI,0.3,M_PI,*pos); + addMods(4, 4,1,1, 2.9,0.0,0.3,M_PI,pos->get()); + addMods(4,12,1,1, 2.9,M_PI,0.3,M_PI,pos->get()); ++pos; // Map 8 : crate 3 modules 4,12 - addMods(3, 4,1,1,-3.2,0.0,0.3,M_PI,*pos); - addMods(3,12,1,1,-3.2,M_PI,0.3,M_PI,*pos); + addMods(3, 4,1,1,-3.2,0.0,0.3,M_PI,pos->get()); + addMods(3,12,1,1,-3.2,M_PI,0.3,M_PI,pos->get()); ++pos; // Map 9 : crate 5 modules 4,12 - addMods(5, 4,1,1,-3.2,0.0,0.3,M_PI,*pos); - addMods(5,12,1,1,-3.2,M_PI,0.3,M_PI,*pos); + addMods(5, 4,1,1,-3.2,0.0,0.3,M_PI,pos->get()); + addMods(5,12,1,1,-3.2,M_PI,0.3,M_PI,pos->get()); ++pos; // Map 10 : crate 4 module 0, crate 5 module 0 - addMods(4,0,1,1, 3.2,0.0,1.7,2*M_PI,*pos); - addMods(5,0,1,1,-4.9,0.0,1.7,2*M_PI,*pos); + addMods(4,0,1,1, 3.2,0.0,1.7,2*M_PI,pos->get()); + addMods(5,0,1,1,-4.9,0.0,1.7,2*M_PI,pos->get()); ++pos; // Map 11 : crate 4 module 8, crate 5 module 8 - addMods(4,8,1,1, 3.2,0.0,1.7,2*M_PI,*pos); - addMods(5,8,1,1,-4.9,0.0,1.7,2*M_PI,*pos); + addMods(4,8,1,1, 3.2,0.0,1.7,2*M_PI,pos->get()); + addMods(5,8,1,1,-4.9,0.0,1.7,2*M_PI,pos->get()); } // Set up eta/phi map @@ -422,7 +389,6 @@ void PpmMappingTool::setupInverseMap() { const unsigned int invalidChanId = s_crates*s_modules*s_channels; - m_etaPhiMap = new EtaPhiMap; for (int cr = 0; cr < s_crates; ++cr) { for (int mod = 0; mod < s_modules; ++mod) { for (int chan = 0; chan < s_channels; ++chan) { @@ -431,12 +397,12 @@ void PpmMappingTool::setupInverseMap() if (mapping(cr, mod, chan, tmpEta, tmpPhi, tmpLayer)) { const unsigned int key = etaPhiKey(tmpEta, tmpPhi); const unsigned int chanId = (cr * s_modules + mod) * s_channels + chan; - EtaPhiMap::iterator iter = m_etaPhiMap->find(key); - if (iter == m_etaPhiMap->end()) { + EtaPhiMap::iterator iter = m_etaPhiMap.find(key); + if (iter == m_etaPhiMap.end()) { ChannelIds ids(invalidChanId, invalidChanId); if (tmpLayer == 0) ids.first = chanId; else ids.second = chanId; - m_etaPhiMap->insert(std::make_pair(key, ids)); + m_etaPhiMap.insert(std::make_pair(key, ids)); } else { ChannelIds& ids(iter->second); if (tmpLayer == 0) ids.first = chanId; @@ -453,15 +419,15 @@ void PpmMappingTool::setupInverseMap() void PpmMappingTool::addCoords(const int nrows, const int ncols, const double etaGran, const double phiGran, const double etaOffset, const double phiOffset, const int* in, const int* out, const int incr, - const ChannelCoordinate::CaloLayer layer, CoordinateMap* coordMap) + const ChannelCoordinate::CaloLayer layer, CoordinateMap& coordMap) { for (int row = 0; row < nrows; ++row) { const double phi = (double(row) + 0.5) * phiGran + phiOffset; for (int col = 0; col < ncols; ++col) { const double eta = (double(col) + 0.5) * etaGran + etaOffset; const int channel = out[in[row*ncols+col]-1] + incr; - coordMap->insert(std::make_pair(channel, - ChannelCoordinate(layer, eta, phi, etaGran, phiGran))); + assert (channel < s_channels); + coordMap[channel] = ChannelCoordinate(layer, eta, phi, etaGran, phiGran); } } } @@ -473,22 +439,15 @@ void PpmMappingTool::addMods(const int crate, const int modOffset, const double phiBase, const double etaRange, const double phiRange, const CoordinateMap* coordMap) { + assert (crate < static_cast<int>(m_crateInfo.size())); + ModuleMap& modMap = m_crateInfo[crate]; for (int row = 0; row < nrows; ++row) { for (int col = 0; col < ncols; ++col) { const int module = row*4 + col + modOffset; const double etaOffset = etaRange * double(col) + etaBase; const double phiOffset = phiRange * double(row) + phiBase; Offsets off(etaOffset, phiOffset); - ModuleInfo modInfo(off, coordMap); - CrateMap::iterator cpos = m_crateInfo->find(crate); - if (cpos != m_crateInfo->end()) { - ModuleMap& modMap(cpos->second); - modMap.insert(std::make_pair(module, modInfo)); - } else { - ModuleMap modMap; - modMap.insert(std::make_pair(module, modInfo)); - m_crateInfo->insert(std::make_pair(crate, modMap)); - } + modMap[module] = ModuleInfo (off, coordMap); } } } diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h index 0321ec2e05e..ce33e76c3ca 100644 --- a/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h +++ b/Trigger/TrigT1/TrigT1CaloMappingTools/src/PpmMappingTool.h @@ -9,6 +9,7 @@ #include <string> #include <utility> #include <vector> +#include <array> #include "AthenaBaseComps/AthAlgTool.h" @@ -32,32 +33,33 @@ namespace LVL1 { * @author Peter Faulkner */ -class PpmMappingTool : virtual public IL1CaloMappingTool, - public AthAlgTool { - +class PpmMappingTool : public extends<AthAlgTool, IL1CaloMappingTool> +{ public: - PpmMappingTool(const std::string& type, const std::string& name, - const IInterface* parent); - virtual ~PpmMappingTool(); + using base_class::base_class; - virtual StatusCode initialize(); - virtual StatusCode finalize(); + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; /// Return eta, phi and layer mapping for given crate/module/channel virtual bool mapping(int crate, int module, int channel, - double& eta, double& phi, int& layer); + double& eta, double& phi, int& layer) const override; /// Return crate, module and channel mapping for given eta/phi/layer virtual bool mapping(double eta, double phi, int layer, - int& crate, int& module, int& channel); + int& crate, int& module, int& channel) const override; private: + static const int s_crates = 8; + static const int s_modules = 16; + static const int s_channels = 64; + // Crate/module map constituents typedef std::pair< double, double > Offsets; - typedef std::map< int, ChannelCoordinate > CoordinateMap; + typedef std::array< ChannelCoordinate, s_channels> CoordinateMap; typedef std::pair< Offsets, const CoordinateMap* > ModuleInfo; - typedef std::map< int, ModuleInfo > ModuleMap; - typedef std::map< int, ModuleMap > CrateMap; + typedef std::array< ModuleInfo, s_modules > ModuleMap; + typedef std::array< ModuleMap, s_crates > CrateMap; // Inverse map constituents typedef std::pair< unsigned int, unsigned int > ChannelIds; typedef std::map< unsigned int, ChannelIds > EtaPhiMap; @@ -70,7 +72,7 @@ class PpmMappingTool : virtual public IL1CaloMappingTool, void addCoords(int nrows, int ncols, double etaGran, double phiGran, double etaOffset, double phiOffset, const int* in, const int* out, int incr, - ChannelCoordinate::CaloLayer layer, CoordinateMap* coordMap); + ChannelCoordinate::CaloLayer layer, CoordinateMap& coordMap); /// Add a block of similar modules to a crate void addMods(int crate, int modOffset, int nrows, int ncols, double etaBase, double phiBase, double etaRange, double phiRange, @@ -81,26 +83,11 @@ class PpmMappingTool : virtual public IL1CaloMappingTool, unsigned int etaPhiKey(double eta, double phi) const; /// Pointer to crate/module map - CrateMap* m_crateInfo; + std::array<ModuleMap, s_crates> m_crateInfo; /// Vector of CoordinateMaps - std::vector<CoordinateMap*> m_coordMaps; - /// Current Coordinate map - mutable const CoordinateMap* m_currentMap; - /// Current module eta offset - mutable double m_etaOffset; - /// Current module phi offset - mutable double m_phiOffset; - /// Current crate - mutable int m_currentCrate; - /// Current module - mutable int m_currentModule; + std::vector<std::unique_ptr<CoordinateMap> > m_coordMaps; /// Pointer to inverse map - EtaPhiMap* m_etaPhiMap; - - static const int s_crates = 8; - static const int s_modules = 16; - static const int s_channels = 64; - + EtaPhiMap m_etaPhiMap; }; } // end namespace -- GitLab