ATLAS Offline Software
Loading...
Searching...
No Matches
TRTCondWrite.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <fstream>
6#include <iostream>
7#include <string>
8#include "TRTCondWrite.h"
14
22TRTCondWrite::TRTCondWrite(const std::string &name, ISvcLocator *pSvcLocator)
23 : AthCondAlgorithm(name, pSvcLocator) {}
24
26{
27
28 ATH_MSG_DEBUG("TRTCondWrite::initialize() called");
29
30 // Get ID helper
31 ATH_CHECK(detStore()->retrieve(m_trtid, "TRT_ID"));
32
33 // Get condSvc
34 ATH_CHECK(m_condSvc.retrieve());
35
36 // Format of input text file
37 int format = 0;
38 if (m_par_caltextfile != "")
39 {
40 ATH_MSG_INFO(" input text file supplied " << m_par_caltextfile);
41 if (StatusCode::SUCCESS != checkTextFile(m_par_caltextfile, format))
42 {
43 ATH_MSG_INFO("Could not find or could not read text file" << m_par_caltextfile);
44 return StatusCode::SUCCESS;
45 }
46 ATH_MSG_INFO(" Found format " << format << " in text file " << m_par_caltextfile);
47 }
48 else
49 {
50 ATH_MSG_ERROR(" No input text file supplied. Initialization done. ");
51 return StatusCode::FAILURE;
52 }
53
54 // Write keys
55 // If an input text file is specified, initialize write keys. The corresponding folders must be blocked.
56
57 if (m_par_caltextfile != "" && format > 0)
58 {
59
60 ATH_CHECK(m_rtWriteKey.initialize());
61 if (m_condSvc->regHandle(this, m_rtWriteKey).isFailure())
62 ATH_MSG_ERROR("unable to register WriteCondHandle " << m_rtWriteKey.fullKey());
63 ATH_MSG_INFO("Registered WriteCondHandle " << m_rtWriteKey.fullKey());
64 ATH_CHECK(m_t0WriteKey.initialize());
65 if (m_condSvc->regHandle(this, m_t0WriteKey).isFailure())
66 ATH_MSG_ERROR("unable to register WriteCondHandle " << m_t0WriteKey.fullKey());
67 ATH_MSG_INFO("Registered WriteCondHandle " << m_t0WriteKey.fullKey());
68 }
69 ATH_MSG_INFO(" Initilization done with WriteKey Registraton ");
70
71 return StatusCode::SUCCESS;
72}
73
74StatusCode TRTCondWrite::execute(const EventContext& ctx) const
75{
76
77 // Read from text file?
78 if (!m_par_caltextfile.empty())
79 {
80 std::ifstream infile(m_par_caltextfile.value().c_str());
81 if (infile)
82 {
83 ATH_MSG_INFO(" Read calibration constants from text file " << m_par_caltextfile);
84 int format = 0;
85 if (StatusCode::SUCCESS != readTextFile(ctx, m_par_caltextfile, format))
86 {
87 ATH_MSG_FATAL("Could not read calibration objects from text file " << m_par_caltextfile);
88 return StatusCode::FAILURE;
89 }
90 }
91 else
92 {
93 ATH_MSG_ERROR("Input file does not exist " << m_par_caltextfile.value().c_str());
94 return StatusCode::FAILURE;
95 }
96 infile.close();
97 }
98 else
99 {
100 ATH_MSG_ERROR("No input filename supplied ");
101 return StatusCode::FAILURE;
102 }
103
104 return StatusCode::SUCCESS;
105 ;
106}
107
109{
110 return StatusCode::SUCCESS;
111}
112
113StatusCode TRTCondWrite::checkTextFile(const std::string &filename, int &format)
114{
115
116 StatusCode sc = StatusCode::SUCCESS;
117 std::ifstream infile(filename.c_str());
118 if (!infile)
119 {
120 sc = StatusCode::FAILURE;
121 }
122 else
123 {
124 // read the format tag. if none, default to 0
125 format = 0;
126 char line[512];
127 infile.getline(line, 512);
128 std::string linestring(line);
129 size_t pos = linestring.find("Fileformat");
130 if (pos != std::string::npos)
131 {
132 sscanf(line, "# Fileformat=%d", &format);
133 }
134 else
135 {
136 ATH_MSG_WARNING("Input file has no Fileformat identifier. Assuming format=0.");
137 // 'rewind' the file
138
139 infile.close();
140 infile.open(filename.c_str());
141 }
142 }
143 infile.close();
144 return sc;
145}
146
147StatusCode TRTCondWrite::readTextFile(const EventContext& ctx, const std::string &filename, int &format) const
148{
149
150 StatusCode sc = StatusCode::SUCCESS;
151 std::ifstream infile(filename.c_str());
152 if (!infile)
153 {
154 ATH_MSG_ERROR("Cannot find input file " << filename);
155 sc = StatusCode::FAILURE;
156 }
157 else
158 {
159 // read the format tag. if none, default to 0
160 format = 0;
161 char line[512];
162 infile.getline(line, 512);
163 std::string linestring(line);
164 size_t pos = linestring.find("Fileformat");
165 if (pos != std::string::npos)
166 {
167 sscanf(line, "# Fileformat=%d", &format);
168 }
169 else
170 {
171 ATH_MSG_WARNING("Input file has no Fileformat identifier. Assuming format=1");
172 // 'rewind' the file
173
174 infile.close();
175 infile.open(filename.c_str());
176 }
177 ATH_MSG_INFO("Reading calibration data from text file " << filename << " format " << format);
178 // force format 1 here
179 sc = readTextFile_Format1(ctx, infile);
180 }
181 infile.close();
182 return sc;
183}
184
185StatusCode TRTCondWrite::readTextFile_Format1(const EventContext& ctx, std::istream &infile) const
186{
187
188 enum ReadMode
189 {
190 ReadingRtRelation,
191 ReadingStrawT0,
192 ReadingGarbage
193 };
194 ReadMode readmode = ReadingGarbage;
195
196 // Make containers for access via ReadCondHandle for the reconstruction.
197 std::unique_ptr<RtRelationContainer> rtCdo{std::make_unique<RtRelationContainer>()};
198 std::unique_ptr<StrawT0Container> t0Cdo{std::make_unique<StrawT0Container>()};
199
200 char line[512];
201 int nrtrelations(0), nstrawt0(0);
202 while (infile.getline(line, 512))
203 {
204 if (line[0] == '#')
205 {
206 // line with tag
207 std::string linestring(line);
208 if (linestring.find("RtRelation") != std::string::npos)
209 {
210 readmode = ReadingRtRelation;
211 ATH_MSG_INFO(" Found line with Rt tag ");
212 }
213 else if (linestring.find("StrawT0") != std::string::npos)
214 {
215 readmode = ReadingStrawT0;
216 ATH_MSG_INFO(" Found line with T0 tag ");
217 }
218 else
219 readmode = ReadingGarbage;
220 }
221 else if (readmode != ReadingGarbage)
222 {
223 std::istringstream is(line);
224 // read the id
226 is >> id;
227 // read the semicolon that end the id
228 char dummy;
229 is >> dummy;
230
231 // read the object
232 if (readmode == ReadingRtRelation)
233 {
234
236 //Values read in should have their values checked against sensible limits.
237 //We assume the input is trusted however.
238 //coverity[TAINTED_SCALAR]
239 rtCdo->set(id, rt);
240 delete rt;
241 ++nrtrelations;
242 }
243 else if (readmode == ReadingStrawT0)
244 {
245
246 float t0(0), t0err(0);
247 is >> t0 >> t0err;
248 if (t0 > 0)
249 {
250 //Values read in should have their values checked against sensible limits.
251 //We assume the input is trusted however.
252 //coverity[TAINTED_SCALAR]
253 t0Cdo->setT0(id, t0, t0err);
254 ++nstrawt0;
255 }
256 }
257 }
258 }
259
260 // Check that containers were filled
261
262 size_t t0footprint = t0Cdo->footprint();
263 size_t rtfootprint = rtCdo->footprint();
264
265 ATH_MSG_INFO("read " << nstrawt0 << " t0 and " << nrtrelations << " rt from file. "
266 << " t0/rt footprints " << t0footprint << " / " << rtfootprint << " t0 footprint after crunch " << t0Cdo->footprint());
267
268 // Record the containers for access via ReadCondHandle during reconstruction
269 const EventIDRange rangeW = IOVInfRange();
271 if (rtWriteHandle.isValid())
272 {
273 ATH_MSG_DEBUG(" RtRelationContainer already available ");
274 return StatusCode::SUCCESS;
275 }
276
277 if (rtWriteHandle.record(rangeW, std::move(rtCdo)).isFailure())
278 {
279 ATH_MSG_ERROR("Could not record RT Container for key " << m_rtWriteKey.fullKey() << " with WriteHandle ");
280 return StatusCode::FAILURE;
281 }
282 else
283 {
284 ATH_MSG_INFO("Recorded RT Container for key " << m_rtWriteKey.fullKey() << " with range " << rtWriteHandle.getRange());
285 }
286
288 if (t0WriteHandle.isValid())
289 {
290 ATH_MSG_DEBUG(" StrawT0Container already available ");
291 return StatusCode::SUCCESS;
292 }
293
294 if (t0Cdo->initialize().isFailure())
295 ATH_MSG_WARNING("Could not initialize T0 Container for key " << m_t0WriteKey.fullKey());
296
297 if (t0WriteHandle.record(rangeW, std::move(t0Cdo)).isFailure())
298 {
299 ATH_MSG_ERROR("Could not record T0 Container for key " << m_t0WriteKey.fullKey() << " with WriteHandle ");
300 return StatusCode::FAILURE;
301 }
302 else
303 {
304 ATH_MSG_INFO("Recorded T0 Container for key " << m_t0WriteKey.fullKey() << " with range " << t0WriteHandle.getRange());
305 }
306
307 return StatusCode::SUCCESS;
308}
309
311{
312 return TRTCond::ExpandedIdentifier(m_trtid->barrel_ec(id), m_trtid->layer_or_wheel(id),
313 m_trtid->phi_module(id), m_trtid->straw_layer(id),
314 m_trtid->straw(id), level);
315}
316EventIDRange TRTCondWrite::IOVInfRange() const
317{
318 const EventIDBase start{1, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM, 0};
319 const EventIDBase stop{EventIDBase::UNDEFNUM - 1, EventIDBase::UNDEFEVT, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM, EventIDBase::UNDEFNUM - 1};
320 return EventIDRange{start, stop};
321}
#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_WARNING(x)
#define ATH_MSG_DEBUG(x)
static Double_t sc
static Double_t t0
CondAlg to read TRT calibration constants in from text file and load them in ConditionsStore.
const ServiceHandle< StoreGateSvc > & detStore() const
Base class for conditions algorithms.
const EventIDRange & getRange() const
StatusCode record(const EventIDRange &range, T *t)
record handle, with explicit range DEPRECATED
TRTCondWrite(const std::string &name, ISvcLocator *pSvcLocator)
constructor
virtual TRTCond::ExpandedIdentifier trtcondid(const Identifier &id, int level=TRTCond::ExpandedIdentifier::STRAW) const
create an TRTCond::ExpandedIdentifier from a TRTID identifier
virtual StatusCode execute(const EventContext &ctx) const override
virtual StatusCode checkTextFile(const std::string &file, int &format)
read calibration from text file into TDS
Gaudi::Property< std::string > m_par_caltextfile
SG::WriteCondHandleKey< StrawT0Container > m_t0WriteKey
virtual StatusCode initialize(void) override
const TRT_ID * m_trtid
trt id helper
ServiceHandle< ICondSvc > m_condSvc
virtual EventIDRange IOVInfRange() const
virtual StatusCode readTextFile_Format1(const EventContext &, std::istream &) const
SG::WriteCondHandleKey< RtRelationContainer > m_rtWriteKey
virtual StatusCode finalize(void) override
virtual StatusCode readTextFile(const EventContext &ctx, const std::string &file, int &format) const
static RtRelation * readFromFile(std::istream &is)
read method
Base class for rt-relations in the TRT.
Definition RtRelation.h:27