diff --git a/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt b/Trigger/TrigT1/TrigT1CaloMappingTools/CMakeLists.txt index b93a3aaa75019078ec894d6c41798ebb94dbc0c1..e20905e1ac95427c476e58cccdfbab44aeb679cf 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 38eefc95c06d6592d3249f8d56a01ad189c6736d..0a58ccc4e1a8d343d5f06ec9c446331d605f2d0e 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 d6fc878ffc59567dc80a66ff8979f155a6fe61f9..d300818a102c743960134dc0221f1c8715423007 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 307270f96bd48351e6d61737a55110e6a37259d6..02cf7ebe08eed7f5632a03b0c70088a6b2c656e4 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 b6466a239c1e1b4d32eb0f481c86c5fd09ab8ea1..5641ab7fe20e35b61ad2cf77913826903310a89d 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 182b296046d96eb6b59d0f94c34510c3723e941c..a81b48b24b709d8de415327b5f204115100d9f01 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 6afbbfe036d923058e6894fe7ecaf4649671b9e2..686bfbd8ceff6374fa020396da044524e1aa5d3b 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 2b02417fc6a0ead68af73e41dcd2533ca3f1c0b0..58a2187b891dfe1dd7985d2c831016b782b72cc8 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 fc8cb0ba1e27940757f1b6f0e8a50b3c5606b491..1ddbc055b02c24aedfbe8233b7346e06ff723f61 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 e4e7f3ea82c897975511781d87802ec907afada8..3715f4b63978064030439a0863905a1bc8c09fec 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 0321ec2e05e25f08d79efa1b569d4b76a50c0acf..ce33e76c3caf39ee9f824b0cacc15ef5ece60b15 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 diff --git a/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h b/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h index 3a744a208b007e77a1602a1b4ea82ca6c86a9dae..52851c5cfdaa2e97985c9494ab6334a773f777f7 100644 --- a/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h +++ b/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1CaloMappingTool.h @@ -10,25 +10,18 @@ namespace LVL1 { -static const InterfaceID IID_IL1CaloMappingTool("LVL1::IL1CaloMappingTool", 1, 0); - class IL1CaloMappingTool : virtual public IAlgTool { - public: - static const InterfaceID& interfaceID(); +public: + DeclareInterfaceID (IL1CaloMappingTool, 1, 0); virtual bool mapping(int crate, int module, int channel, - double& eta, double& phi, int& layer) = 0; + double& eta, double& phi, int& layer) const = 0; virtual bool mapping(double eta, double phi, int layer, - int& crate, int& module, int& channel) = 0; + int& crate, int& module, int& channel) const = 0; }; -inline const InterfaceID& IL1CaloMappingTool::interfaceID() -{ - return IID_IL1CaloMappingTool; -} - } // end of namespace #endif