diff --git a/InnerDetector/InDetConditions/SCT_ConditionsData/SCT_ConditionsData/SCT_CondParameterData.h b/InnerDetector/InDetConditions/SCT_ConditionsData/SCT_ConditionsData/SCT_CondParameterData.h new file mode 100644 index 0000000000000000000000000000000000000000..0766f2166aa63d0aa8336d581cc4ea317444ba49 --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsData/SCT_ConditionsData/SCT_CondParameterData.h @@ -0,0 +1,80 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/** + * SCT_CondParameterData.h + * @file header file for data object + * @author Susumu Oda - 2018-01-25 + **/ + +#ifndef SCT_CONDPARAMETERDATA_H +#define SCT_CONDPARAMETERDATA_H + +// STL include +#include <vector> + +// boost include +#include "boost/array.hpp" + +// Athena includes +#include "Identifier/IdentifierHash.h" +#include "AthenaKernel/CLASS_DEF.h" + +class SCT_CondParameterData { +public: + // Parameters + enum ParameterIndex{AVG_THRESHOLD, N_PARAMETERS, INVALID_PARAMETER}; + + //constructor + SCT_CondParameterData(); + + //destructor + virtual ~SCT_CondParameterData(); + //@name main methods + //@{ + /// Get the indicated value for a module identifier hash + float getValue(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam) const; + /// Fill a user-provided vector with the values + void getValues(std::vector<float>& userVector, const SCT_CondParameterData::ParameterIndex iparam) const; + /// Get the indicated value for a module identifier hash + void setValue(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam, const float value); + /// Extended methods for data structure insertion + bool insert(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam, const float value); + /// Is a given value within acceptable limits? + bool isValid(const float parameterValue, const SCT_CondParameterData::ParameterIndex iparam) const; + /// What is the default error value for this parameter? + float invalid(const unsigned int iparam) const; + /// Get maximum value + float max(const SCT_CondParameterData::ParameterIndex iparam) const; + /// Get minimum value + float min(const SCT_CondParameterData::ParameterIndex iparam) const; + /// Get average value + float avg(const SCT_CondParameterData::ParameterIndex iparam) const; + /// Get standard deviation + float sd(const SCT_CondParameterData::ParameterIndex iparam) const; + /// Get the number of values + unsigned int n(const SCT_CondParameterData::ParameterIndex iparam) const; + /// Clear all data members + void clear(); + //@} + +private: + enum {N_ELEMENTS=8176}; + + boost::array<boost::array<float, N_PARAMETERS>, N_ELEMENTS > m_values; + + float m_min[N_PARAMETERS]; + float m_max[N_PARAMETERS]; + unsigned int m_n[N_PARAMETERS]; + float m_sum[N_PARAMETERS]; + float m_sumsq[N_PARAMETERS]; +}; + +CLASS_DEF( SCT_CondParameterData , 34383719 , 1 ) + +#include "AthenaKernel/CondCont.h" +CONDCONT_DEF( SCT_CondParameterData, 3856939 ); + + +#endif // SCT_CONDPARAMETERDATA_H diff --git a/InnerDetector/InDetConditions/SCT_ConditionsData/src/SCT_CondParameterData.cxx b/InnerDetector/InDetConditions/SCT_ConditionsData/src/SCT_CondParameterData.cxx new file mode 100644 index 0000000000000000000000000000000000000000..37eecd5da17853993641367aeefc644cf3c46df3 --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsData/src/SCT_CondParameterData.cxx @@ -0,0 +1,114 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "SCT_ConditionsData/SCT_CondParameterData.h" + +#include <limits> +#include <cmath> + +// constructor +SCT_CondParameterData::SCT_CondParameterData() { + clear(); +} + +// destructor +SCT_CondParameterData::~SCT_CondParameterData() { +} + +// Get the indicated value for a module identifier hash +float SCT_CondParameterData::getValue(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam) const { + return m_values[idHash][iparam]; +} + +// Fill a user-provided vector with the values +void SCT_CondParameterData::getValues(std::vector<float>& userVector, const SCT_CondParameterData::ParameterIndex iparam) const { + for (unsigned int i{0}; i!=m_values.size(); ++i) { + userVector.push_back(m_values[i][iparam]); + } +} + +/// Get the indicated value for a module identifier hash +void SCT_CondParameterData::setValue(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam, const float value) { + if (insert(idHash, iparam, value)) { + m_n[iparam]++; + m_sum[iparam] += value; + m_sumsq[iparam] += value*value; + m_min[iparam] = std::min(m_min[iparam], value); + m_max[iparam] = std::max(m_max[iparam], value); + } +} + +// Extended methods for data structure insertion +bool SCT_CondParameterData::insert(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam, const float theValue) { + // theValue must be valid + if (not isValid(theValue, iparam)) return false; + boost::array<float,N_PARAMETERS>& paramArray = m_values[idHash]; + // initial value should be invalid, only insert if this is the case + if (not isValid(paramArray[iparam], iparam)) { + paramArray[iparam] = theValue; + return true; + } else { + return false; + } +} + +// Is a given value within acceptable limits? +bool SCT_CondParameterData::isValid(const float parameterValue, const SCT_CondParameterData::ParameterIndex iparam) const { + // Second condition is to check if it is nan. + if (iparam==AVG_THRESHOLD and (parameterValue!=parameterValue)) return false; + return true; +} + +// What is the default error value for this parameter? +float SCT_CondParameterData::invalid(const unsigned int iparam) const { + float result{0.0}; + if (iparam==AVG_THRESHOLD) { + result=std::numeric_limits<float>::quiet_NaN(); + } + return result; +} + +// Get maximum value +float SCT_CondParameterData::max(const SCT_CondParameterData::ParameterIndex iparam) const { + return m_max[iparam]; +} + +// Get minimum value +float SCT_CondParameterData::min(const SCT_CondParameterData::ParameterIndex iparam) const { + return m_min[iparam]; +} + +// Get average value +float SCT_CondParameterData::avg(const SCT_CondParameterData::ParameterIndex iparam) const { + return (m_n[iparam]!=0)?(m_sum[iparam]/m_n[iparam]):(std::numeric_limits<float>::quiet_NaN()); +} + +// Get standard deviation +float SCT_CondParameterData::sd(const SCT_CondParameterData::ParameterIndex iparam) const { + float mu{m_sum[iparam]/m_n[iparam]}; + return std::sqrt((m_sumsq[iparam]/m_n[iparam]) - mu*mu); +} + +// Get the number of values +unsigned int SCT_CondParameterData::n(const SCT_CondParameterData::ParameterIndex iparam) const { + return m_n[iparam]; +} + +// Clear all data members +void SCT_CondParameterData::clear() { + boost::array<float, N_PARAMETERS> init; + for (unsigned int i{0}; i!=N_PARAMETERS; ++i) { + m_min[i] = std::numeric_limits<float>::max(); + m_max[i] = std::numeric_limits<float>::min(); + m_n[i] = 0; + m_sum[i] = 0.0; + m_sumsq[i] = 0.0; + init[i] = invalid(i); + } + + //initialize boost array + for (unsigned int i{0}; i!=N_ELEMENTS; ++i) { + m_values[i] = init; + } +} diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/ISCT_ConditionsParameterSvc.h b/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/ISCT_ConditionsParameterSvc.h index 2ec3e1865c6a3d1c9b69d6d7737e5730e36e98a3..c8910b628a2630cf95cd3631da31a9f667da72d7 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/ISCT_ConditionsParameterSvc.h +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/ISCT_ConditionsParameterSvc.h @@ -18,7 +18,7 @@ #include "GaudiKernel/IInterface.h" //local includes -#include "SCT_ConditionsServices/SCT_ConditionsParameters.h" +#include "SCT_ConditionsData/SCT_CondParameterData.h" //fwd declarations class IdentifierHash; @@ -33,37 +33,37 @@ class ISCT_ConditionsParameterSvc: virtual public IInterface { static const InterfaceID& interfaceID(); //!< reimplemented from IInterface ///Is the required parameter available? - virtual bool available(const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual bool available(const SCT_CondParameterData::ParameterIndex iparam)=0; ///Give the indicated value for a module identifier hash - virtual float value(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual float value(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam)=0; ///Measure of how many valid values went to calculate it. Should be 1 but if, say, 3 chip values were valid out of 6, it could be less (0.5 in this case) - virtual float validity(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual float validity(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam)=0; ///Is a given value within acceptable limits? - virtual bool isValid(const float parameterValue, const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual bool isValid(const float parameterValue, const SCT_CondParameterData::ParameterIndex iparam)=0; ///What is the default error value for this parameter? virtual float invalid(const unsigned int iparam) const =0; ///Maximum value read in from the database - virtual float max(const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual float max(const SCT_CondParameterData::ParameterIndex iparam)=0; ///Minimum value read in from the database - virtual float min(const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual float min(const SCT_CondParameterData::ParameterIndex iparam)=0; ///Average value - virtual float avg(const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual float avg(const SCT_CondParameterData::ParameterIndex iparam)=0; ///Standard deviation - virtual float sd(const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual float sd(const SCT_CondParameterData::ParameterIndex iparam)=0; ///Number of values read in - virtual unsigned int n(const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual unsigned int n(const SCT_CondParameterData::ParameterIndex iparam)=0; ///Fill a user-provided vector with the values (hopefully won't be needed?) - virtual void getValues(std::vector<float>& userVector, const SCT_ConditionsServices::ParameterIndex iparam)=0; + virtual void getValues(std::vector<float>& userVector, const SCT_CondParameterData::ParameterIndex iparam)=0; ///Report whether the structure was filled virtual bool filled() const =0; diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/SCT_ConditionsParameters.h b/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/SCT_ConditionsParameters.h index b8821e674ec6690497bda938d6503a58e60a3214..3b2c25139444b11c412aaa269d6ad6714b97af72 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/SCT_ConditionsParameters.h +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/SCT_ConditionsServices/SCT_ConditionsParameters.h @@ -26,8 +26,6 @@ namespace SCT_ConditionsServices{ INDEX_HVfraction=1, INDEX_MajorityState=3}; enum Bec{bec_ECC=-2, bec_BARREL=0, bec_ECA=+2}; - enum ParameterIndex{AVG_THRESHOLD, N_PARAMETERS, INVALID_PARAMETER}; - static const std::string parameterNames[]{"average threshold per module side","number of parameters"}; } #endif // SCT_ConditionsParameters_h diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/share/testParameters.py b/InnerDetector/InDetConditions/SCT_ConditionsServices/share/testParameters.py index c992fe7f958aee2a8c43044b69c097ceafbc4304..4bc586fc2e68b28f72ba161b9d75bbdc5607d14a 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/share/testParameters.py +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/share/testParameters.py @@ -118,8 +118,16 @@ from IOVDbSvc.CondDB import conddb conddb.dbdata="COMP200" IOVDbSvc.GlobalTag=globalflags.ConditionsTag() IOVDbSvc.OutputLevel = 3 -conddb.addFolder('',"<db>COOLONL_SCT/COMP200</db> /SCT/DAQ/Configuration/Chip") +conddb.addFolder('',"<db>COOLONL_SCT/COMP200</db> /SCT/DAQ/Configuration/Chip", className="CondAttrListVec") conddb.addFolder("","<db>COOLONL_SCT/COMP200</db> /SCT/DAQ/Configuration/ROD") conddb.addFolder("","<db>COOLONL_SCT/COMP200</db> /SCT/DAQ/Configuration/Geog") conddb.addFolder("","<db>COOLONL_SCT/COMP200</db> /SCT/DAQ/Configuration/RODMUR") conddb.addFolder("","<db>COOLONL_SCT/COMP200</db> /SCT/DAQ/Configuration/MUR") + +from IOVSvc.IOVSvcConf import CondSvc +ServiceMgr += CondSvc() +from AthenaCommon.AlgSequence import AthSequencer +condSeq = AthSequencer("AthCondSeq") + +from SCT_ConditionsServices.SCT_ConditionsServicesConf import SCT_ConditionsParameterCondAlg +condSeq += SCT_ConditionsParameterCondAlg( "SCT_ConditionsParameterCondAlg" ) diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterCondAlg.cxx b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterCondAlg.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d09d725974394637603bb3288870ba7db448fbee --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterCondAlg.cxx @@ -0,0 +1,193 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#include "SCT_ConditionsParameterCondAlg.h" + +#include "SCT_Chip.h" +#include "AthenaPoolUtilities/CondAttrListVec.h" +#include "Identifier/IdentifierHash.h" +#include "GaudiKernel/EventIDRange.h" + +namespace {//anonymous namespace introduces file-scoped functions + //is the value 'Not-a-Number' ? + template <typename T> + bool is_nan(const T& val) { + return val!=val; //NaN is only value for which this is true + } + //response curve fit possibilities + enum ResponseCurveFit{NO_CURVE=0, POLYNOMIAL, GRILLO, EXPONENTIAL, LINEAR, N_FUNCS}; //'Grillo' refers to Alex Grillo, Santa Cruz, who worked on SCT electronics development + //response curve fit function + float responseCurve(const float param0, const float param1, const float param2, const float vthreshold, const unsigned int rcFunc) { + float result{std::numeric_limits<float>::quiet_NaN()}; + switch (rcFunc) { + case LINEAR: + if (param1!=0.0) { + result = (vthreshold - param0)/param1; + } + break; + case EXPONENTIAL: + if ((vthreshold - param2)!=0) { + float err2{param0/(vthreshold-param2)-1.0f}; + if (err2 > 0.0) { + result = -param1*std::log(err2); + } + } + break; + case GRILLO: + if (param2!=0) { + float err3{param1*(1.0f-((vthreshold-param0)/param2))}; + if (err3!=0) { + result = (vthreshold-param0)/err3; + } + } + break; + case POLYNOMIAL: + if (param2!=0) { + result = (-param1 + std::sqrt((param1*param1)-(4.0*param2*(param0-vthreshold)))) / 2.0*param2; + } + break; + default: + //nop + break; + }//switch + if (is_nan(result)) return result; + result *= result; + return result; + }//func responseCurve + + void parseResponseCurveArguments(float* p, const std::string& arguments) { + //string is of form: + //p0 1.284730e+03 p1 5.830000e+00 p2 -5.989900e+02 + float *p0{&p[0]}; + float *p1{&p[1]}; + float *p2{&p[2]}; + std::sscanf(arguments.c_str(), "p0 %50e p1 %50e p2 %50e", p0, p1, p2); + } + //folder to retrieve for threshold parameters + const std::string chipFolderName{"/SCT/DAQ/Configuration/Chip"}; //CoraCool folder in the DB +}//namespace + +SCT_ConditionsParameterCondAlg::SCT_ConditionsParameterCondAlg(const std::string& name, ISvcLocator* pSvcLocator) + : ::AthAlgorithm(name, pSvcLocator) + , m_readKey{"/SCT/DAQ/Configuration/Chip"} + , m_writeKey{"SCT_CondParameterData"} + , m_cablingSvc{"SCT_CablingSvc", name} + , m_condSvc{"CondSvc", name} +{ + declareProperty("ReadKey", m_readKey, "Key of input (raw) chip conditions folder"); + declareProperty("WriteKey", m_writeKey, "Key of output (derived) average threshold conditions folder"); +} + +SCT_ConditionsParameterCondAlg::~SCT_ConditionsParameterCondAlg() { +} + +StatusCode SCT_ConditionsParameterCondAlg::initialize() { + ATH_MSG_DEBUG("initialize " << name()); + + // Cabling service + ATH_CHECK(m_cablingSvc.retrieve()); + // CondSvc + ATH_CHECK(m_condSvc.retrieve()); + // Read Cond Handle + ATH_CHECK(m_readKey.initialize()); + // Write Cond Handle + ATH_CHECK(m_writeKey.initialize()); + if(m_condSvc->regHandle(this, m_writeKey).isFailure()) { + ATH_MSG_FATAL("unable to register WriteCondHandle " << m_writeKey.fullKey() << " with CondSvc"); + return StatusCode::FAILURE; + } + + return StatusCode::SUCCESS; +} + +StatusCode SCT_ConditionsParameterCondAlg::execute() { + ATH_MSG_DEBUG("execute " << name()); + + // Write Cond Handle + SG::WriteCondHandle<SCT_CondParameterData> writeHandle{m_writeKey}; + // Do we have a valid Write Cond Handle for current time? + if (writeHandle.isValid()) { + // in theory this should never be called in MT + writeHandle.updateStore(); + ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid." + << ". In theory this should not be called, but may happen" + << " if multiple concurrent events are being processed out of order." + << " Forcing update of Store contents"); + return StatusCode::SUCCESS; + } + + // Read Cond Handle + SG::ReadCondHandle<CondAttrListVec> readHandle{m_readKey}; + const CondAttrListVec* readCdo{*readHandle}; + if (readCdo==nullptr) { + ATH_MSG_FATAL("Null pointer to the read conditions object"); + return StatusCode::FAILURE; + } + // Get the validitiy range + EventIDRange rangeW; + if (not readHandle.range(rangeW)) { + ATH_MSG_FATAL("Failed to retrieve validity range for " << readHandle.key()); + return StatusCode::FAILURE; + } + ATH_MSG_INFO("Size of CondAttrListVec " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size()); + ATH_MSG_INFO("Range of input is " << rangeW); + + // Construct the output Cond Object and fill it in + SCT_CondParameterData* writeCdo{new SCT_CondParameterData()}; + + // Loop over elements (i.e groups of 6 chips) in DB folder + const unsigned int nChipsPerModule{12}; + const unsigned int nChipsPerSide{6}; + const float mVperDacBit{2.5}; + CondAttrListVec::const_iterator modItr{readCdo->begin()}; + CondAttrListVec::const_iterator modEnd{readCdo->end()}; + for (; modItr != modEnd; modItr += nChipsPerModule) { + // Get SN and identifiers (the channel number is serial number+1) + const unsigned int truncatedSerialNumber{modItr->first - 1}; + const IdentifierHash& moduleHash{m_cablingSvc->getHashFromSerialNumber(truncatedSerialNumber)}; + if (not moduleHash.is_valid()) continue; + // Loop over chips within module + + for (unsigned int side{0}; side!=2; ++side) { + IdentifierHash elementHash{moduleHash + side}; + CondAttrListVec::const_iterator channelItr{modItr}; + CondAttrListVec::const_iterator channelEnd{modItr + nChipsPerSide}; + std::vector<SCT_Chip*> chipsInMod; + chipsInMod.reserve(nChipsPerSide); + float parameters[3]{0.0, 0.0, 0.0}; + float chipsum{0.0}; + for (; channelItr != channelEnd; ++channelItr) { + // Can get AttributeList from second (see http://lcgapp.cern.ch/doxygen/CORAL/CORAL_1_9_3/doxygen/html/classcoral_1_1_attribute_list.html) + //short id = channelItr->second[2].data<short>(); //chip 0-11 + float vthr{mVperDacBit * channelItr->second[10].data<short>()}; //threshold setting + short rcFunctionIndex{channelItr->second[15].data<short>()}; //response curve function + std::string rcArgumentString{channelItr->second[16].data<std::string>()}; //response curve arguments + parseResponseCurveArguments(parameters, rcArgumentString); + //float target = channelItr->second[18].data<float>(); //trim target...use for debugging only + float femtoCoulombThreshold{responseCurve(parameters[0], parameters[1], parameters[2], vthr, rcFunctionIndex)}; + chipsum+=femtoCoulombThreshold; + } + float moduleAverage{chipsum/nChipsPerSide}; + writeCdo->setValue(elementHash, SCT_CondParameterData::AVG_THRESHOLD, moduleAverage); + }//side loop + }//module loop + + // Record the output cond object + if (writeHandle.record(rangeW, writeCdo).isFailure()) { + ATH_MSG_FATAL("Could not record SCT_CondParameterData " << writeHandle.key() + << " with EventRange " << rangeW + << " into Conditions Store"); + delete writeCdo; + return StatusCode::FAILURE; + } + ATH_MSG_INFO("recorded new CDO " << writeHandle.key() << " with range " << rangeW << " into Conditions Store"); + + return StatusCode::SUCCESS; +} + +StatusCode SCT_ConditionsParameterCondAlg::finalize() +{ + ATH_MSG_DEBUG("finalize " << name()); + return StatusCode::SUCCESS; +} diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterCondAlg.h b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterCondAlg.h new file mode 100644 index 0000000000000000000000000000000000000000..62647f43bce799c6f70734bc59a14fee1cc93582 --- /dev/null +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterCondAlg.h @@ -0,0 +1,37 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef SCT_CONDITIONSPARAMETERCONDALG +#define SCT_CONDITIONSPARAMETERCONDALG + +#include "AthenaBaseComps/AthAlgorithm.h" + +#include "StoreGate/ReadCondHandleKey.h" +#include "AthenaPoolUtilities/CondAttrListVec.h" +#include "StoreGate/WriteCondHandleKey.h" +#include "SCT_ConditionsData/SCT_CondParameterData.h" +#include "SCT_Cabling/ISCT_CablingSvc.h" + +#include "GaudiKernel/ICondSvc.h" + +#include "GaudiKernel/Property.h" + +class SCT_ConditionsParameterCondAlg : public AthAlgorithm +{ + public: + SCT_ConditionsParameterCondAlg(const std::string& name, ISvcLocator* pSvcLocator); + ~SCT_ConditionsParameterCondAlg(); + StatusCode initialize(); + StatusCode execute(); + StatusCode finalize(); + + private: + SG::ReadCondHandleKey<CondAttrListVec> m_readKey; + SG::WriteCondHandleKey<SCT_CondParameterData> m_writeKey; + + ServiceHandle<ISCT_CablingSvc> m_cablingSvc;//!< Handle on SCT cabling service + ServiceHandle<ICondSvc> m_condSvc; +}; + +#endif // SCT_CONDITIONSPARAMETERCONDALG diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.cxx b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.cxx index f2b1239a565bc86023caa5de51dd2ab4ad15c8c7..84ea715b9e8ec641ebbb39d624cc23fa22bef1fb 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.cxx +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.cxx @@ -8,121 +8,21 @@ * @author shaun.roe@cern.ch **/ #include <limits> -#include <cmath> -#include <cstdio> #include "SCT_ConditionsParameterSvc.h" #include "SCT_Chip.h" -// -#include "InDetIdentifier/SCT_ID.h" - - -namespace {//anonymous namespace introduces file-scoped functions - //is the value 'Not-a-Number' ? - template <typename T> - bool is_nan(const T& val) { - return val!=val; //NaN is only value for which this is true - } - //response curve fit possibilities - enum ResponseCurveFit{NO_CURVE=0, POLYNOMIAL, GRILLO, EXPONENTIAL, LINEAR, N_FUNCS}; //'Grillo' refers to Alex Grillo, Santa Cruz, who worked on SCT electronics development - //response curve fit function - float responseCurve(const float param0, const float param1, const float param2, const float vthreshold, const unsigned int rcFunc) { - float result{std::numeric_limits<float>::quiet_NaN()}; - switch (rcFunc) { - case LINEAR: - if (param1!=0.0) { - result = (vthreshold - param0)/param1; - } - break; - case EXPONENTIAL: - if ((vthreshold - param2)!=0) { - float err2{param0/(vthreshold-param2)-1.0f}; - if (err2 > 0.0) { - result = -param1*std::log(err2); - } - } - break; - case GRILLO: - if (param2!=0) { - float err3{param1*(1.0f-((vthreshold-param0)/param2))}; - if (err3!=0) { - result = (vthreshold-param0)/err3; - } - } - break; - case POLYNOMIAL: - if (param2!=0) { - result = (-param1 + std::sqrt((param1*param1)-(4.0*param2*(param0-vthreshold)))) / 2.0*param2; - } - break; - default: - //nop - break; - }//switch - if (is_nan(result)) return result; - result *= result; - return result; - }//func responseCurve - - void parseResponseCurveArguments(float* p, const std::string& arguments) { - //string is of form: - //p0 1.284730e+03 p1 5.830000e+00 p2 -5.989900e+02 - float *p0{&p[0]}; - float *p1{&p[1]}; - float *p2{&p[2]}; - std::sscanf(arguments.c_str(), "p0 %50e p1 %50e p2 %50e", p0, p1, p2); - } - //folder to retrieve for threshold parameters - const std::string chipFolderName{"/SCT/DAQ/Configuration/Chip"}; //CoraCool folder in the DB -}//namespace //c'tor SCT_ConditionsParameterSvc::SCT_ConditionsParameterSvc(const std::string& name, ISvcLocator* pSvcLocator): AthService(name, pSvcLocator), - m_detStore{"DetectorStore", name}, - m_cablingSvc{"SCT_CablingSvc", name}, - m_pHelper{nullptr}, - m_filled{false} { - boost::array<float, SCT_ConditionsServices::N_PARAMETERS> init; - for (unsigned int i{0}; i!=SCT_ConditionsServices::N_PARAMETERS; ++i) { - m_invalidParameters[i]=invalid(i); - m_min[i]=std::numeric_limits<float>::max(); - m_max[i]=std::numeric_limits<float>::min(); - m_n[i]=0; - m_sum[i]=0.0; - m_sumsq[i]=0.0; - init[i]=0.0; - } - - //initialize boost array, doesnt provide constructor - for (unsigned int i{0}; i!=N_ELEMENTS; ++i) { - m_values[i]=init; - } + m_condKey{"SCT_CondParameterData"} { } // StatusCode SCT_ConditionsParameterSvc::initialize() { - // Retrieve detector store - if (m_detStore.retrieve().isFailure()) { - ATH_MSG_FATAL("Detector service not found !"); - return StatusCode::FAILURE; - } - // Retrieve cabling service - if (m_cablingSvc.retrieve().isFailure()) { - ATH_MSG_FATAL("Can't get the cabling service."); - return StatusCode::FAILURE; - } - // Retrieve SCT ID helper - if (m_detStore->retrieve(m_pHelper, "SCT_ID").isFailure()) { - ATH_MSG_FATAL("Could not get SCT ID helper"); - return StatusCode::FAILURE; - } - // - if (m_detStore->regFcn(&SCT_ConditionsParameterSvc::fillData, this, m_thresholdData, chipFolderName).isFailure()) { - ATH_MSG_FATAL("Failed to register callback"); - return StatusCode::FAILURE; - } + ATH_CHECK(m_condKey.initialize()); + return StatusCode::SUCCESS; } @@ -147,34 +47,37 @@ SCT_ConditionsParameterSvc::queryInterface(const InterfaceID& riid, void** ppvIn ///Is the required parameter available? bool -SCT_ConditionsParameterSvc::available(const SCT_ConditionsServices::ParameterIndex iparam) { - return (iparam==SCT_ConditionsServices::AVG_THRESHOLD); +SCT_ConditionsParameterSvc::available(const SCT_CondParameterData::ParameterIndex iparam) { + return (iparam==SCT_CondParameterData::AVG_THRESHOLD); } ///Give the indicated value for a module identifier hash float -SCT_ConditionsParameterSvc::value(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam) { - return m_values[idHash][iparam]; +SCT_ConditionsParameterSvc::value(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return invalid(iparam); + return data->getValue(idHash, iparam); } ///Measure of how many valid values went to calculate it. Should be 1 but if, say, 3 chip values were valid out of 6, it could be less (0.5 in this case) float -SCT_ConditionsParameterSvc::validity(const IdentifierHash& /*idHash*/, const SCT_ConditionsServices::ParameterIndex /*iparam*/) { +SCT_ConditionsParameterSvc::validity(const IdentifierHash& /*idHash*/, const SCT_CondParameterData::ParameterIndex /*iparam*/) { return 1.0; } ///Is a given value within acceptable limits? bool -SCT_ConditionsParameterSvc::isValid(const float parameterValue, const SCT_ConditionsServices::ParameterIndex iparam) { - if (iparam==SCT_ConditionsServices::AVG_THRESHOLD and is_nan(parameterValue)) return false; - return true; +SCT_ConditionsParameterSvc::isValid(const float parameterValue, const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return invalid(iparam); + return data->isValid(parameterValue, iparam); } ///What is the default error value for this parameter? float SCT_ConditionsParameterSvc::invalid(const unsigned int iparam) const { float result{0.0}; - if (iparam==SCT_ConditionsServices::AVG_THRESHOLD) { + if (iparam==SCT_CondParameterData::AVG_THRESHOLD) { result=std::numeric_limits<float>::quiet_NaN(); } return result; @@ -182,125 +85,70 @@ SCT_ConditionsParameterSvc::invalid(const unsigned int iparam) const { ///Maximum value read in from the database float -SCT_ConditionsParameterSvc::max(const SCT_ConditionsServices::ParameterIndex iparam) { - return m_max[iparam]; +SCT_ConditionsParameterSvc::max(const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return invalid(iparam); + return data->max(iparam); } ///Minimum value read in from the database float -SCT_ConditionsParameterSvc::min(const SCT_ConditionsServices::ParameterIndex iparam) { - return m_min[iparam]; +SCT_ConditionsParameterSvc::min(const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return invalid(iparam); + return data->min(iparam); } ///Average value float -SCT_ConditionsParameterSvc::avg(const SCT_ConditionsServices::ParameterIndex iparam) { - return (m_n[iparam]!=0)?(m_sum[iparam]/m_n[iparam]):(std::numeric_limits<float>::quiet_NaN()); +SCT_ConditionsParameterSvc::avg(const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return invalid(iparam); + return data->avg(iparam); } ///Standard deviation float -SCT_ConditionsParameterSvc::sd(const SCT_ConditionsServices::ParameterIndex iparam) { - float mu{m_sum[iparam]/m_n[iparam]}; - return std::sqrt((m_sumsq[iparam]/m_n[iparam]) - mu*mu); +SCT_ConditionsParameterSvc::sd(const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return invalid(iparam); + return data->sd(iparam); } ///Number of values read in unsigned int -SCT_ConditionsParameterSvc::n(const SCT_ConditionsServices::ParameterIndex iparam) { - return m_n[iparam]; +SCT_ConditionsParameterSvc::n(const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data==nullptr) return 0; + return data->n(iparam); } ///Fill a user-provided vector with the values (hopefully won't be needed?) void -SCT_ConditionsParameterSvc::getValues(std::vector<float>& userVector, const SCT_ConditionsServices::ParameterIndex iparam) { - for (unsigned int i{0}; i!=m_values.size(); ++i) { - userVector.push_back(m_values[i][iparam]); - } +SCT_ConditionsParameterSvc::getValues(std::vector<float>& userVector, const SCT_CondParameterData::ParameterIndex iparam) { + const SCT_CondParameterData* data{getCondData()}; + if (data!=nullptr) data->getValues(userVector, iparam); //no return value } ///Report whether the structure was filled bool SCT_ConditionsParameterSvc::filled() const { - return m_filled; -} - -///extended methods for data structure insertion -bool -SCT_ConditionsParameterSvc::insert(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam, const float theValue) { - //theValue must be valid - if (not isValid(theValue, iparam)) return false; - boost::array<float,SCT_ConditionsServices::N_PARAMETERS>& paramArray = m_values[idHash]; - //initial value should be invalid, only insert if this is the case - if (not isValid(paramArray[iparam], iparam)) { - paramArray[iparam]=theValue; - return true; - } else { - return false; - } + const SCT_CondParameterData* data{getCondData()}; + return (data!=nullptr); } ///Callback for fill from database StatusCode SCT_ConditionsParameterSvc::fillData(int& /* i */, std::list<std::string>& /*keys*/) { - if (m_detStore->retrieve(m_thresholdData, chipFolderName).isFailure()) { - ATH_MSG_FATAL("Could not fill chip configuration data"); - return StatusCode::FAILURE; - } - for (unsigned int i{0}; i!=SCT_ConditionsServices::N_PARAMETERS; ++i) { - m_n[i]=0; - m_sum[i]=0.0; - m_sumsq[i]=0.0; - m_min[i]=std::numeric_limits<float>::max(); - m_max[i]=std::numeric_limits<float>::min(); - } - // Loop over elements (i.e groups of 6 chips) in DB folder - const unsigned int nChipsPerModule{12}; - const unsigned int nChipsPerSide{6}; - const float mVperDacBit{2.5}; - //initialize the values to be invalid - for (unsigned int i{0}; i!=m_values.size(); ++i) m_values[i]=m_invalidParameters; - CondAttrListVec::const_iterator modItr{m_thresholdData->begin()}; - CondAttrListVec::const_iterator modEnd{m_thresholdData->end()}; - for (; modItr != modEnd; modItr += nChipsPerModule) { - // Get SN and identifiers (the channel number is serial number+1) - const unsigned int truncatedSerialNumber{modItr->first - 1}; - const IdentifierHash& moduleHash{m_cablingSvc->getHashFromSerialNumber(truncatedSerialNumber)}; - if (not moduleHash.is_valid()) continue; - // Loop over chips within module - - for (unsigned int side{0}; side!=2; ++side) { - IdentifierHash elementHash{moduleHash + side}; - CondAttrListVec::const_iterator channelItr{modItr}; - CondAttrListVec::const_iterator channelEnd{modItr + nChipsPerSide}; - std::vector<SCT_Chip*> chipsInMod; - chipsInMod.reserve(nChipsPerSide); - float parameters[3]{0.0, 0.0, 0.0}; - float chipsum{0.0}; - for (; channelItr != channelEnd; ++channelItr) { - // Can get AttributeList from second (see http://lcgapp.cern.ch/doxygen/CORAL/CORAL_1_9_3/doxygen/html/classcoral_1_1_attribute_list.html) - //short id = channelItr->second[2].data<short>(); //chip 0-11 - float vthr{mVperDacBit * channelItr->second[10].data<short>()}; //threshold setting - short rcFunctionIndex{channelItr->second[15].data<short>()}; //response curve function - std::string rcArgumentString{channelItr->second[16].data<std::string>()}; //response curve arguments - parseResponseCurveArguments(parameters, rcArgumentString); - //float target = channelItr->second[18].data<float>(); //trim target...use for debugging only - float femtoCoulombThreshold{responseCurve(parameters[0], parameters[1], parameters[2], vthr, rcFunctionIndex)}; - chipsum+=femtoCoulombThreshold; - } - float moduleAverage{chipsum/nChipsPerSide}; - if (insert(elementHash, SCT_ConditionsServices::AVG_THRESHOLD, moduleAverage)) { - m_n[SCT_ConditionsServices::AVG_THRESHOLD]++; - m_sum[SCT_ConditionsServices::AVG_THRESHOLD]+=moduleAverage; - m_sumsq[SCT_ConditionsServices::AVG_THRESHOLD]+=moduleAverage*moduleAverage; - m_min[SCT_ConditionsServices::AVG_THRESHOLD]=std::min(m_min[SCT_ConditionsServices::AVG_THRESHOLD], moduleAverage); - m_max[SCT_ConditionsServices::AVG_THRESHOLD]=std::max(m_max[SCT_ConditionsServices::AVG_THRESHOLD], moduleAverage); - } else { - ATH_MSG_WARNING("Insertion failed for hash: "<<elementHash<<" and parameter: "<<SCT_ConditionsServices::parameterNames[SCT_ConditionsServices::AVG_THRESHOLD]); - } - }//side loop - }//module loop - m_filled=true; return StatusCode::SUCCESS; } + +const SCT_CondParameterData* SCT_ConditionsParameterSvc::getCondData() const { + SG::ReadCondHandle<SCT_CondParameterData> condData{m_condKey}; + if (not condData.isValid()) { + ATH_MSG_ERROR("Failed to get " << m_condKey.key()); + return nullptr; + } + return *condData; +} diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.h b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.h index d368dfccb3deecf41b908c95af6dcfe5cc5a5fda..cc4a3650f268d3491164f7152f1a6209784cf239 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.h +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterSvc.h @@ -21,26 +21,21 @@ #include "GaudiKernel/IInterface.h" #include "GaudiKernel/ServiceHandle.h" #include "AthenaBaseComps/AthService.h" -#include "StoreGate/DataHandle.h" -#include "StoreGate/StoreGateSvc.h" //Athena includes #include "Identifier/IdentifierHash.h" -#include "AthenaKernel/IIOVDbSvc.h" -#include "AthenaPoolUtilities/CondAttrListVec.h" +#include "StoreGate/ReadCondHandleKey.h" //InnerDetector includes -#include "SCT_Cabling/ISCT_CablingSvc.h" +#include "SCT_ConditionsData/SCT_CondParameterData.h" //local includes -#include "SCT_ConditionsServices/SCT_ConditionsParameters.h" #include "SCT_ConditionsServices/ISCT_ConditionsParameterSvc.h" //fwd declarations template <class TYPE> class SvcFactory; class ISvcLocator; -class StatusCode; -class SCT_ID; + /** * @class SCT_ConditionsParameterSvc * Class to give a numerical value from conditions for each detector element (module side) @@ -63,37 +58,37 @@ class SCT_ConditionsParameterSvc: virtual public ISCT_ConditionsParameterSvc, vi //@} ///Is the required parameter available? - virtual bool available(const SCT_ConditionsServices::ParameterIndex iparam); + virtual bool available(const SCT_CondParameterData::ParameterIndex iparam); ///Give the indicated value for a module identifier hash - virtual float value(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam); + virtual float value(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam); ///Measure of how many valid values went to calculate it. Should be 1 but if, say, 3 chip values were valid out of 6, it could be less (0.5 in this case) - virtual float validity(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam); + virtual float validity(const IdentifierHash& idHash, const SCT_CondParameterData::ParameterIndex iparam); ///Is a given value within acceptable limits? - virtual bool isValid(const float parameterValue, const SCT_ConditionsServices::ParameterIndex iparam); + virtual bool isValid(const float parameterValue, const SCT_CondParameterData::ParameterIndex iparam); ///What is the default error value for this parameter? virtual float invalid(const unsigned int iparam) const; ///Maximum value read in from the database - virtual float max(const SCT_ConditionsServices::ParameterIndex iparam); + virtual float max(const SCT_CondParameterData::ParameterIndex iparam); ///Minimum value read in from the database - virtual float min(const SCT_ConditionsServices::ParameterIndex iparam); + virtual float min(const SCT_CondParameterData::ParameterIndex iparam); ///Average value - virtual float avg(const SCT_ConditionsServices::ParameterIndex iparam); + virtual float avg(const SCT_CondParameterData::ParameterIndex iparam); ///Standard deviation - virtual float sd(const SCT_ConditionsServices::ParameterIndex iparam); + virtual float sd(const SCT_CondParameterData::ParameterIndex iparam); ///Number of values read in - virtual unsigned int n(const SCT_ConditionsServices::ParameterIndex iparam); + virtual unsigned int n(const SCT_CondParameterData::ParameterIndex iparam); ///Fill a user-provided vector with the values (hopefully won't be needed?) - virtual void getValues(std::vector<float>& userVector, const SCT_ConditionsServices::ParameterIndex iparam); + virtual void getValues(std::vector<float>& userVector, const SCT_CondParameterData::ParameterIndex iparam); ///Report whether the structure was filled virtual bool filled() const; @@ -102,28 +97,9 @@ class SCT_ConditionsParameterSvc: virtual public ISCT_ConditionsParameterSvc, vi StatusCode fillData(int& i, std::list<std::string>& keys); private: - enum {N_ELEMENTS=8176}; - //Declare Storegate container - ServiceHandle<StoreGateSvc> m_detStore; - ServiceHandle<ISCT_CablingSvc> m_cablingSvc;//!< Handle on SCT cabling service - const SCT_ID* m_pHelper;//!< ID helper for SCT - //the data structure - boost::array<boost::array<float, SCT_ConditionsServices::N_PARAMETERS>, N_ELEMENTS > m_values; - //a structure for initialization - boost::array<float, SCT_ConditionsServices::N_PARAMETERS> m_invalidParameters; - //DataHandle for callback - const DataHandle<CondAttrListVec> m_thresholdData;//!<implies that CoraCool is used - //extended method for data structure insertion - bool insert(const IdentifierHash& idHash, const SCT_ConditionsServices::ParameterIndex iparam, const float theValue); - - //internal values to be calculated during data filling - float m_min[SCT_ConditionsServices::N_PARAMETERS]; - float m_max[SCT_ConditionsServices::N_PARAMETERS]; - unsigned int m_n[SCT_ConditionsServices::N_PARAMETERS]; - float m_sum[SCT_ConditionsServices::N_PARAMETERS]; - float m_sumsq[SCT_ConditionsServices::N_PARAMETERS]; - bool m_filled; + SG::ReadCondHandleKey<SCT_CondParameterData> m_condKey; + const SCT_CondParameterData* getCondData() const; }; diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterTestAlg.cxx b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterTestAlg.cxx index 32021f10cf3ddf29be3a36d10c8f155666387dcf..abe25c597066184942f0d4d9cab45b5a3e650257 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterTestAlg.cxx +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/SCT_ConditionsParameterTestAlg.cxx @@ -10,6 +10,7 @@ #include "SCT_ConditionsParameterTestAlg.h" #include "SCT_ConditionsServices/ISCT_ConditionsParameterSvc.h" #include "SCT_ConditionsServices/SCT_ConditionsParameters.h" +#include "SCT_ConditionsData/SCT_CondParameterData.h" #include "SCT_SimpleHisto.h" #include "SCT_ConditionsUtilities.h" @@ -91,12 +92,12 @@ StatusCode SCT_ConditionsParameterTestAlg::execute() { } try { - float maxval{m_conditionsParameterSvc->max(AVG_THRESHOLD)}; - float minval{m_conditionsParameterSvc->min(AVG_THRESHOLD)}; - float avg{m_conditionsParameterSvc->avg(AVG_THRESHOLD)}; - float sd{m_conditionsParameterSvc->sd(AVG_THRESHOLD)}; - unsigned int n{m_conditionsParameterSvc->n(AVG_THRESHOLD)}; - float thresh{m_conditionsParameterSvc->value(IdentifierHash{1760}, AVG_THRESHOLD)}; + float maxval{m_conditionsParameterSvc->max(SCT_CondParameterData::AVG_THRESHOLD)}; + float minval{m_conditionsParameterSvc->min(SCT_CondParameterData::AVG_THRESHOLD)}; + float avg{m_conditionsParameterSvc->avg(SCT_CondParameterData::AVG_THRESHOLD)}; + float sd{m_conditionsParameterSvc->sd(SCT_CondParameterData::AVG_THRESHOLD)}; + unsigned int n{m_conditionsParameterSvc->n(SCT_CondParameterData::AVG_THRESHOLD)}; + float thresh{m_conditionsParameterSvc->value(IdentifierHash{1760}, SCT_CondParameterData::AVG_THRESHOLD)}; ATH_MSG_INFO(" value element 1760: " << thresh); ATH_MSG_INFO(" max threshold: " << maxval); ATH_MSG_INFO(" min threshold: " << minval); @@ -111,7 +112,7 @@ StatusCode SCT_ConditionsParameterTestAlg::execute() { SCT_ConditionsServices::S_t histo; init(histo, 0.0, 8.0, 100); std::vector<float> values; - m_conditionsParameterSvc->getValues(values, AVG_THRESHOLD); + m_conditionsParameterSvc->getValues(values, SCT_CondParameterData::AVG_THRESHOLD); for (float i: values) { fill(histo, i); } diff --git a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/components/SCT_ConditionsServices_entries.cxx b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/components/SCT_ConditionsServices_entries.cxx index ed976d68f714e64bf0076096054c89ce241de6b6..1f08e6c529427ac8c863cf706297a8c30a9c024c 100644 --- a/InnerDetector/InDetConditions/SCT_ConditionsServices/src/components/SCT_ConditionsServices_entries.cxx +++ b/InnerDetector/InDetConditions/SCT_ConditionsServices/src/components/SCT_ConditionsServices_entries.cxx @@ -51,6 +51,7 @@ #include "../SCT_TdaqEnabledTestAlg.h" #include "../SCT_ConditionsParameterSvc.h" +#include "../SCT_ConditionsParameterCondAlg.h" #include "../SCT_ConditionsParameterTestAlg.h" #include "../SCT_SensorsSvc.h" @@ -99,6 +100,7 @@ DECLARE_COMPONENT( SCT_ConfigurationConditionsTestAlg ) DECLARE_COMPONENT( SCT_ConfigurationCondAlg ) DECLARE_COMPONENT( SCT_MajorityCondAlg ) DECLARE_COMPONENT( SCT_MajorityConditionsTestAlg ) +DECLARE_COMPONENT( SCT_ConditionsParameterCondAlg ) DECLARE_COMPONENT( SCT_ConditionsParameterTestAlg ) DECLARE_COMPONENT( SCT_SensorsCondAlg ) DECLARE_COMPONENT( SCT_SensorsTestAlg )