ATLAS Offline Software
Loading...
Searching...
No Matches
TgcDigitJitterCondAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
9#include <fstream>
10
11// constructor
12TgcDigitJitterCondAlg::TgcDigitJitterCondAlg(const std::string& name, ISvcLocator* pSvcLocator) :
13 AthCondAlgorithm(name, pSvcLocator) {}
14
15// Initialize
17 ATH_MSG_DEBUG("initializing " << name());
18 ATH_CHECK(m_writeKey.initialize());
19 ATH_CHECK(m_readKeyDb.initialize(!m_readKeyDb.empty()));
20 if (m_readKeyDb.empty() && m_readFromJSON.value().empty()){
21 ATH_MSG_FATAL("No data source is given to load the jitter constants from. Please provide either a COOL folder or a json file");
22 return StatusCode::FAILURE;
23 } else if (m_readKeyDb.empty()) {
24 ATH_MSG_INFO("Load jitter constants from a JSON file "<<m_readFromJSON);
25 } else {
26 ATH_MSG_INFO("Load the jitter constants list from COOL "<<m_readKeyDb.fullKey());
27 }
28 return StatusCode::SUCCESS;
29}
30
31// execute
32StatusCode TgcDigitJitterCondAlg::execute(const EventContext& ctx) const {
33 ATH_MSG_DEBUG("execute " << name());
34 // launching Write Cond Handle
36 if (writeHandle.isValid()) {
37 ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
38 << " In theory this should not be called, but may happen"
39 << " if multiple concurrent events are being processed out of order.");
40 return StatusCode::SUCCESS;
41 }
42 writeHandle.addDependency(EventIDRange(IOVInfiniteRange::infiniteTime()));
43 std::unique_ptr<TgcDigitJitterData> writeCdo{std::make_unique<TgcDigitJitterData>()};
44 if (!m_readKeyDb.empty()) {
46 if (!readHandle.isValid()) {
47 ATH_MSG_FATAL("Failed to initialize the COOL folder "<<m_readKeyDb.fullKey());
48 return StatusCode::FAILURE;
49 }
50 writeHandle.addDependency(readHandle);
51 for (CondAttrListCollection::const_iterator itr = readHandle->begin(); itr != readHandle->end(); ++itr) {
52 const coral::AttributeList& atr = itr->second;
53 const std::string& data{*(static_cast<const std::string*>((atr["data"]).addressOfData()))};
54 nlohmann::json lines = nlohmann::json::parse(data);
55 ATH_CHECK(parseDataFromJSON(lines, *writeCdo));
56 }
57 } else {
58 std::ifstream inStream{PathResolverFindCalibFile(m_readFromJSON)};
59 if (!inStream.good()) {
60 ATH_MSG_FATAL("No such file or directory");
61 return StatusCode::FAILURE;
62 }
63 nlohmann::json lines;
64 inStream >> lines;
65 ATH_CHECK(parseDataFromJSON(lines, *writeCdo));
66 }
67 ATH_CHECK(writeCdo->initialize());
68 ATH_CHECK(writeHandle.record(std::move(writeCdo)));
69 ATH_MSG_DEBUG("Recorded new " << writeHandle.key() << " with range " << writeHandle.getRange() << " into Conditions Store");
70 return StatusCode::SUCCESS;
71}
72
73StatusCode TgcDigitJitterCondAlg::parseDataFromJSON(const nlohmann::json& lines,
74 TgcDigitJitterData& jitterData) const {
75 for (auto& corr : lines.items()) {
76 nlohmann::json line = corr.value();
77 const double angle = line["angle"];
78 std::vector<double> values = line["values"];
79 jitterData.cacheAngleInterval(angle, std::move(values));
80 }
81 return StatusCode::SUCCESS;
82}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
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.
const std::string & key() const
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
StatusCode parseDataFromJSON(const nlohmann::json &lines, TgcDigitJitterData &jitterChannels) const
Load the Jitter constants from the JSON format.
Gaudi::Property< std::string > m_readFromJSON
Use an external JSON file to load the Jitter constants from.
virtual StatusCode execute(const EventContext &ctx) const override
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyDb
virtual StatusCode initialize() override
SG::WriteCondHandleKey< TgcDigitJitterData > m_writeKey
TgcDigitJitterCondAlg(const std::string &name, ISvcLocator *svc)
void cacheAngleInterval(const double minAngle, std::vector< double > &&timeProbs)