ATLAS Offline Software
ITkPixelOfflineCalibCondAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 #include "Identifier/Identifier.h"
8 #include "GaudiKernel/EventIDRange.h"
10 #include <memory>
11 #include <sstream>
12 
13 namespace ITk
14 {
15 
16 PixelOfflineCalibCondAlg::PixelOfflineCalibCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
17  ::AthReentrantAlgorithm(name, pSvcLocator)
18 {
19 }
20 
21 
23  ATH_MSG_DEBUG("ITkPixelOfflineCalibCondAlg::initialize()");
24 
25  ATH_CHECK(service("DetectorStore", m_detStore));
26  ATH_CHECK(m_detStore->retrieve(m_pixelid, "PixelID")) ;
27 
28  if (m_inputSource==2 && m_readKey.key().empty()) {
29  ATH_MSG_ERROR("The database is set to be input source (2) but the ReadKey is empty.");
30  }
32 
34 
35  return StatusCode::SUCCESS;
36 }
37 
38 
39 
40 StatusCode PixelOfflineCalibCondAlg::execute(const EventContext& ctx) const {
41  ATH_MSG_DEBUG("ITkPixelOfflineCalibCondAlg::execute()");
42 
44  if (writeHandle.isValid()) {
45  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.");
46  return StatusCode::SUCCESS;
47  }
48 
49  // Construct the output Cond Object and fill it in
50  std::unique_ptr<PixelOfflineCalibData> writeCdo(std::make_unique<PixelOfflineCalibData>());
51 
52  if (m_inputSource==0) {
53  ATH_MSG_WARNING("So far do nothing!! return StatusCode::FAILURE");
54  return StatusCode::FAILURE;
55  }
56  else if (m_inputSource==1) {
57  ATH_MSG_WARNING("Pixel ITk constants read from text file. Only supported for local developments and debugging!");
58 
59  auto calibData = std::make_unique<PixelOfflineCalibData>();
60  PixelClusterErrorData* pced = calibData->getClusterErrorData();
61 
62  // Find and open the text file
63  ATH_MSG_INFO("Load ITkPixelErrorData constants from text file");
64  std::string fileName = PathResolver::find_file(m_textFileName, "DATAPATH");
65  if (fileName.empty()) { ATH_MSG_WARNING("Input file " << fileName << " not found! Default (hardwired) values to be used!"); }
66  else { pced->load(fileName); }
67 
68  ATH_MSG_DEBUG("Get error constants");
69  std::vector<float> constants = calibData->getConstants();
70  if (!constants.empty()) { ATH_MSG_VERBOSE("constants are defined"); }
71  else { ATH_MSG_ERROR("constants size is NULL!!!"); }
72 
73 
74  const EventIDBase start{EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, 0, 0, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
75  const EventIDBase stop {EventIDBase::UNDEFNUM, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM-1, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM};
76  const EventIDRange rangeW{start, stop};
77 
78  ATH_MSG_DEBUG("Range of input is " << rangeW);
79 
80  if (!constants.empty()) {
81  ATH_MSG_DEBUG("Found constants with new-style Identifier key");
82  writeCdo->setConstants(constants);
83  }
84 
85  if (writeHandle.record(rangeW, std::move(writeCdo)).isFailure()) {
86  ATH_MSG_FATAL("Could not record PixelCalib::ITkPixelOfflineCalibData " << writeHandle.key() << " with EventRange " << rangeW << " into Conditions Store");
87  return StatusCode::FAILURE;
88  }
89  ATH_MSG_DEBUG("recorded new CDO " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
90 
91  if (m_dump!=0) {
92  ATH_MSG_DEBUG("Dump the constants to file");
93  calibData->dump();
94  }
95  }
96 
97  else if (m_inputSource==2) {
98 
100  const CondAttrListCollection* readCdo{*readHandle};
101  if (readCdo==nullptr) {
102  ATH_MSG_FATAL("Null pointer to the read conditions object");
103  return StatusCode::FAILURE;
104  }
105 
106  // Get the validitiy range
107  EventIDRange rangeW;
108  if (not readHandle.range(rangeW)) {
109  ATH_MSG_FATAL("Failed to retrieve validity range for " << readHandle.key());
110  return StatusCode::FAILURE;
111  }
112 
113  ATH_MSG_DEBUG("Range of input is " << rangeW);
114 
115  std::vector<float> constants;
116 
117  for(const auto & attrList : *readCdo){
118 
119  std::ostringstream attrStr;
120  attrList.second.toOutputStream(attrStr);
121  ATH_MSG_DEBUG( "ChanNum " << attrList.first << " Attribute list " << attrStr.str() );
122 
123  std::string stringData = attrList.second["data_array"].data<std::string>();
124  std::string delimiter = "],";
125  size_t pos = 0;
126  std::vector<std::string> component;
127  std::string buffer;
128  while ((pos = stringData.find(delimiter)) != std::string::npos) {
129  buffer = stringData.substr(0,pos);
130  component.push_back(buffer);
131  stringData.erase(0, pos + delimiter.length());
132  }
133  component.push_back(stringData);
134  ATH_MSG_INFO("Last component="<<stringData);
135 
136  for (auto & i : component) {
137  std::string checkModule = i;
138  std::vector<std::string> moduleString;
139  delimiter = ":[";
140  pos = 0;
141  while ((pos = checkModule.find(delimiter)) != std::string::npos) {
142  buffer = checkModule.substr(0,pos);
143  moduleString.push_back(buffer);
144  checkModule.erase(0, pos + delimiter.length());
145  }
146  moduleString.push_back(checkModule);
147 
148  if (moduleString.size()!=2) {
149  ATH_MSG_FATAL("String size (moduleString) is not 2. " << moduleString.size() << " in " << i << " channel " << attrList.first << " read from " << readHandle.fullKey());
150  return StatusCode::FAILURE;
151  }
152 
153  std::stringstream checkModuleHash(moduleString[0]);
154  std::vector<std::string> moduleStringHash;
155  while (std::getline(checkModuleHash,buffer,'"')) { moduleStringHash.push_back(buffer); }
156 
157  int waferHash = std::atoi(moduleStringHash[1].c_str());
158  IdentifierHash waferID_hash(waferHash);
159  Identifier pixelID = m_pixelid->wafer_id(waferID_hash);
160  constants.emplace_back( pixelID.get_compact() );
161 
162  std::stringstream moduleConstants(moduleString[1]);
163  std::vector<float> moduleConstantsVec;
164  while (std::getline(moduleConstants,buffer,',')) { moduleConstantsVec.emplace_back(std::atof(buffer.c_str())); }
165 
166  // Format v1 with no incident angle dependance
167  if(moduleConstantsVec.size()==4){
168  constants.emplace_back(0); // period_phi
169  constants.emplace_back(0); // period_sinheta
170  constants.emplace_back(0); // delta_x_slope
171  constants.emplace_back(moduleConstantsVec[0]); // delta_x_offset
172  constants.emplace_back(moduleConstantsVec[1]); // delta_error_x
173  constants.emplace_back(0); // delta_y_slope
174  constants.emplace_back(moduleConstantsVec[2]); // delta_y_offset
175  constants.emplace_back(moduleConstantsVec[3]); // delta_error_y
176  }
177 
178  else if(moduleConstantsVec.size()==7){
179  constants.emplace_back(moduleConstantsVec[0]); // period_phi
180  for( auto& x : moduleConstantsVec ) constants.emplace_back(x);
181  }
182 
183  // Format v3 with incident angle dependance + different eta-phi periods
184  else if(moduleConstantsVec.size()==8){
185  for( auto& x : moduleConstantsVec ) constants.emplace_back(x);
186  }
187 
188  }
189 
190  }
191 
192  writeCdo->setConstants(constants);
193 
194  if (writeHandle.record(rangeW, std::move(writeCdo)).isFailure()) {
195  ATH_MSG_FATAL("Could not record PixelCalib::ITkPixelOfflineCalibData " << writeHandle.key() << " with EventRange " << rangeW << " into Conditions Store");
196  return StatusCode::FAILURE;
197  }
198  ATH_MSG_DEBUG("recorded new CDO " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
199 
200  }
201 
202  return StatusCode::SUCCESS;
203 }
204 
205 } // namespace ITk
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
ITk::PixelOfflineCalibCondAlg::m_writeKey
SG::WriteCondHandleKey< ITk::PixelOfflineCalibData > m_writeKey
Definition: ITkPixelOfflineCalibCondAlg.h:47
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
ITkPixelOfflineCalibCondAlg.h
ITk::PixelClusterErrorData::load
void load(const std::string &file)
Definition: ITkPixelClusterErrorData.cxx:105
ITk::PixelOfflineCalibCondAlg::initialize
virtual StatusCode initialize() override final
Definition: ITkPixelOfflineCalibCondAlg.cxx:22
ITk::PixelOfflineCalibCondAlg::m_inputSource
Gaudi::Property< int > m_inputSource
Definition: ITkPixelOfflineCalibCondAlg.h:35
PixelModuleFeMask_create_db.stop
int stop
Definition: PixelModuleFeMask_create_db.py:76
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::WriteCondHandle::record
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
Definition: WriteCondHandle.h:157
ITk::PixelOfflineCalibCondAlg::m_pixelid
const PixelID * m_pixelid
Definition: ITkPixelOfflineCalibCondAlg.h:50
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
x
#define x
PixelID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: PixelID.h:364
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
ITk::PixelClusterErrorData
Definition: ITkPixelClusterErrorData.h:21
StoreGateSvc::retrieve
StatusCode retrieve(const T *&ptr) const
Retrieve the default object into a const T*.
python.AthDsoLogger.delimiter
delimiter
Definition: AthDsoLogger.py:71
createCoolChannelIdFile.buffer
buffer
Definition: createCoolChannelIdFile.py:12
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
SG::WriteCondHandle::fullKey
const DataObjID & fullKey() const
Definition: WriteCondHandle.h:41
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ITk::PixelOfflineCalibCondAlg::m_detStore
StoreGateSvc * m_detStore
Definition: ITkPixelOfflineCalibCondAlg.h:49
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ITk::PixelOfflineCalibCondAlg::PixelOfflineCalibCondAlg
PixelOfflineCalibCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: ITkPixelOfflineCalibCondAlg.cxx:16
CxxUtils::atof
double atof(std::string_view str)
Converts a string into a double / float.
Definition: Control/CxxUtils/Root/StringUtils.cxx:91
PathResolver.h
ITk
Definition: ITkPixelOfflineCalibCondAlg.cxx:14
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
SG::WriteCondHandle::key
const std::string & key() const
Definition: WriteCondHandle.h:40
IdentifierHash.h
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
ITk::PixelOfflineCalibCondAlg::m_dump
Gaudi::Property< int > m_dump
Definition: ITkPixelOfflineCalibCondAlg.h:41
Identifier::get_compact
value_type get_compact(void) const
Get the compact id.
constants
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:1
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
ITk::PixelOfflineCalibCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override final
Definition: ITkPixelOfflineCalibCondAlg.cxx:40
SG::WriteCondHandle::isValid
bool isValid() const
Definition: WriteCondHandle.h:248
CxxUtils::atoi
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...
Definition: Control/CxxUtils/Root/StringUtils.cxx:85
IdentifierHash
Definition: IdentifierHash.h:38
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
ITk::PixelOfflineCalibCondAlg::m_readKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Definition: ITkPixelOfflineCalibCondAlg.h:44
ITk::PixelOfflineCalibCondAlg::m_textFileName
Gaudi::Property< std::string > m_textFileName
Definition: ITkPixelOfflineCalibCondAlg.h:38