ATLAS Offline Software
Loading...
Searching...
No Matches
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>
12
13
14 CscILinesCondAlg::CscILinesCondAlg(const std::string& name, ISvcLocator* pSvcLocator):
15 AthCondAlgorithm{name,pSvcLocator}{}
16
17
19 ATH_CHECK(m_readKey.initialize(m_readFromJSON.value().empty()));
20 ATH_CHECK(m_writeKey.initialize());
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}
30StatusCode 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...");
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 ");
67 nlohmann::json lines = nlohmann::json::array();
68
69 // new format -----------------------------------
70 if (m_newFormat2020) {
71 nlohmann::json j = nlohmann::json::parse(data);
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 }
85 nlohmann::json lines;
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
98StatusCode CscILinesCondAlg::loadDataFromLegacy(const std::string& data, nlohmann::json& json) const {
99 // Parse corrections
100 constexpr std::string_view delimiter{"\n"};
101 json = nlohmann::json::array();
102 auto lines = CxxUtils::tokenize(data, delimiter);
103 for (const std::string& blobline : lines) {
104 nlohmann::json line;
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}
159StatusCode CscILinesCondAlg::parseDataFromJSON(const nlohmann::json& lines,
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}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
std::set< ALinePar, std::less<> > ALineContainer
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
nlohmann::json json
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
void setParameters(float s, float z, float t, float rotS, float rotZ, float rotT)
Definition ALinePar.cxx:26
Base class for conditions algorithms.
ChanAttrListMap::const_iterator const_iterator
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
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...
SG::WriteCondHandleKey< ALineContainer > m_writeKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
virtual StatusCode initialize() override
Gaudi::Property< std::string > m_readFromJSON
Load the alignment parameters from a JSON file.
virtual StatusCode execute(const EventContext &ctx) const override
StatusCode parseDataFromJSON(const nlohmann::json &lines, ALineContainer &writeCdo) const
Parse the JSON blob to fill the I Line container.
CscILinesCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< bool > m_newFormat2020
static EventIDRange infiniteTime()
Produces an EventIDRange that is inifinite in Time and invalid in RunLumi.
void setIdentifier(const Identifier &id)
Setters and getters for the Athena Identifier.
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)
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
bool readBlobAsString(const coral::Blob &, std::string &)
std::vector< std::string > tokenize(const std::string &the_str, std::string_view delimiters)
Splits the string into smaller substrings.
double atof(std::string_view str)
Converts a string into a double / float.
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...