11#include "GeoModelKernel/throwExcept.h"
25 return StatusCode::SUCCESS;
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;
37 std::unique_ptr<MdtAsBuiltContainer> writeCdo{std::make_unique<MdtAsBuiltContainer>()};
42 if (!inStream.good()) {
44 return StatusCode::FAILURE;
54 return StatusCode::FAILURE;
59 const coral::AttributeList& atr = itr->second;
60 const std::string
data{*(
static_cast<const std::string*
>((atr[
"data"]).addressOfData()))};
63 nlohmann::json j = nlohmann::json::parse(
data);
64 lines = j[
"corrections"];
73 return StatusCode::SUCCESS;
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"];
89 ATH_MSG_FATAL(
"The AMDB identifier "<<stationType<<
", "<<stationEta<<
", "<<stationPhi<<
" does not seem to be a MDT one");
90 return StatusCode::FAILURE;
94 xPar.
setAmdbId(stationType, stationEta, stationPhi, 0);
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()) {
109 return line[prefix.str()+val];
112 getValue(
"alpha"), getValue(
"ypitch"),
113 getValue(
"zpitch"),getValue(
"stagg"));
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;
124 return StatusCode::SUCCESS;
128 nlohmann::json& jsonDump)
const {
131 constexpr std::string_view delimiter{
"\n"};
133 unsigned int nLines{0};
134 for (
const std::string& blobline : lines) {
136 constexpr std::string_view delimiter{
":"};
139 if (tokens.empty()) {
141 return StatusCode::FAILURE;
143 const std::string_view &
type = tokens[0];
145 if (
type[0] ==
'#') {
150 if (
type.compare(0, 4,
"Corr") == 0) {
151 nlohmann::json newLine;
153 jsonDump.push_back(newLine);
157 return StatusCode::SUCCESS;
162 nlohmann::json& newChannel)
const {
163 std::istringstream in(asciiData);
166 if (!((in >> tok) && (tok ==
"Corr:"))) {
167 ATH_MSG_FATAL(__FILE__<<
":"<<__LINE__<<
" Failed to parse line "<<asciiData);
168 return StatusCode::FAILURE;
172 if (!(in >> typ >> jff >> jzz)) {
173 ATH_MSG_FATAL(__FILE__<<
":"<<__LINE__<<
" Failed to parse line "<<asciiData);
174 return StatusCode::FAILURE;
176 newChannel[
"typ"] = typ;
177 newChannel[
"jff"] = jff;
178 newChannel[
"jzz"] = jzz;
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;
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;
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;
203 dumpValue(
"alpha", alpha);
204 dumpValue(
"ypitch", ypitch);
205 dumpValue(
"zpitch", zpitch);
206 dumpValue(
"stagg", stagg[
static_cast<unsigned int>(ml)]);
209 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
std::set< MdtAsBuiltPar, std::less<> > MdtAsBuiltContainer
char data[hepevt_bytes_allocation_ATLAS]
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Base class for conditions algorithms.
ChanAttrListMap::const_iterator const_iterator
static EventIDRange infiniteTime()
Produces an EventIDRange that is inifinite in Time and invalid in RunLumi.
SG::WriteCondHandleKey< MdtAsBuiltContainer > m_writeKey
StatusCode legacyFormatToJSON(const std::string &bloblines, nlohmann::json &lines) const
StatusCode setFromAscii(const std::string &asciiData, nlohmann::json &newChannel) const
Gaudi::Property< std::string > m_readFromJSON
Load the alignment parameters from a JSON file.
MdtAsBuiltCondAlg(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode initialize() override
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Gaudi::Property< bool > m_newFormat2020
StatusCode parseDataFromJSON(const nlohmann::json &lines, MdtAsBuiltContainer &asBuilt) const
virtual StatusCode execute(const EventContext &ctx) const override
Container classifier the MDT as-built parameters See parameter description in http://atlas-muon-align...
multilayer_t
MDT multi-layer index.
void setAlignmentParameters(multilayer_t iML, tubeSide_t iTubeSide, float y0, float z0, float alpha, float ypitch, float zpitch, int stagg)
Set the alignment parameters for a ML and a tube side.
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
std::vector< std::string > tokenize(const std::string &the_str, std::string_view delimiters)
Splits the string into smaller substrings.
#define THROW_EXCEPTION(MESSAGE)