16 bool is_nan(
const T& val) {
20 enum ResponseCurveFit{NO_CURVE=0, POLYNOMIAL, GRILLO, EXPONENTIAL,
LINEAR, N_FUNCS};
22 float responseCurve(
const float param0,
const float param1,
const float param2,
const float vthreshold,
const unsigned int rcFunc) {
23 float result{std::numeric_limits<float>::quiet_NaN()};
27 result = (vthreshold - param0)/param1;
31 if ((vthreshold - param2)!=0) {
32 float err2{param0/(vthreshold-param2)-1.0f};
34 result = -param1*std::log(err2);
40 float err3{param1*(1.0f-((vthreshold-param0)/param2))};
42 result = (vthreshold-param0)/err3;
48 result = (-param1 + std::sqrt((param1*param1)-(4.0*param2*(param0-vthreshold)))) / 2.0*param2;
60 void parseResponseCurveArguments(
float* p,
const std::string& arguments) {
66 std::sscanf(
arguments.c_str(),
"p0 %50e p1 %50e p2 %50e", p0, p1, p2);
69 const std::string chipFolderName{
"/SCT/DAQ/Configuration/Chip"};
87 return StatusCode::SUCCESS;
98 <<
". In theory this should not be called, but may happen"
99 <<
" if multiple concurrent events are being processed out of order.");
100 return StatusCode::SUCCESS;
106 if (readCdo==
nullptr) {
108 return StatusCode::FAILURE;
116 std::unique_ptr<SCT_CondParameterData> writeCdo{std::make_unique<SCT_CondParameterData>()};
119 static const unsigned int nChipsPerModule{12};
120 static const unsigned int nChipsPerSide{6};
121 static const float mVperDacBit{2.5};
124 for (; modItr != modEnd; modItr += nChipsPerModule) {
126 const unsigned int truncatedSerialNumber{modItr->first - 1};
128 if (not moduleHash.
is_valid())
continue;
131 for (
unsigned int side{0}; side!=2; ++side) {
135 std::vector<SCT_Chip*> chipsInMod;
136 chipsInMod.reserve(nChipsPerSide);
137 float parameters[3]{0.0, 0.0, 0.0};
139 for (; channelItr != channelEnd; ++channelItr) {
142 float vthr{mVperDacBit * channelItr->second[10].data<
short>()};
143 short rcFunctionIndex{channelItr->second[15].data<
short>()};
144 const std::string &rcArgumentString{channelItr->second[16].data<std::string>()};
145 parseResponseCurveArguments(parameters, rcArgumentString);
147 float femtoCoulombThreshold{responseCurve(parameters[0], parameters[1], parameters[2], vthr, rcFunctionIndex)};
148 chipsum+=femtoCoulombThreshold;
150 float moduleAverage{chipsum/nChipsPerSide};
156 if (writeHandle.
record(std::move(writeCdo)).isFailure()) {
157 ATH_MSG_FATAL(
"Could not record SCT_CondParameterData " << writeHandle.
key()
158 <<
" with EventRange " << writeHandle.
getRange()
159 <<
" into Conditions Store");
160 return StatusCode::FAILURE;
162 ATH_MSG_INFO(
"recorded new CDO " << writeHandle.
key() <<
" with range " << writeHandle.
getRange() <<
" into Conditions Store");
164 return StatusCode::SUCCESS;
170 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
A CondAttrListVec is an Athena DataObject holding a vector of CORAL AttributeLists,...
Header file storing infomration on the SCT chips: id, config, mask.
Base class for conditions algorithms.
AttrListVec::const_iterator const_iterator
const_iterator end() const
const_iterator begin() const
This is a "hash" representation of an Identifier.
bool is_valid() const
Check if id is in a valid state.
SG::WriteCondHandleKey< SCT_CondParameterData > m_writeKey
virtual StatusCode execute(const EventContext &ctx) const override final
virtual StatusCode initialize() override final
virtual StatusCode finalize() override final
SG::ReadCondHandleKey< CondAttrListVec > m_readKey
SCT_ConditionsParameterCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
ToolHandle< ISCT_CablingTool > m_cablingTool
const DataObjID & fullKey() const
const EventIDRange & getRange()
const std::string & key() const
void addDependency(const EventIDRange &range)
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
const DataObjID & fullKey() const