Skip to content
Snippets Groups Projects
Commit 8eeb6c29 authored by Vakhtang Tsulaia's avatar Vakhtang Tsulaia
Browse files

Merge branch 'master-SCTSiLorentzAngleCondAlg' into 'master'

Make SCTSiLorentzAngleCondAlg and SCTSiPropertiesCondAlg reentrant (ATLASRECTS-4824)

See merge request !20515
parents 2d75dc50 07ad34fb
No related merge requests found
/*
Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
*/
/**
......@@ -18,39 +18,27 @@
// Gaudi include
#include "GaudiKernel/PhysicalConstants.h"
#include "GaudiKernel/SystemOfUnits.h"
// STL include
SCTSiLorentzAngleCondAlg::SCTSiLorentzAngleCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
::AthAlgorithm(name, pSvcLocator),
::AthReentrantAlgorithm(name, pSvcLocator),
m_condSvc{"CondSvc", name},
m_magFieldSvc{"AtlasFieldSvc", name},
m_maxHash{0}
{
// YOU NEED TO USE THE SAME PROPERTIES AS USED IN SCTLorentzAngleTool!!!
declareProperty("MagFieldSvc", m_magFieldSvc);
declareProperty("Temperature", m_temperature = -7., "Default temperature in Celcius.");
declareProperty("DepletionVoltage", m_deplVoltage = 70., "Default depletion voltage in Volt.");
declareProperty("BiasVoltage", m_biasVoltage = 150., "Default bias voltage in Volt.");
declareProperty("NominalField", m_nominalField = 2.0834*Gaudi::Units::tesla);
declareProperty("UseMagFieldSvc", m_useMagFieldSvc = true);
declareProperty("UseMagFieldDcs", m_useMagFieldDcs = true);
declareProperty("useSctDefaults", m_sctDefaults = false);
declareProperty("UseGeoModel", m_useGeoModel = false);
declareProperty("TemperatureMin", m_temperatureMin = -80., "Minimum temperature allowed in Celcius.");
declareProperty("TemperatureMax", m_temperatureMax = 100., "Maximum temperature allowed in Celcius.");
}
StatusCode SCTSiLorentzAngleCondAlg::initialize()
{
if (m_siConditionsTool.empty()) m_sctDefaults = true;
if (m_siConditionsTool.empty()) m_sctDefaults.setValue(true);
if (not m_sctDefaults) {
if (not m_sctDefaults.value()) {
// SCTSiliconConditionsTool
ATH_CHECK(m_siConditionsTool.retrieve());
// Read Cond handle
if (not m_useGeoModel) {
if (not m_useGeoModel.value()) {
ATH_CHECK(m_readKeyTemp.initialize());
ATH_CHECK(m_readKeyHV.initialize());
}
......@@ -58,11 +46,11 @@ StatusCode SCTSiLorentzAngleCondAlg::initialize()
m_siConditionsTool.disable();
}
if (m_useMagFieldSvc) {
if (m_useMagFieldSvc.value()) {
// MagFieldSvc
ATH_CHECK(m_magFieldSvc.retrieve());
// Read Cond handle
if (m_useMagFieldDcs) {
if (m_useMagFieldDcs.value()) {
ATH_CHECK(m_readKeyBFieldSensor.initialize());
}
}
......@@ -85,10 +73,10 @@ StatusCode SCTSiLorentzAngleCondAlg::initialize()
return StatusCode::SUCCESS;
}
StatusCode SCTSiLorentzAngleCondAlg::execute()
StatusCode SCTSiLorentzAngleCondAlg::execute(const EventContext& ctx) const
{
// Write Cond Handle
SG::WriteCondHandle<SiLorentzAngleCondData> writeHandle{m_writeKey};
SG::WriteCondHandle<SiLorentzAngleCondData> writeHandle{m_writeKey, ctx};
// Do we have a valid Write Cond Handle for current time?
if (writeHandle.isValid()) {
ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
......@@ -107,7 +95,7 @@ StatusCode SCTSiLorentzAngleCondAlg::execute()
EventIDRange rangeBField{eidStart, eidStop};
// Get SCT_DetectorElementCollection
SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> sctDetEle(m_SCTDetEleCollKey);
SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> sctDetEle(m_SCTDetEleCollKey, ctx);
const InDetDD::SiDetectorElementCollection* elements(sctDetEle.retrieve());
if (elements==nullptr) {
ATH_MSG_FATAL(m_SCTDetEleCollKey.fullKey() << " could not be retrieved");
......@@ -119,9 +107,9 @@ StatusCode SCTSiLorentzAngleCondAlg::execute()
return StatusCode::FAILURE;
}
if ((not m_sctDefaults) and (not m_useGeoModel)) {
if ((not m_sctDefaults.value()) and (not m_useGeoModel.value())) {
// Read Cond Handle (temperature)
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleTemp{m_readKeyTemp};
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleTemp{m_readKeyTemp, ctx};
const SCT_DCSFloatCondData* readCdoTemp{*readHandleTemp};
if (readCdoTemp==nullptr) {
ATH_MSG_FATAL("Null pointer to the read conditions object");
......@@ -135,7 +123,7 @@ StatusCode SCTSiLorentzAngleCondAlg::execute()
ATH_MSG_INFO("Input is " << readHandleTemp.fullKey() << " with the range of " << rangeTemp);
// Read Cond Handle (HV)
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleHV{m_readKeyHV};
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleHV{m_readKeyHV, ctx};
const SCT_DCSFloatCondData* readCdoHV{*readHandleHV};
if (readCdoHV==nullptr) {
ATH_MSG_FATAL("Null pointer to the read conditions object");
......@@ -156,10 +144,10 @@ StatusCode SCTSiLorentzAngleCondAlg::execute()
}
}
if (m_useMagFieldSvc) {
if (m_useMagFieldDcs) {
if (m_useMagFieldSvc.value()) {
if (m_useMagFieldDcs.value()) {
// Read Cond Handle (B field sensor)
SG::ReadCondHandle<CondAttrListCollection> readHandleBFieldSensor{m_readKeyBFieldSensor};
SG::ReadCondHandle<CondAttrListCollection> readHandleBFieldSensor{m_readKeyBFieldSensor, ctx};
const CondAttrListCollection* readCdoBFieldSensor{*readHandleBFieldSensor};
if (readCdoBFieldSensor==nullptr) {
ATH_MSG_FATAL("Null pointer to the read conditions object");
......@@ -200,10 +188,10 @@ StatusCode SCTSiLorentzAngleCondAlg::execute()
double deplVoltage{0.0};
double biasVoltage{0.0};
if (m_sctDefaults) {
temperatureC = m_temperature;
deplVoltage = m_deplVoltage * CLHEP::volt;
biasVoltage = m_biasVoltage * CLHEP::volt;
if (m_sctDefaults.value()) {
temperatureC = m_temperature.value();
deplVoltage = m_deplVoltage.value() * CLHEP::volt;
biasVoltage = m_biasVoltage.value() * CLHEP::volt;
} else {
temperatureC = m_siConditionsTool->temperature(elementHash);
deplVoltage = m_siConditionsTool->depletionVoltage(elementHash) * CLHEP::volt;
......@@ -213,8 +201,8 @@ StatusCode SCTSiLorentzAngleCondAlg::execute()
// Protect against invalid temperature
if (not ((temperatureC>m_temperatureMin) and (temperatureC<m_temperatureMax))) {
temperatureC = m_temperature;
ATH_MSG_DEBUG("Invalid temperature: " << temperatureC << " C. " << "Setting to " << m_temperature << " C. " << "Detector element hash: " << elementHash);
temperatureC = m_temperature.value();
ATH_MSG_DEBUG("Invalid temperature: " << temperatureC << " C. " << "Setting to " << m_temperature.value() << " C. " << "Detector element hash: " << elementHash);
}
double temperature{temperatureC + Gaudi::Units::STP_Temperature}; // C -> K
......@@ -293,7 +281,7 @@ StatusCode SCTSiLorentzAngleCondAlg::finalize()
}
Amg::Vector3D SCTSiLorentzAngleCondAlg::getMagneticField(const InDetDD::SiDetectorElement* element) const {
if (m_useMagFieldSvc) {
if (m_useMagFieldSvc.value()) {
Amg::Vector3D pointvec{element->center()};
ATH_MSG_VERBOSE("Getting magnetic field from magnetic field service.");
double point[3];
......
......@@ -10,7 +10,7 @@
#define SCTSiLorentzAngleCondAlg_h
// Athena includes
#include "AthenaBaseComps/AthAlgorithm.h"
#include "AthenaBaseComps/AthReentrantAlgorithm.h"
#include "AthenaPoolUtilities/CondAttrListCollection.h"
#include "GeoPrimitives/GeoPrimitives.h"
......@@ -24,6 +24,7 @@
// Gaudi includes
#include "GaudiKernel/ICondSvc.h"
#include "GaudiKernel/ServiceHandle.h"
#include "GaudiKernel/SystemOfUnits.h"
#include "GaudiKernel/ToolHandle.h"
// forward declarations
......@@ -36,13 +37,13 @@ namespace MagField {
* This class prepares SiLorentAngleCondData using SiPropertiesTool
**/
class SCTSiLorentzAngleCondAlg: public AthAlgorithm
class SCTSiLorentzAngleCondAlg: public AthReentrantAlgorithm
{
public:
SCTSiLorentzAngleCondAlg(const std::string& name, ISvcLocator* pSvcLocator);
virtual ~SCTSiLorentzAngleCondAlg() = default;
virtual StatusCode initialize() override;
virtual StatusCode execute() override;
virtual StatusCode execute(const EventContext& ctx) const override;
virtual StatusCode finalize() override;
private:
......@@ -60,17 +61,18 @@ class SCTSiLorentzAngleCondAlg: public AthAlgorithm
ToolHandle<ISiliconConditionsTool> m_siConditionsTool{this, "SiConditionsTool", "SCT_SiliconConditionsTool", "Tool to retrieve SCT silicon information"};
// Properties
double m_temperature;
double m_deplVoltage;
double m_biasVoltage;
double m_nominalField;
bool m_useMagFieldSvc;
bool m_useMagFieldDcs;
bool m_sctDefaults;
bool m_useGeoModel;
// YOU NEED TO USE THE SAME PROPERTIES AS USED IN SCTLorentzAngleTool!!!
DoubleProperty m_temperature{this, "Temperature", -7., "Default temperature in Celcius."};
DoubleProperty m_temperatureMin{this, "TemperatureMin", -80., "Minimum temperature allowed in Celcius."};
DoubleProperty m_temperatureMax{this, "TemperatureMax", 100., "Maximum temperature allowed in Celcius."};
DoubleProperty m_deplVoltage{this, "DepletionVoltage", 70., "Default depletion voltage in Volt."};
DoubleProperty m_biasVoltage{this, "BiasVoltage", 150., "Default bias voltage in Volt."};
DoubleProperty m_nominalField{this, "NominalField", 2.0834*Gaudi::Units::tesla};
BooleanProperty m_useMagFieldSvc{this, "UseMagFieldSvc", true};
BooleanProperty m_useMagFieldDcs{this, "UseMagFieldDcs", true};
BooleanProperty m_sctDefaults{this, "useSctDefaults", false};
BooleanProperty m_useGeoModel{this, "UseGeoModel", false};
unsigned int m_maxHash;
double m_temperatureMin;
double m_temperatureMax;
Amg::Vector3D getMagneticField(const InDetDD::SiDetectorElement* element) const;
};
......
/*
Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
*/
#include "SCTSiPropertiesCondAlg.h"
......@@ -14,7 +14,7 @@
#include <memory>
SCTSiPropertiesCondAlg::SCTSiPropertiesCondAlg(const std::string& name, ISvcLocator* pSvcLocator)
: ::AthAlgorithm(name, pSvcLocator)
: ::AthReentrantAlgorithm(name, pSvcLocator)
, m_condSvc{"CondSvc", name}
, m_pHelper{nullptr}
{
......@@ -37,7 +37,7 @@ StatusCode SCTSiPropertiesCondAlg::initialize() {
ATH_CHECK(m_SCTDetEleCollKey.initialize());
// Write Cond Handle
ATH_CHECK(m_writeKey.initialize());
if(m_condSvc->regHandle(this, m_writeKey).isFailure()) {
if (m_condSvc->regHandle(this, m_writeKey).isFailure()) {
ATH_MSG_FATAL("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc");
return StatusCode::FAILURE;
}
......@@ -45,11 +45,11 @@ StatusCode SCTSiPropertiesCondAlg::initialize() {
return StatusCode::SUCCESS;
}
StatusCode SCTSiPropertiesCondAlg::execute() {
StatusCode SCTSiPropertiesCondAlg::execute(const EventContext& ctx) const {
ATH_MSG_DEBUG("execute " << name());
// Write Cond Handle
SG::WriteCondHandle<InDet::SiliconPropertiesVector> writeHandle{m_writeKey};
SG::WriteCondHandle<InDet::SiliconPropertiesVector> writeHandle{m_writeKey, ctx};
// Do we have a valid Write Cond Handle for current time?
if (writeHandle.isValid()) {
ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
......@@ -59,7 +59,7 @@ StatusCode SCTSiPropertiesCondAlg::execute() {
}
// Read Cond Handle (temperature)
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleTemp{m_readKeyTemp};
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleTemp{m_readKeyTemp, ctx};
const SCT_DCSFloatCondData* readCdoTemp{*readHandleTemp};
if (readCdoTemp==nullptr) {
ATH_MSG_FATAL("Null pointer to the read conditions object");
......@@ -73,7 +73,7 @@ StatusCode SCTSiPropertiesCondAlg::execute() {
ATH_MSG_INFO("Input is " << readHandleTemp.fullKey() << " with the range of " << rangeTemp);
// Read Cond Handle (HV)
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleHV{m_readKeyHV};
SG::ReadCondHandle<SCT_DCSFloatCondData> readHandleHV{m_readKeyHV, ctx};
const SCT_DCSFloatCondData* readCdoHV{*readHandleHV};
if (readCdoHV==nullptr) {
ATH_MSG_FATAL("Null pointer to the read conditions object");
......@@ -94,7 +94,7 @@ StatusCode SCTSiPropertiesCondAlg::execute() {
}
// Get SCT_DetectorElementCollection
SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> sctDetEle(m_SCTDetEleCollKey);
SG::ReadCondHandle<InDetDD::SiDetectorElementCollection> sctDetEle(m_SCTDetEleCollKey, ctx);
const InDetDD::SiDetectorElementCollection* elements(sctDetEle.retrieve());
if (elements==nullptr) {
ATH_MSG_FATAL(m_SCTDetEleCollKey.fullKey() << " could not be retrieved");
......
/*
Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
*/
#ifndef SCTSIPROPERTIESCONDALG
#define SCTSIPROPERTIESCONDALG
#include "AthenaBaseComps/AthAlgorithm.h"
#include "AthenaBaseComps/AthReentrantAlgorithm.h"
#include "InDetConditionsSummaryService/ISiliconConditionsTool.h"
#include "InDetReadoutGeometry/SiDetectorElementCollection.h"
......@@ -20,13 +20,13 @@
class SCT_ID;
class SCTSiPropertiesCondAlg : public AthAlgorithm
class SCTSiPropertiesCondAlg : public AthReentrantAlgorithm
{
public:
SCTSiPropertiesCondAlg(const std::string& name, ISvcLocator* pSvcLocator);
virtual ~SCTSiPropertiesCondAlg() = default;
virtual StatusCode initialize() override;
virtual StatusCode execute() override;
virtual StatusCode execute(const EventContext& ctx) const override;
virtual StatusCode finalize() override;
private:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment