ATLAS Offline Software
CscILinesCondAlg.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>
5 #include <memory>
11 #include <CxxUtils/StringUtils.h>
12 
13 
14  CscILinesCondAlg::CscILinesCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
15  AthReentrantAlgorithm{name,pSvcLocator}{}
16 
17 
19  ATH_CHECK(m_readKey.initialize(m_readFromJSON.value().empty()));
21  ATH_CHECK(m_idHelperSvc.retrieve());
22  if (!m_readFromJSON.value().empty()){
23  ATH_MSG_INFO("Load Intenal Csc alignment from JSON "<<m_readFromJSON);
24  } else {
25  ATH_MSG_INFO("Load Internal Csc alignment from COOL <"<<m_readKey.key()<<">");
26  }
27  return StatusCode::SUCCESS;
28 
29 }
30 StatusCode CscILinesCondAlg::execute(const EventContext& ctx) const {
32  if (writeHandle.isValid()) {
33  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
34  << ". In theory this should not be called, but may happen"
35  << " if multiple concurrent events are being processed out of order.");
36  return StatusCode::SUCCESS;
37  }
38  writeHandle.addDependency(EventIDRange(IOVInfiniteRange::infiniteTime()));
39  std::unique_ptr<ALineContainer> writeCdo{std::make_unique<ALineContainer>()};
40  if (!m_readKey.empty()) {
42  if (!readHandle.isValid()) {
43  ATH_MSG_FATAL("Failed to load I lines from COOL "<<m_readKey.fullKey());
44  return StatusCode::FAILURE;
45  }
46  writeHandle.addDependency(readHandle);
47  // =======================
48  // Retrieve the collection of strings read out from the DB
49  // =======================
50  // unpack the strings in the collection and update the
51  // ALlineContainer in TDS
52  for (CondAttrListCollection::const_iterator itr = readHandle->begin();
53  itr != readHandle->end(); ++itr) {
54 
55  const coral::AttributeList& atr = itr->second;
56  std::string data;
57  if (atr["data"].specification().type() == typeid(coral::Blob)) {
58  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
59  if (!CoralUtilities::readBlobAsString(atr["data"].data<coral::Blob>(), data)) {
60  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
61  return StatusCode::FAILURE;
62  }
63  } else {
64  data = *(static_cast<const std::string*>((atr["data"]).addressOfData()));
65  }
66  ATH_MSG_DEBUG("Data load is " << data << " FINISHED HERE ");
68 
69  // new format -----------------------------------
70  if (m_newFormat2020) {
72  lines = j["corrections"];
73  } else {
74  // old format -----------------------------------
76  }
77  ATH_CHECK(parseDataFromJSON(lines, *writeCdo));
78  }
79  if (!m_readFromJSON.value().empty()) {
80  std::ifstream inStream{PathResolverFindCalibFile(m_readFromJSON)};
81  if (!inStream.good()) {
82  ATH_MSG_FATAL("No such file or directory");
83  return StatusCode::FAILURE;
84  }
86  inStream >> lines;
87  ATH_CHECK(parseDataFromJSON(lines, *writeCdo));
88  }
89  }
90 
91 
92  ATH_CHECK(writeHandle.record(std::move(writeCdo)));
93  ATH_MSG_INFO("Saved successfully internal CSC alignment "<<m_writeKey.fullKey()<<" with validity range "<<writeHandle.getRange());
94  return StatusCode::SUCCESS;
95 }
96 
97 
99  // Parse corrections
100  constexpr std::string_view delimiter{"\n"};
103  for (const std::string& blobline : lines) {
105  constexpr std::string_view delimiter {":"};
106  auto tokens = CxxUtils::tokenize(blobline, delimiter);
107  // Check if tokens is not empty
108  if (tokens.empty()) {
109  ATH_MSG_FATAL("Empty string retrieved from DB ");
110  return StatusCode::FAILURE;
111  }
112  const std::string_view type = tokens[0];
113  // Parse line
114  if ('#' == type[0]) {
115  // skip it
116  continue;
117  }
118  if (type.compare(0, 4, "Corr") == 0) {
119  //# Amdb like clob for ilines using geometry tag ISZT-R06-02
120  //# ISZT_DATA_ID VERS TYP JFF JZZ JOB JLAY TRAS TRAZ TRAT ROTS ROTZ ROTT
121  //
122  //.... example
123  // Corr: CSL 1 -1 3 1 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
124 
125  constexpr std::string_view delimiter{" "};
126  auto tokens = CxxUtils::tokenize(blobline, delimiter);
127  if (tokens.size() != 12) {
128  ATH_MSG_FATAL("Invalid length in string retrieved from DB in folder. String length is "
129  << tokens.size());
130  return StatusCode::FAILURE;
131  }
132 
133  ATH_MSG_VERBOSE("Parsing Line = ");
134  for (std::string_view token : tokens) ATH_MSG_VERBOSE(token << " | ");
135 
136 
137  // Start parsing
138  int ival = 1;
139  // Station Component identification
140  line["typ"] = std::string(tokens[ival++]);
141  line["jff"] = CxxUtils::atoi(tokens[ival++]);
142  line["jzz"] = CxxUtils::atoi(tokens[ival++]);
143  line["job"] = CxxUtils::atoi(tokens[ival++]);
144  line["jlay"] = CxxUtils::atoi(tokens[ival++]);
145 
146  // I-line
147  line["tras"] = CxxUtils::atof(tokens[ival++]);
148  line["traz"] = CxxUtils::atof(tokens[ival++]);
149  line["trat"] = CxxUtils::atof(tokens[ival++]);
150  line["rots"] = CxxUtils::atof(tokens[ival++]);
151  line["rotz"] = CxxUtils::atof(tokens[ival++]);
152  line["rott"] = CxxUtils::atof(tokens[ival++]);
153  }
154  if (line.empty()) continue;
155  json.push_back(std::move(line));
156  }
157  return StatusCode::SUCCESS;
158 }
160  ALineContainer& writeCdo) const{
161 
162  for (auto& corr : lines.items()) {
163  nlohmann::json line = corr.value();
164  ALinePar newILine{};
165 
166  // Station Component identification
167  const int jff = line["jff"];
168  const int jzz = line["jzz"];
169  const int job = line["job"];
170  const int jlay = line["jlay"];
171  const std::string stationType = line["typ"];
172  newILine.setAmdbId(stationType, jzz, jff, job);
173 
174  Identifier id{0};
175  bool is_valid{false};
176  if (stationType[0] == 'C') {
177  // csc case
178  constexpr int chamberLayer = 2;
179  if (job != 3) ATH_MSG_WARNING("job = " << job << " is not 3 => chamberLayer should be 1 - not existing ! setting 2");
180  id = m_idHelperSvc->cscIdHelper().channelID(stationType, jzz, jff, chamberLayer, jlay, 0, 1, is_valid);
181  ATH_MSG_VERBOSE("identifier being assigned is " << m_idHelperSvc->toString(id));
182  }
183  if (!is_valid) {
184  ATH_MSG_ERROR("There is a non CSC chamber in the list of CSC internal alignment parameters.");
185  return StatusCode::FAILURE;
186  }
187  newILine.setIdentifier(id);
188 
189  newILine.setParameters(line["tras"], line["traz"], line["trat"],
190  line["rots"], line["rotz"], line["rott"]);
191  // new Iline
192  const auto insertItr = writeCdo.insert(newILine);
193  if (!insertItr.second) {
194  ATH_MSG_FATAL("Could not insert "<<newILine<<" as "<<(*insertItr.first)<<" has already been safed before" );
195  return StatusCode::FAILURE;
196 
197  }
198  }
199  return StatusCode::SUCCESS;
200 }
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
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
ALinePar
Definition: ALinePar.h:15
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
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:983
StringUtils.h
CscILinesCondAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: CscILinesCondAlg.cxx:30
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
CscILinesCondAlg::CscILinesCondAlg
CscILinesCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: CscILinesCondAlg.cxx:14
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
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
ReadCondHandle.h
CscILinesCondAlg::loadDataFromLegacy
StatusCode loadDataFromLegacy(const std::string &data, nlohmann::json &json) const
Load the Alignment data from the legacy format where the channels are parsed line wise The data is th...
Definition: CscILinesCondAlg.cxx:98
CscILinesCondAlg::m_newFormat2020
Gaudi::Property< bool > m_newFormat2020
Definition: CscILinesCondAlg.h:35
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
WriteCellNoiseToCool.ival
ival
Definition: WriteCellNoiseToCool.py:337
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
CscILinesCondAlg::parseDataFromJSON
StatusCode parseDataFromJSON(const nlohmann::json &lines, ALineContainer &writeCdo) const
Parse the JSON blob to fill the I Line container.
Definition: CscILinesCondAlg.cxx:159
CoralUtilities::readBlobAsString
bool readBlobAsString(const coral::Blob &, std::string &)
Definition: blobaccess.cxx:85
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
WriteCondHandle.h
CscILinesCondAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: CscILinesCondAlg.h:33
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ALineContainer
std::set< ALinePar, std::less<> > ALineContainer
Definition: CorrContainer.h:16
CscILinesCondAlg::m_writeKey
SG::WriteCondHandleKey< ALineContainer > m_writeKey
Definition: CscILinesCondAlg.h:30
CxxUtils::atof
double atof(std::string_view str)
Converts a string into a double / float.
Definition: Control/CxxUtils/Root/StringUtils.cxx:91
lumiFormat.array
array
Definition: lumiFormat.py:98
IOVInfiniteRange.h
PathResolver.h
CscILinesCondAlg::m_readFromJSON
Gaudi::Property< std::string > m_readFromJSON
Load the alignment parameters from a JSON file.
Definition: CscILinesCondAlg.h:38
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
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
CscILinesCondAlg::initialize
virtual StatusCode initialize() override
Definition: CscILinesCondAlg.cxx:18
IOVInfiniteRange::infiniteTime
static EventIDRange infiniteTime()
Produces an EventIDRange that is inifinite in Time and invalid in RunLumi.
Definition: IOVInfiniteRange.h:47
test_interactive_athena.job
job
Definition: test_interactive_athena.py:6
CscILinesCondAlg::m_readKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Definition: CscILinesCondAlg.h:27
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
CscILinesCondAlg.h