ATLAS Offline Software
MdtAsBuiltCondAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 #include <fstream>
10 #include <CxxUtils/StringUtils.h>
11 #include "GeoModelKernel/throwExcept.h"
12 
13 MdtAsBuiltCondAlg::MdtAsBuiltCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
14  AthReentrantAlgorithm{name, pSvcLocator} {}
15 
17  ATH_CHECK(m_readKey.initialize(m_readFromJSON.value().empty()));
19  ATH_CHECK(m_idHelperSvc.retrieve());
20  if (!m_readFromJSON.value().empty()){
21  ATH_MSG_INFO("Load Mdt as built parameters from JSON "<<m_readFromJSON);
22  } else {
23  ATH_MSG_INFO("Load Mdt as-built from COOL <"<<m_readKey.key()<<">");
24  }
25  return StatusCode::SUCCESS;
26 }
27 
28 StatusCode MdtAsBuiltCondAlg::execute(const EventContext& ctx) const {
30  if (writeHandle.isValid()) {
31  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
32  << ". In theory this should not be called, but may happen"
33  << " if multiple concurrent events are being processed out of order.");
34  return StatusCode::SUCCESS;
35  }
36  writeHandle.addDependency(EventIDRange(IOVInfiniteRange::infiniteTime()));
37  std::unique_ptr<MdtAsBuiltContainer> writeCdo{std::make_unique<MdtAsBuiltContainer>()};
38 
40  if (!m_readFromJSON.value().empty()) {
41  std::ifstream inStream{PathResolverFindCalibFile(m_readFromJSON)};
42  if (!inStream.good()) {
43  ATH_MSG_FATAL("No such file or directory");
44  return StatusCode::FAILURE;
45  }
47  inStream >> lines;
48  ATH_CHECK(parseDataFromJSON(lines, *writeCdo));
49  }
50  if (!m_readKey.empty()) {
52  if (!readHandle.isValid()){
53  ATH_MSG_FATAL("Failed to retrieve "<<m_readKey.fullKey());
54  return StatusCode::FAILURE;
55  }
56  writeHandle.addDependency(readHandle);
57 
58  for (CondAttrListCollection::const_iterator itr = readHandle->begin(); itr != readHandle->end(); ++itr) {
59  const coral::AttributeList& atr = itr->second;
60  const std::string data{*(static_cast<const std::string*>((atr["data"]).addressOfData()))};
62  if (m_newFormat2020) {
64  lines = j["corrections"];
65  } else {
67  }
68  ATH_CHECK(parseDataFromJSON(lines, *writeCdo));
69  }
70  }
71  ATH_CHECK(writeHandle.record(std::move(writeCdo)));
72  ATH_MSG_INFO("Saved successfully Mdt as built "<<m_writeKey.fullKey()<<" with validity range "<<writeHandle.getRange());
73  return StatusCode::SUCCESS;
74 }
75 
77  MdtAsBuiltContainer& asBuilt) const{
78 
79  // loop over corrections ------------------------
80  for (auto& corr : lines.items()) {
81  nlohmann::json line = corr.value();
83  const std::string stationType = line["typ"];
84  const int stationPhi = line["jff"];
85  const int stationEta = line["jzz"];
86  bool is_valid{false};
87  const Identifier id = m_idHelperSvc->mdtIdHelper().elementID(stationType, stationEta, stationPhi, is_valid);
88  if (!is_valid) {
89  ATH_MSG_FATAL("The AMDB identifier "<<stationType<<", "<<stationEta<<", "<<stationPhi<<" does not seem to be a MDT one");
90  return StatusCode::FAILURE;
91  }
92  MdtAsBuiltPar xPar{};
94  xPar.setAmdbId(stationType, stationEta, stationPhi, 0);
95  xPar.setIdentifier(id);
96  using multilayer_t = MdtAsBuiltPar::multilayer_t;
97  using tubeSide_t = MdtAsBuiltPar::tubeSide_t;
98  for (const multilayer_t ml : {multilayer_t::ML1, multilayer_t::ML2}){
99  for (const tubeSide_t side : {tubeSide_t::POS, tubeSide_t::NEG}){
100  std::stringstream prefix{};
101  prefix<<"Ml"<<(static_cast<unsigned>(ml) + 1);
102  prefix<<(side == tubeSide_t::POS? "Pos" : "Neg")<<"TubeSide";
103  auto getValue = [&prefix,&line, this](const std::string& val) -> float{
104  const std::string itrName = prefix.str()+val;
105  if (line.find(itrName) == line.end()) {
106  ATH_MSG_ERROR("JSON does not contain "<<itrName);
107  THROW_EXCEPTION("Bad JSON key");
108  }
109  return line[prefix.str()+val];
110  };
111  xPar.setAlignmentParameters(ml, side, getValue("y0"), getValue("z0"),
112  getValue("alpha"), getValue("ypitch"),
113  getValue("zpitch"),getValue("stagg"));
114  }
115  }
116  auto itr_pair = asBuilt.insert(xPar);
117  if (!itr_pair.second){
118  ATH_MSG_FATAL("Failed to insert "<<xPar<<" because the place in memory is already occupied by "
119  <<(*itr_pair.first));
120  return StatusCode::FAILURE;
121  }
122  ATH_MSG_VERBOSE("Added "<<(*itr_pair.first)<<" to the container");
123  }
124  return StatusCode::SUCCESS;
125 }
126 
128  nlohmann::json& jsonDump) const {
129 
130  // Parse corrections
131  constexpr std::string_view delimiter{"\n"};
133  unsigned int nLines{0};
134  for (const std::string& blobline : lines) {
135  ++nLines;
136  constexpr std::string_view delimiter{":"};
137  auto tokens = CxxUtils::tokenize(blobline, delimiter);
138  // Check if tokens is not empty
139  if (tokens.empty()) {
140  ATH_MSG_FATAL("Empty string retrieved from DB in folder " << m_readKey.fullKey());
141  return StatusCode::FAILURE;
142  }
143  const std::string_view &type = tokens[0];
144  // Parse line
145  if (type[0] == '#') {
146  // skip it
147  continue;
148  }
149 
150  if (type.compare(0, 4, "Corr") == 0) {
151  nlohmann::json newLine;
152  ATH_CHECK(setFromAscii(std::string(blobline), newLine));
153  jsonDump.push_back(newLine);
154  }
155  }
156  ATH_MSG_VERBOSE("Decoded "<<nLines<<" new ascii lines");
157  return StatusCode::SUCCESS;
158 }
159 
160 
161 StatusCode MdtAsBuiltCondAlg::setFromAscii(const std::string& asciiData,
162  nlohmann::json& newChannel) const {
163  std::istringstream in(asciiData);
164 
165  std::string tok;
166  if (!((in >> tok) && (tok == "Corr:"))) {
167  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to parse line "<<asciiData);
168  return StatusCode::FAILURE;
169  }
170  std::string typ{};
171  int jff{0}, jzz{0};
172  if (!(in >> typ >> jff >> jzz)) {
173  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to parse line "<<asciiData);
174  return StatusCode::FAILURE;
175  }
176  newChannel["typ"] = typ;
177  newChannel["jff"] = jff;
178  newChannel["jzz"] = jzz;
179  using multilayer_t = MdtAsBuiltPar::multilayer_t;
180  using tubeSide_t = MdtAsBuiltPar::tubeSide_t;
181  std::array<int, static_cast<unsigned>(multilayer_t::NMLTYPES)> stagg{};
182  if (!(in >> stagg[static_cast<unsigned>(multilayer_t::ML1)]
183  >> stagg[static_cast<unsigned>(multilayer_t::ML2)])) {
184  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to parse line "<<asciiData);
185  return StatusCode::FAILURE;
186  }
187  for (const multilayer_t ml : {multilayer_t::ML1, multilayer_t::ML2}){
188  for (const tubeSide_t side : {tubeSide_t::POS, tubeSide_t::NEG}){
189  std::stringstream prefix{};
190  prefix<<"Ml"<<(static_cast<unsigned>(ml) + 1);
191  prefix<<(side == tubeSide_t::POS? "Pos" : "Neg")<<"TubeSide";
192  auto dumpValue = [&prefix, &newChannel](const std::string& field, const float val) {
193  newChannel[prefix.str()+field] = val;
194  } ;
195 
196  float y0{0.f}, z0{0.f}, alpha{0.f}, ypitch{0.f}, zpitch{0.f};
197  if (!(in >> y0 >> z0 >> alpha >> ypitch >> zpitch)){
198  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to parse line "<<asciiData);
199  return StatusCode::FAILURE;
200  }
201  dumpValue("y0", y0);
202  dumpValue("z0", z0);
203  dumpValue("alpha", alpha);
204  dumpValue("ypitch", ypitch);
205  dumpValue("zpitch", zpitch);
206  dumpValue("stagg", stagg[static_cast<unsigned int>(ml)]);
207  }
208  }
209  return StatusCode::SUCCESS;
210 }
MdtAsBuiltCondAlg::m_writeKey
SG::WriteCondHandleKey< MdtAsBuiltContainer > m_writeKey
Definition: MdtAsBuiltCondAlg.h:39
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
Muon::nsw::STGTPSegments::moduleIDBits::stationPhi
constexpr uint8_t stationPhi
station Phi 1 to 8
Definition: NSWSTGTPDecodeBitmaps.h:161
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
checkFileSG.line
line
Definition: checkFileSG.py:75
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
json
nlohmann::json json
Definition: HistogramDef.cxx:9
CxxUtils::tokenize
std::vector< std::string > tokenize(const std::string &the_str, std::string_view delimiters)
Splits the string into smaller substrings.
Definition: Control/CxxUtils/Root/StringUtils.cxx:15
MdtAsBuiltCondAlg::m_newFormat2020
Gaudi::Property< bool > m_newFormat2020
Definition: MdtAsBuiltCondAlg.h:45
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:1054
StringUtils.h
MdtAsBuiltPar::multilayer_t
multilayer_t
MDT multi-layer index.
Definition: MdtAsBuiltPar.h:28
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
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
beamspotman.tokens
tokens
Definition: beamspotman.py:1284
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
MuonAlignmentPar::setAmdbId
void setAmdbId(const std::string &stName, int stEta, int stPhi, int stJob)
AMDB identifiers. They're often not the same as the ATLAS ones (TGCs)
Definition: MuonAlignmentPar.cxx:13
ReadCondHandle.h
MdtAsBuiltCondAlg::MdtAsBuiltCondAlg
MdtAsBuiltCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MdtAsBuiltCondAlg.cxx:13
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
TRT::Hit::side
@ side
Definition: HitInfo.h:83
MdtAsBuiltCondAlg::initialize
virtual StatusCode initialize() override
Definition: MdtAsBuiltCondAlg.cxx:16
python.AthDsoLogger.delimiter
delimiter
Definition: AthDsoLogger.py:71
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
CaloCondBlobAlgs_fillNoiseFromASCII.lines
lines
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:104
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
WriteCondHandle.h
MdtAsBuiltCondAlg::m_readFromJSON
Gaudi::Property< std::string > m_readFromJSON
Load the alignment parameters from a JSON file.
Definition: MdtAsBuiltCondAlg.h:48
MdtAsBuiltCondAlg::setFromAscii
StatusCode setFromAscii(const std::string &asciiData, nlohmann::json &newChannel) const
Definition: MdtAsBuiltCondAlg.cxx:161
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
MdtAsBuiltContainer
std::set< MdtAsBuiltPar, std::less<> > MdtAsBuiltContainer
Definition: CorrContainer.h:24
MdtAsBuiltCondAlg::m_readKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Definition: MdtAsBuiltCondAlg.h:36
MdtAsBuiltPar::tubeSide_t
tubeSide_t
MDT tube side.
Definition: MdtAsBuiltPar.h:33
IOVInfiniteRange.h
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
MdtAsBuiltCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: MdtAsBuiltCondAlg.cxx:28
MdtAsBuiltPar
Container classifier the MDT as-built parameters See parameter description in http://atlas-muon-align...
Definition: MdtAsBuiltPar.h:18
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MdtAsBuiltCondAlg::legacyFormatToJSON
StatusCode legacyFormatToJSON(const std::string &bloblines, nlohmann::json &lines) const
Definition: MdtAsBuiltCondAlg.cxx:127
IOVInfiniteRange::infiniteTime
static EventIDRange infiniteTime()
Produces an EventIDRange that is inifinite in Time and invalid in RunLumi.
Definition: IOVInfiniteRange.h:47
Muon::nsw::STGTPSegments::moduleIDBits::stationEta
constexpr uint8_t stationEta
1 to 3
Definition: NSWSTGTPDecodeBitmaps.h:159
MdtAsBuiltCondAlg::parseDataFromJSON
StatusCode parseDataFromJSON(const nlohmann::json &lines, MdtAsBuiltContainer &asBuilt) const
Definition: MdtAsBuiltCondAlg.cxx:76
MdtAsBuiltCondAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MdtAsBuiltCondAlg.h:42
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
MdtAsBuiltCondAlg.h
Identifier
Definition: IdentifierFieldParser.cxx:14