ATLAS Offline Software
MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
12 #include "CLHEP/Random/RandGaussZiggurat.h"
13 #include "CoralBase/Attribute.h"
14 #include "CoralBase/AttributeListSpecification.h"
15 #include "GaudiKernel/PhysicalConstants.h"
17 #include "MdtCalibData/CalibFunc.h"
30 #include "MuonCalibStl/ToString.h"
36 
37 #include "CxxUtils/StringUtils.h"
38 
39 
40 #include <fstream>
41 
42 #include "TFile.h"
43 #include "TSpline.h"
44 #include "GeoModelHelpers/throwExcept.h"
45 
46 using namespace MuonCalib;
47 using namespace CxxUtils;
51 
52 MdtCalibDbAlg::MdtCalibDbAlg(const std::string &name, ISvcLocator *pSvcLocator) :
53  AthReentrantAlgorithm(name, pSvcLocator) {}
54 
56  ATH_MSG_DEBUG("initialize " << name());
57 
58  // if timeslew correction vector m_MeanCorrectionVsR has non-zero size then set
59  // m_TsCorrectionT0=m_MeanCorrectionVsR[0] and subtract this each value in the vector.
60  if (m_MeanCorrectionVsR.size()) {
62  for (float & it : m_MeanCorrectionVsR) {
64  }
65  }
66 
67  ATH_CHECK(m_idHelperSvc.retrieve());
68  ATH_CHECK(m_idToFixedIdTool.retrieve());
69  // initiallize random number generator if doing t0 smearing (for robustness studies)
70  if (m_t0Spread != 0.) {
71  ATH_CHECK(m_AthRNGSvc.retrieve());
72  ATH_MSG_DEBUG(" initialize Random Number Service: running with t0 shift "
73  << m_t0Shift << " spread " << m_t0Spread << " rt shift " << m_rtShift);
74  // getting our random numbers stream
75  m_RNGWrapper = m_AthRNGSvc->getEngine(this, m_randomStream);
76  if (!m_RNGWrapper) {
77  ATH_MSG_ERROR("Could not get random number engine from AthRNGSvc. Abort.");
78  return StatusCode::FAILURE;
79  }
80  }
81 
82  if (m_rtShift != 0. || m_rtScale != 1. || m_t0Shift != 0. || m_t0Spread != 0.) {
83  ATH_MSG_INFO("************************************" << std::endl
84  << " Running with Calibration Deformations! " << std::endl
85  << " For performance studies only!" << std::endl
86  << " **************************************");
87  ATH_MSG_DEBUG(" rt scale " << m_rtScale << " t0 shift " << m_t0Shift << " spread " << m_t0Spread << " rt shift " << m_rtShift);
88  }
89 
94 
97  return StatusCode::SUCCESS;
98 }
99  StatusCode MdtCalibDbAlg::declareDependency(const EventContext& ctx,
101 
102  writeHandle.addDependency(EventIDRange(IOVInfiniteRange::infiniteTime()));
104  if (key.empty()) continue;
106  if (!readHandle.isValid()) {
107  ATH_MSG_FATAL("Failed to retrieve conditions object "<<readHandle.fullKey());
108  return StatusCode::FAILURE;
109  }
110  writeHandle.addDependency(readHandle);
111  ATH_MSG_INFO("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdoRt->size()= " << readHandle->size());
112  ATH_MSG_INFO("Range of input is " << readHandle.getRange());
113  }
114  if (m_readKeyDCS.empty()) return StatusCode::SUCCESS;
116  if (!readHandle.isValid()) {
117  ATH_MSG_FATAL("Failed to retrieve conditions object "<<m_readKeyDCS.fullKey());
118  return StatusCode::FAILURE;
119  }
120  writeHandle.addDependency(readHandle);
121  return StatusCode::SUCCESS;
122 }
123 StatusCode MdtCalibDbAlg::execute(const EventContext& ctx) const {
124  ATH_MSG_DEBUG("execute " << name());
126  if (writeHandle.isValid()) {
127  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
128  << ". In theory this should not be called, but may happen"
129  << " if multiple concurrent events are being processed out of order.");
130  return StatusCode::SUCCESS;
131  }
132  ATH_CHECK(declareDependency(ctx, writeHandle));
133 
134  RegionGranularity gran{RegionGranularity::OnePerChamber};
135  if (m_readKeyRt.key() == "/MDT/RTUNIQUE") {
136  ATH_MSG_DEBUG("Save one set of Rt constants per chamber");
137  gran = RegionGranularity::OneRt;
138  } else if (m_UseMLRt) {
139  ATH_MSG_DEBUG("Save one set of calibration constants per multi layer");
140  gran = RegionGranularity::OnePerMultiLayer;
141  } else ATH_MSG_DEBUG("Save one set of calibration constants per chamber");
142  std::unique_ptr<MuonCalib::MdtCalibDataContainer> writeCdo = std::make_unique<MuonCalib::MdtCalibDataContainer>(m_idHelperSvc.get(), gran);
143 
144  ATH_CHECK(loadRt(ctx, *writeCdo));
145  ATH_CHECK(loadTube(ctx, *writeCdo));
146  ATH_CHECK(writeHandle.record(std::move(writeCdo)));
147  return StatusCode::SUCCESS;
148 }
149 
151  ATH_MSG_DEBUG("defaultRt " << name());
153  std::ifstream inputFile(fileName);
154  if (!inputFile) {
155  ATH_MSG_ERROR("Unable to open RT Ascii file: " << fileName);
156  return StatusCode::FAILURE;
157  }
158  ATH_MSG_DEBUG("Opened RT Ascii file: " << fileName);
159 
160 
161  // Read the RTs from the text file
163  rts.read(inputFile);
164  ATH_MSG_VERBOSE("File contains " << rts.nRts() << " RT relations ");
165 
166  // Loop over all RTs in the file (but the default file only has 1 RT)
167  // Use the first valid RT found in the file as the default for all chambers.
168  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
169  for (unsigned int n = 0; n < rts.nRts(); ++n) {
170  std::unique_ptr<MuonCalib::RtDataFromFile::RtRelation> rt(rts.getRt(n));
171 
175 
176  // check if rt contains data, at least two points on the rt are required
177  if (times.size() < 2) {
178  ATH_MSG_ERROR(" defaultRt rt table has too few entries");
179  return StatusCode::FAILURE;
180  }
181  // check if all tables have same size
182  if (times.size() != radii.size() || times.size() != reso.size()) {
183  ATH_MSG_ERROR("defaultRt rt table size mismatch ");
184  return StatusCode::FAILURE;
185  }
186  // check for negative time bins, i.e. decreasing time value with radius
187  double t_min = times[0];
188  double bin_size = times[1] - t_min;
189  if (bin_size <= 0) {
190  ATH_MSG_ERROR("defaultRt rt table negative binsize ");
191  return StatusCode::FAILURE;
192  }
193 
194  // create a vector to hold the r values,
195  // we need two extra fields to store t_min and bin_size
197  rtPars.push_back(t_min);
198  rtPars.push_back(bin_size);
199 
200  // copy r values into vector
201  rtPars.insert(rtPars.end(), radii.begin(), radii.end());
202 
203  ATH_MSG_DEBUG("defaultRt new MuonCalib::IRtRelation");
204 
205  MuonCalib::CalibFunc::ParVec resoPars{t_min, bin_size};
206  // copy r values into vector
207  resoPars.insert(resoPars.end(), reso.begin(), reso.end());
208 
209  ATH_MSG_DEBUG("defaultRt new MuonCalib::IRtResolution");
210 
211  // create RT and resolution "I" objects
212  std::unique_ptr<MuonCalib::IRtRelation> rtRel {MuonCalib::MdtCalibrationFactory::createRtRelation("RtRelationLookUp", rtPars)};
213  if (!rtRel) ATH_MSG_WARNING("ERROR creating RtRelationLookUp ");
214 
215  std::unique_ptr<MuonCalib::IRtResolution> resoRel{MuonCalib::MdtCalibrationFactory::createRtResolution("RtResolutionLookUp", resoPars)};
216  if (!resoRel) ATH_MSG_WARNING("ERROR creating RtResolutionLookUp ");
217 
218  // if either RT and resolution are not OK then delete both and try next RT in file
219  if (!resoRel || !rtRel) {
220  continue;
221  }
222 
223  // Since the same RT is loaded for all chambers you might be tempted to create it once
224  // and simply store the same pointer in writeCdoRt for all regions.
225  // However it seems that when StoreGate clears writeCdoRt (which will happen in LoadRt
226  // by detStore()->removeDataAndProxy) it will crash unless there are unique pointers/objects
227  // for rtRel, resoRel, and MdtRtRelation
228 
229  // Loop over RT regions and store the default RT in each
230  std::unique_ptr<MuonCalib::IRtRelation> rtRelRegion{MuonCalib::MdtCalibrationFactory::createRtRelation("RtRelationLookUp", rtPars)};
231  std::unique_ptr<MuonCalib::IRtResolution> resoRelRegion{MuonCalib::MdtCalibrationFactory::createRtResolution("RtResolutionLookUp", resoPars)};
232  RtRelationPtr MdtRt = std::make_unique<MuonCalib::MdtRtRelation>(std::move(rtRelRegion), std::move(resoRelRegion), 0.);
233 
234  for(auto itr = idHelper.detectorElement_begin();
235  itr!= idHelper.detectorElement_end();++itr){
236  const Identifier detElId{*itr};
237  if (writeCdo.hasDataForChannel(detElId, msgStream())) {
238  const MdtFullCalibData* dataObj = writeCdo.getCalibData(detElId, msgStream());
239  if (dataObj->rtRelation) {
240  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(detElId)<<" already exists");
241  continue;
242  }
243  }
245  RtRelationPtr storeMe = MdtRt;
246  if (idHelper.multilayer(detElId) == 2) {
247  if (writeCdo.granularity() != RegionGranularity::OnePerMultiLayer) continue;
248  const Identifier firstML = idHelper.multilayerID(detElId, 1);
249  if (writeCdo.hasDataForChannel(firstML, msgStream())) {
250  const MdtFullCalibData* dataObj = writeCdo.getCalibData(firstML, msgStream());
251  if (dataObj->rtRelation) {
252  ATH_MSG_DEBUG("Copy Rt constanst from the first multi layer for "<<m_idHelperSvc->toString(detElId));
253  storeMe = dataObj->rtRelation;
254  }
255  }
256  }
257  ATH_MSG_DEBUG("Add default rt constants for "<<m_idHelperSvc->toString(detElId));
258  if (!writeCdo.storeData(detElId, storeMe, msgStream())) {
259  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to save default rts for "<<m_idHelperSvc->toString(detElId));
260  return StatusCode::FAILURE;
261  }
262 
264  loadedRts[detElId] = MdtRt;
265 
266  }
267 
268  // if VERBOSE enabled print out RT function
269  if (msgLvl(MSG::VERBOSE)) {
270  int npoints = rtRel->nPar() - 2;
271  ATH_MSG_VERBOSE("defaultRt npoints from rtRel=" << npoints);
272  for (int ipt = 0; ipt < npoints; ++ipt) {
273  double t = t_min + ipt * bin_size;
274  ATH_MSG_VERBOSE(" " << ipt << " " << t << " " << rtRel->radius(t) << " " << resoRel->resolution(t));
275  }
276  }
277  break; // only need the first good RT from the text file
278 
279  } // end loop over RTs in file
280 
281  return StatusCode::SUCCESS;
282 }
283 std::optional<double> MdtCalibDbAlg::getInnerTubeRadius(const Identifier& id) const {
284  static std::atomic<bool> rtWarningPrinted = false;
285 
286  if (m_detMgr) {
288  if (detEl) { return std::make_optional<double>(detEl->innerTubeRadius()); }
289 
290  } else if (m_r4detMgr) {
291  const MuonGMR4::MdtReadoutElement* detEl = m_r4detMgr->getMdtReadoutElement(id);
292  if (detEl) { return std::make_optional<double>(detEl->innerTubeRadius()); }
293  }
294  if (!rtWarningPrinted) {
295  ATH_MSG_WARNING("getInnerTubeRadius() - no Muon station known under the name "
296  << m_idHelperSvc->toString(id));
297  rtWarningPrinted = true;
298  }
299  return std::nullopt;
300 }
301 
303  std::string data{}, delim{};
304  if (attr["data"].specification().type() == typeid(coral::Blob)) {
305  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
306  if (!CoralUtilities::readBlobAsString(attr["data"].data<coral::Blob>(), data)) {
307  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
308  return StatusCode::FAILURE;
309  }
310  delim = "\n";
311  } else {
312  data = *(static_cast<const std::string *>((attr["data"]).addressOfData()));
313  delim = " ";
314  }
315  const std::vector<std::string> tokens = tokenize(data, delim);
316  if (tokens.size() < 2) {
317  ATH_MSG_FATAL("The line "<<data<<" cannot be resolved into header & payload");
318  return StatusCode::FAILURE;
319  }
320  const std::string& header = tokens[0];
321  const std::string& payload = tokens[1];
322  ATH_MSG_DEBUG("Header: '"<<header<<"' payload: '"<<payload<<"'");
324  unsigned int numPoints{0};
326  const bool rt_ts_applied = (attr["tech"].data<int>() & MuonCalib::TIME_SLEWING_CORRECTION_APPLIED);
327  channel["appliedRT"] = rt_ts_applied;
328  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
329  {
330 
331  std::vector<int> tokensHeader = tokenizeInt(header, ",");
332  if(tokensHeader.size()< 2){
333  ATH_MSG_FATAL("Failed to deduce extract number of points & calib Identifier from "<<header);
334  return StatusCode::FAILURE;
335  }
336  unsigned int calibId = tokensHeader[0];
337  numPoints = tokensHeader[1];
338  MuonCalib::MuonFixedId id(calibId);
339  if (!id.is_mdt()) {
340  ATH_MSG_FATAL("Found non-MDT MuonFixedId, continuing...");
341  return StatusCode::FAILURE;
342  }
343  const Identifier athenaId = m_idToFixedIdTool->fixedIdToId(id);
344  if (!m_idHelperSvc->isMuon(athenaId)) {
345  ATH_MSG_WARNING("The translation from the calibration ID with station: "
346  <<id.stationNameString()<<"("<<id.stationName()<<") "
347  <<" eta:"<<id.eta()<<" phi: "<<id.phi());
348  }
349  channel["station"] = m_idHelperSvc->stationNameString(athenaId);
350  channel["eta"] = m_idHelperSvc->stationEta(athenaId);
351  channel["phi"] = m_idHelperSvc->stationPhi(athenaId);
352  channel["ml"] = idHelper.multilayer(athenaId);
353  channel["layer"] = idHelper.tubeLayer(athenaId);
354  channel["tube"] = idHelper.tube(athenaId);
355  }
357  const std::vector<double> dataPoints = tokenizeDouble(payload, ",");
358  std::vector<double> radii{}, times{}, resos{};
359  radii.reserve(numPoints);
360  times.reserve(numPoints);
361  resos.reserve(numPoints);
365  for (unsigned int k = 0 ; k < dataPoints.size(); ++k) {
366  const double value = dataPoints[k];
367  switch (k%3) {
368  case 0:
369  radii.push_back(value);
370  break;
371  case 1:
372  times.push_back(value);
373  break;
374  case 2:
375  resos.push_back(value);
376  break;
377  default:
378  break;
379  }
380  }
382  if (radii.size() != numPoints ||
383  times.size() != numPoints ||
384  resos.size() != numPoints) {
385  ATH_MSG_FATAL("Payload "<<payload<<" does not lead to the expected number of points "<<numPoints<<" vs. "<<dataPoints.size());
386  return StatusCode::FAILURE;
387  }
388  channel["radii"] = std::move(radii);
389  channel["times"] = std::move(times);
390  channel["resolutions"] = std::move(resos);
391  json.push_back(channel);
392  return StatusCode::SUCCESS;
393 }
394 
395 StatusCode MdtCalibDbAlg::loadRt(const EventContext& ctx, MuonCalib::MdtCalibDataContainer& writeCdo) const {
396  ATH_MSG_DEBUG("loadRt " << name());
397 
398  // Read Cond Handle
400  if (!readHandleRt.isValid()) {
401  ATH_MSG_ERROR("readCdoRt==nullptr");
402  return StatusCode::FAILURE;
403  }
404  // read new-style format 2020
405 
406  nlohmann::json rtCalibJson = nlohmann::json::array();
407  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
408  if (m_newFormat2020) {
409  for (CondAttrListCollection::const_iterator itr = readHandleRt->begin();
410  itr != readHandleRt->end(); ++itr) {
411  const coral::AttributeList &atr = itr->second;
412  std::string data{};
413  if (atr["data"].specification().type() == typeid(coral::Blob)) {
414  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
415  if (!CoralUtilities::readBlobAsString(atr["data"].data<coral::Blob>(), data)) {
416  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
417  return StatusCode::FAILURE;
418  }
419  } else {
420  ATH_MSG_VERBOSE("Loading data as a STRING");
421  data = *(static_cast<const std::string *>((atr["data"]).addressOfData()));
422  }
423  // unwrap the json and build the data vector
425  for (auto &it : yy.items()) {
426  nlohmann::json yx = it.value();
427  rtCalibJson.push_back(yx);
428  }
429  }
430  }
431  // read old-style format
432  else {
433  for (CondAttrListCollection::const_iterator itr = readHandleRt->begin();
434  itr != readHandleRt->end(); ++itr) {
435  ATH_CHECK(legacyRtPayloadToJSON(itr->second, rtCalibJson));
436  }
437  }
439  LoadedRtMap loadedRtRel{};
440  // unpack the strings in the collection and update the writeCdoRt
441  for (const auto& payload : rtCalibJson) {
442  const bool rt_ts_applied = payload["appliedRT"];
444  const std::string stName = payload["station"];
445  const Identifier athenaId = idHelper.channelID(stName, payload["eta"], payload["phi"],
446  payload["ml"], payload["layer"], payload["tube"]);
447 
448  std::optional<double> innerTubeRadius = getInnerTubeRadius(idHelper.multilayerID(athenaId, 1));
449  if (!innerTubeRadius) continue;
450 
451 
452  const std::vector<double> radii = payload["radii"];
453  const std::vector<double> times = payload["times"];
454  const std::vector<double> resolutions = payload["resolutions"];
455 
456  if (writeCdo.hasDataForChannel(athenaId, msgStream())) {
457  const MdtFullCalibData* dataObj = writeCdo.getCalibData(athenaId, msgStream());
458  if (dataObj->rtRelation) {
459  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(athenaId)<<" already exists");
460  continue;
461  }
462  }
463 
464  MuonCalib::CalibFunc::ParVec rtPars{}, resoPars{};
465 
466  MuonCalib::SamplePoint tr_point, ts_point; // pairs of numbers; tr = (time,radius); ts = (time,sigma) [sigma=resolution]
467  std::vector<MuonCalib::SamplePoint> tr_points{}, ts_points{};
469  float multilayer_tmax_diff{-std::numeric_limits<float>::max()};
470 
471  // loop over RT function payload (triplets of radius,time,sigma(=resolution) )
472  for (unsigned int k = 0; k < radii.size(); ++k) {
473  float radius = radii[k];
474  if (m_rtShift != 0.) {
475  float oldradius = radius;
476  // TODO: What is this magic number
477  float rshift = m_rtShift * 1.87652e-2 * radius * (radius - *innerTubeRadius);
478  radius = oldradius + rshift;
479  ATH_MSG_DEBUG("DEFORM RT: old radius " << oldradius << " new radius " << radius << " shift " << rshift
480  << " max shift " << m_rtShift);
481  }
482 
483  if (m_rtScale != 1.) {
484  float oldradius = radius;
485  radius = radius * m_rtScale;
486  ATH_MSG_DEBUG("DEFORM RT: old radius " << oldradius << " new radius " << radius << " scale factor " << m_rtScale);
487  }
488  tr_point.set_x2(radius);
489 
490  float time = times[k];
491  tr_point.set_x1(time);
492  ts_point.set_x1(time);
493 
494  float sigma = resolutions[k];
495  ts_point.set_x2(sigma);
496  ts_point.set_error(1.0);
497  tr_point.set_error(1.0);
498  if (tr_point.x2() < -99) { // if radius is < -99 then treat time as ML Tmax difference
499  multilayer_tmax_diff = tr_point.x1();
500  } else if (k == 0 || (tr_points[k - 1].x1() < tr_point.x1() && tr_points[k - 1].x2() < tr_point.x2())) {
501  tr_points.push_back(tr_point);
502  ts_points.push_back(ts_point);
503  }
504  } // end loop over RT function payload (triplets of radius,time,resolution)
505 
507  if (ts_points.size() < 3) {
508  ATH_MSG_FATAL("Rt relation broken!");
509  return StatusCode::FAILURE;
510  }
511 
512  if (rt_ts_applied != m_TimeSlewingCorrection) {
513  float sign(rt_ts_applied ? -1.0 : 1.0);
514  float slice_width = (*innerTubeRadius) / static_cast<float>(m_MeanCorrectionVsR.size());
515  for (auto & tr_point : tr_points) {
516  int slice_number = static_cast<int>(std::floor(tr_point.x2() / slice_width));
517  if (slice_number < 0) slice_number = 0;
518  if (slice_number >= static_cast<int>(m_MeanCorrectionVsR.size()))
519  slice_number = static_cast<int>(m_MeanCorrectionVsR.size()) - 1;
520  tr_point.set_x1(tr_point.x1() + sign * m_MeanCorrectionVsR[slice_number]);
521  }
522  }
523 
524  // Create resolution function from ts_points
525  std::unique_ptr<MuonCalib::IRtResolution> reso = getRtResolutionInterpolation(ts_points);
526  if (msgLvl(MSG::VERBOSE)) {
527  ATH_MSG_VERBOSE("Resolution points :");
528  for (const MuonCalib::SamplePoint& point : tr_points) {
529  ATH_MSG_VERBOSE(point.x1() << "|" << point.x2() << "|" << point.error());
530  }
531  ATH_MSG_DEBUG("Resolution parameters :");
532  for (unsigned int i = 0; i < reso->nPar(); i++) { ATH_MSG_VERBOSE(i << " " << reso->par(i)); }
533  }
534 
535  // Create RT function from tr_points and load RT and resolution functions
536  std::unique_ptr<MuonCalib::IRtRelation> rt = std::make_unique<MuonCalib::RtRelationLookUp>(MuonCalib::RtFromPoints::getRtRelationLookUp(tr_points));
537  if (!reso || !rt) { continue; }
538 
539  if (rt->par(1) == 0.) {
540  ATH_MSG_FATAL("Bin size is 0");
541  for (const MuonCalib::SamplePoint& it: tr_points)
542  ATH_MSG_WARNING(it.x1() << " " << it.x2() << " " << it.error());
543  return StatusCode::FAILURE;
544  }
545  // Save ML difference if it is available
546  if (multilayer_tmax_diff > -8e8) { rt->SetTmaxDiff(multilayer_tmax_diff); }
547  // Store RT and resolution functions for this region
548  RtRelationPtr rt_rel = std::make_unique<MuonCalib::MdtRtRelation>(std::move(rt), std::move(reso), 0.);
549 
550  if (!writeCdo.storeData(athenaId ,rt_rel, msgStream())) return StatusCode::FAILURE;
552  loadedRtRel[athenaId] = rt_rel;
553 
554  } // end loop over itr (strings read from COOL)
555  ATH_CHECK(defaultRt(writeCdo, loadedRtRel));
556 
557  if (loadedRtRel.empty()) {
558  return StatusCode::SUCCESS;
559  }
560 
561  ATH_MSG_DEBUG("Initializing " << loadedRtRel.size()<< " b-field functions");
562  const MdtCondDbData* condDbData{nullptr};
563  if (!m_readKeyDCS.empty()) {
564  SG::ReadCondHandle<MdtCondDbData> readCondHandleDb{m_readKeyDCS, ctx};
566  if (readCondHandleDb->hasDCS()) {
567  condDbData = readCondHandleDb.cptr();
568  } else {
569  ATH_MSG_INFO("Do not retrieve the HV from DCS. Fall back to 2730 & 3080");
570  }
571  }
572 
573 
574  for (const auto& [athenaId, rtRelation] : loadedRtRel) {
575  CorrectionPtr corrFuncSet = std::make_unique<MuonCalib::MdtCorFuncSet>();
576 
578  std::vector<double> corr_params(2);
579  bool loadDefault{false};
580  if (condDbData){
581  const MuonCond::DcsConstants& dcs{condDbData->getHvState(athenaId)};
582  corr_params[0] = dcs.readyVolt;
584  if (corr_params[0] < std::numeric_limits<float>::epsilon()) {
585  ATH_MSG_DEBUG("Chamber "<<m_idHelperSvc->toString(athenaId)<<" is switched off "<<dcs);
586  loadDefault = true;
587  }
588  } else loadDefault = true;
589  if (loadDefault) {
590  if (m_idHelperSvc->issMdt(athenaId)) {
591  corr_params[0] = 2730.0;
592  } else {
593  corr_params[0] = 3080.0;
594  }
595  }
596  corr_params[1] = 0.11; // epsilon parameter
597  corrFuncSet->setBField(std::make_unique<MuonCalib::BFieldCorFunc>("medium", corr_params, rtRelation->rt()));
598  }
601  corrFuncSet->setSlewing(std::make_unique<MuonCalib::MdtSlewCorFuncHardcoded>(MuonCalib::CalibFunc::ParVec()));
602  }
603  if (!writeCdo.storeData(athenaId, corrFuncSet, msgStream())) return StatusCode::FAILURE;
604  }
605 
606  return StatusCode::SUCCESS;
607 }
608 
609 // build the transient structure and load some defaults for T0s
611  const MdtIdHelper& id_helper{m_idHelperSvc->mdtIdHelper()};
612 
613  // Inverse of wire propagation speed
614  const float inversePropSpeed = 1. / (Gaudi::Units::c_light * m_prop_beta);
615 
616  // loop over modules (MDT chambers) and create an MdtTubeContainer for each
617  MdtIdHelper::const_id_iterator it = id_helper.module_begin();
618  MdtIdHelper::const_id_iterator it_end = id_helper.module_end();
619  for (; it != it_end; ++it) {
620 
621  if (writeCdo.hasDataForChannel(*it, msgStream())) {
622  const MdtFullCalibData* dataObj = writeCdo.getCalibData(*it, msgStream());
623  if (dataObj->tubeCalib) {
624  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(*it)<<" already exists");
625  continue;
626  }
627  }
628  // create an MdtTubeContainer
629  TubeContainerPtr tubes = std::make_unique<MuonCalib::MdtTubeCalibContainer>(m_idHelperSvc.get(), *it);
630  if (!writeCdo.storeData(*it, tubes, msgStream())) return StatusCode::FAILURE;
631 
632  // is tubes ever 0? how could that happen?
633  double t0 = m_defaultT0;
634 
635  unsigned int nml = tubes->numMultilayers();
636  unsigned int nlayers = tubes->numLayers();
637  unsigned int ntubes = tubes->numTubes();
638  int size = nml * nlayers * ntubes;
639 
640  ATH_MSG_VERBOSE("Adding chamber " << m_idHelperSvc->toString(*it)
641  <<" size " << size << " ml " << nml << " l " << nlayers << " t " << ntubes);
642  for (unsigned int ml = 1; ml <= nml; ++ml) {
643  for (unsigned int l = 1; l <= nlayers; ++l) {
644  for (unsigned int t = 1; t <= ntubes; ++t) {
646  const Identifier tubeId = id_helper.channelID(*it, ml, l, t);
647  data.t0 = t0;
648  data.adcCal = 1.;
649  data.inversePropSpeed = inversePropSpeed;
650  tubes->setCalib(std::move(data), tubeId, msgStream());
651  }
652  }
653  }
654  }
655  return StatusCode::SUCCESS;
656 }
657 
658 
660  std::string data{};
661  if (attr["data"].specification().type() == typeid(coral::Blob)) {
662  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
663  if (!CoralUtilities::readBlobAsString(attr["data"].data<coral::Blob>(), data)) {
664  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
665  return StatusCode::FAILURE;
666  }
667 
668  } else {
669  data = *(static_cast<const std::string *>((attr["data"]).addressOfData()));
670  }
671  std::vector<std::string> tokens = tokenize(data, "\n");
672  if (tokens.size() < 2) {
673  ATH_MSG_FATAL("The line "<<data<<" cannot be resolved into header & payload");
674  return StatusCode::FAILURE;
675  }
676  std::string& header = tokens[0];
677  const std::string& payload = tokens[1];
678 
683  const std::string stName = header.substr(2,3);
684  int eta{0}, phi{0}, nTubes{0};
685  {
686  std::replace(header.begin(), header.end(),'_', ',');
687  const std::vector<std::string> headerTokens = tokenize(header, ",");
688  phi = atoi(headerTokens[1]);
689  eta = atoi(headerTokens[2]);
690  nTubes = atoi(headerTokens[5]);
691  }
692  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
693  bool isValid{false};
694  const Identifier chamID = idHelper.elementID(stName, eta, phi, isValid);
695  if (!isValid) {
696  static std::atomic<bool> idWarningPrinted = false;
697  if (!idWarningPrinted) {
698  ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Identifier: "<<stName<<","<<eta<<","<<phi
699  <<" is invalid. Skipping");
700  idWarningPrinted.store(true, std::memory_order_relaxed);
701  }
702  return StatusCode::SUCCESS;
703  }
705  const bool t0_ts_applied = (attr["tech"].data<int>() & MuonCalib::TIME_SLEWING_CORRECTION_APPLIED);
706  channel["appliedT0"] = t0_ts_applied;
707  channel["station"] = stName;
708  channel["eta"] = eta;
709  channel["phi"] = phi;
710 
711  const std::vector<double> payLoadData = tokenizeDouble(payload, ",");
712  std::vector<double> tzeros{}, meanAdcs{};
713  std::vector<int> statusCodes{};
716  for (unsigned int k = 0; k < payLoadData.size(); ++k){
717  const double value = payLoadData[k];
718  switch (k%3) {
719  case 0:
720  tzeros.push_back(value);
721  break;
722  case 1:
723  statusCodes.push_back(value);
724  break;
725  case 2:
726  meanAdcs.push_back(value);
727  break;
728  default:
729  break;
730  }
731  }
732  if (statusCodes.size() != tzeros.size() ||
733  statusCodes.size() != meanAdcs.size() ||
734  statusCodes.empty()) {
735  ATH_MSG_FATAL("Failed to properly readt t0 calibrations for chamber "<<m_idHelperSvc->toStringChamber(chamID));
736  return StatusCode::FAILURE;
737  }
739  int ml{1}, layer{1}, tube{1};
740 
741  const int numMl = idHelper.numberOfMultilayers(chamID);
742  const Identifier secondMlID = idHelper.multilayerID(chamID, numMl);
743  const int tubesPerLay = std::max(idHelper.tubeMax(chamID), idHelper.tubeMax(secondMlID));
744  const int numLayers = std::max(idHelper.tubeLayerMax(chamID), idHelper.tubeLayerMax(secondMlID));
745  if (m_checkTubes && (numMl * numLayers * tubesPerLay) != nTubes) {
746  ATH_MSG_FATAL("Calibration database differs in terms of number of tubes for chamber "
747  <<m_idHelperSvc->toStringChamber(chamID)<<". Expected "<<(numMl * numLayers * tubesPerLay)
748  <<" vs. observed "<<nTubes);
749  return StatusCode::FAILURE;
750  }
752  for (unsigned int k = 0; k < tzeros.size(); ++k) {
753  nlohmann::json channelData{};
754  channelData["ml"] = ml;
755  channelData["layer"] =layer;
756  channelData["tube"] = tube;
757  channelData["t0"] = tzeros[k];
758  channelData["meanAdc"] = meanAdcs[k];
759  channelData["status"] = statusCodes[k];
760  ++tube;
761  if (tube > tubesPerLay){
762  tube = 1;
763  ++layer;
764  }
765  if (layer > numLayers){
766  layer = 1;
767  ++ml;
768  }
769  calibData.push_back(std::move(channelData));
770  }
771  channel["calibConstants"] = std::move(calibData);
772  json.push_back(std::move(channel));
773  return StatusCode::SUCCESS;
774 }
775 StatusCode MdtCalibDbAlg::loadTube(const EventContext& ctx, MuonCalib::MdtCalibDataContainer& writeCdo) const {
776  ATH_MSG_DEBUG("loadTube " << name());
777  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
778 
779  // Read Cond Handle
781  // read new-style format 2020
782  nlohmann::json t0CalibJson = nlohmann::json::array();
783  if (m_newFormat2020) {
784  for (CondAttrListCollection::const_iterator itr = readHandleTube->begin();
785  itr != readHandleTube->end(); ++itr) {
786  const coral::AttributeList &atr = itr->second;
787  std::string data{};
788  if (atr["data"].specification().type() == typeid(coral::Blob)) {
789  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
790  if (!CoralUtilities::readBlobAsString(atr["data"].data<coral::Blob>(), data)) {
791  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
792  return StatusCode::FAILURE;
793  }
794  } else {
795  ATH_MSG_VERBOSE("Loading data as a STRING");
796  data = *(static_cast<const std::string *>((atr["data"]).addressOfData()));
797  }
798  // unwrap the json and build the data vector
800  for (auto &it : yy.items()) {
801  nlohmann::json yx = it.value();
802  t0CalibJson.push_back(yx);
803  }
804  }
805  }
806  // read old-style format
807  else {
808  for (CondAttrListCollection::const_iterator itr = readHandleTube->begin();
809  itr != readHandleTube->end(); ++itr) {
810  ATH_CHECK(legacyTubePayloadToJSON(itr->second, t0CalibJson));
811  }
812  }
813 
814  // Inverse of wire propagation speed
815  const float inversePropSpeed = 1. / (Gaudi::Units::c_light * m_prop_beta);
816 
817  // unpack the strings in the collection and update the
818  // MdtTubeCalibContainers in TDS
819  for (const auto& chambChannel : t0CalibJson) {
820  const std::string stName = chambChannel["station"];
821  const int ieta = chambChannel["eta"];
822  const int iphi = chambChannel["phi"];
823  const bool t0_ts_applied = chambChannel["appliedT0"];
824  // need to check validity of Identifier since database contains all Run 2 MDT chambers, e.g. also EI chambers which are
825  // potentially replaced by NSW
826  bool isValid{false}; // the elementID takes a bool pointer to check the validity of the Identifier
827  const Identifier chId = idHelper.elementID(stName, ieta, iphi, isValid);
828  if (!isValid) {
829  static std::atomic<bool> idWarningPrinted = false;
830  if (!idWarningPrinted) {
831  ATH_MSG_WARNING("Element Identifier " << chId.get_compact() << " retrieved for station name " << stName
832  << " is not valid, skipping");
833  idWarningPrinted.store(true, std::memory_order_relaxed);
834  }
835  continue;
836  }
837 
838  if (writeCdo.hasDataForChannel(chId, msgStream())) {
839  const MdtFullCalibData* dataObj = writeCdo.getCalibData(chId, msgStream());
840  if (dataObj->tubeCalib) {
841  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(chId)<<" already exists");
842  continue;
843  }
844  }
845 
846  TubeContainerPtr tubes = std::make_unique<MdtTubeCalibContainer>(m_idHelperSvc.get(), chId);
847  if (!writeCdo.storeData(chId, tubes, msgStream())) {
848  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to add chamber "<<m_idHelperSvc->toString(chId)
849  <<" ID fields: "<<stName<<","<<ieta<<","<<iphi);
850  return StatusCode::FAILURE;
851  }
852  //const ref. No copy
853  const nlohmann::json& tubeConstants = chambChannel["calibConstants"];
854  for (const auto& tubeChannel : tubeConstants) {
855  const int ml = tubeChannel["ml"];
856  const int l = tubeChannel["layer"];
857  const int t = tubeChannel["tube"];
858  double tzero = tubeChannel["t0"];
859  if (m_t0Shift != 0.) {
860  tzero += m_t0Shift;
861  ATH_MSG_VERBOSE("T0 shift " << m_t0Shift << " t0 " << tzero << " id " << ml << " " << l << " " << t);
862  }
863  if (m_t0Spread != 0.) {
864  CLHEP::HepRandomEngine *engine = m_RNGWrapper->getEngine(ctx);
865  double sh = CLHEP::RandGaussZiggurat::shoot(engine, 0., m_t0Spread);
866  tzero += sh;
867  ATH_MSG_VERBOSE("T0 spread " << sh << " t0 " << tzero << " id " << ml << " " << l << " " << t);
868  }
869  if (!t0_ts_applied && m_TimeSlewingCorrection) { tzero += m_TsCorrectionT0; }
870  if (t0_ts_applied && !m_TimeSlewingCorrection) { tzero -= m_TsCorrectionT0; }
871 
872  const int statusCode = tubeChannel["status"];
873  const double meanAdc = tubeChannel["meanAdc"];
875  datatube.statusCode = statusCode;
876  datatube.inversePropSpeed = inversePropSpeed;
877  datatube.t0 = tzero;
878  datatube.adcCal = meanAdc;
879  const Identifier tubeId = idHelper.channelID(chId, ml, l, t);
880  tubes->setCalib(std::move(datatube), tubeId, msgStream());
881  }
882  } // end loop over readCdoTube
883 
884  ATH_CHECK(defaultT0s(writeCdo));
885  // finally record writeCdo
886  return StatusCode::SUCCESS;
887 }
888 
889 std::unique_ptr<MuonCalib::RtResolutionLookUp> MdtCalibDbAlg::getRtResolutionInterpolation(const std::vector<MuonCalib::SamplePoint> &sample_points) {
891  // VARIABLES //
893  std::vector<Double_t> x(sample_points.size(),0);
894  std::vector<Double_t> y(sample_points.size(),0);
895 
896  for (unsigned int i = 0; i < sample_points.size(); i++) {
897  x[i] = sample_points[i].x1();
898  y[i] = sample_points[i].x2();
899  }
900  TSpline3 sp("Rt Res Tmp", x.data(), y.data(), sample_points.size());
902  // CREATE AN RtRelationLookUp OBJECT WITH THE CORRECT PARAMETERS //
904  unsigned int nb_points(100);
905  std::vector<double> res_param(nb_points + 2); // r-t parameters
906  Double_t bin_width = (x[sample_points.size() - 1] - x[0]) / static_cast<Double_t>(nb_points);
907 
908  res_param[0] = x[0];
909  res_param[1] = bin_width;
910  for (unsigned int k = 0; k < nb_points; k++) {
911  Double_t xx = x[0] + k * bin_width;
912  res_param[k + 2] = sp.Eval(xx);
913  if (std::isnan(res_param[k + 2])) {
914  TFile outf("kacke.root", "RECREATE");
915  sp.Write("kacke");
916  THROW_EXCEPTION("MdtCalibDbAlg::getRtResolutionInterpolation "
917  "encountered nan element");
918  }
919  }
920  return std::make_unique<MuonCalib::RtResolutionLookUp>(std::move(res_param));
921 }
922 
924  ATH_MSG_VERBOSE("initializeSagCorrection...");
925  std::vector<double> corr_params(0);
926  funcSet.wireSag(std::make_unique<MuonCalib::WireSagCorFunc>(corr_params));
927 }
MdtCalibDbAlg::m_create_b_field_function
Gaudi::Property< bool > m_create_b_field_function
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:80
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
MuonCalib::MdtCalibrationFactory::createRtResolution
static IRtResolution * createRtResolution(const std::string &name, const ParVec &pars)
Definition: MdtCalibrationFactory.cxx:81
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::t0
float t0
< relative t0 in chamber (ns)
Definition: MdtTubeCalibContainer.h:20
PathResolver::find_calib_file
static std::string find_calib_file(const std::string &logical_file_name)
Definition: PathResolver.cxx:384
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
MdtReadoutElement.h
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
GeoModel::TransientConstSharedPtr< MdtCorFuncSet >
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
CxxUtils::tokenizeDouble
std::vector< double > tokenizeDouble(const std::string &the_str, std::string_view delimiter)
Definition: Control/CxxUtils/Root/StringUtils.cxx:34
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
header
Definition: hcg.cxx:526
max
#define max(a, b)
Definition: cfImp.cxx:41
MdtCalibDbAlg::m_rtScale
Gaudi::Property< double > m_rtScale
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:110
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
MdtCalibDbAlg::m_useNewGeo
Gaudi::Property< bool > m_useNewGeo
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:69
CondAttrListCollection.h
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
PlotCalibFromCool.yy
yy
Definition: PlotCalibFromCool.py:714
MuonCalib::MdtCorFuncSet::wireSag
const IMdtWireSagCorFunc * wireSag() const
Definition: MdtCorFuncSet.h:34
MdtCalibDbAlg::m_rtShift
Gaudi::Property< double > m_rtShift
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:109
MuonGM::MdtReadoutElement::innerTubeRadius
double innerTubeRadius() const
Returns the inner tube radius excluding the aluminium walls.
json
nlohmann::json json
Definition: HistogramDef.cxx:9
MuonCalib::MdtCalibDataContainer::RegionGranularity
RegionGranularity
Definition: MdtCalibDataContainer.h:26
MuonCalib::MdtCorFuncSet::setBField
void setBField(std::unique_ptr< IMdtBFieldCorFunc > &&bField)
Definition: MdtCorFuncSet.cxx:24
dumpTgcDigiDeadChambers.stationName
dictionary stationName
Definition: dumpTgcDigiDeadChambers.py:30
MdtCalibDbAlg::m_defaultT0
Gaudi::Property< double > m_defaultT0
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:105
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
CxxUtils::tokenizeInt
std::vector< int > tokenizeInt(const std::string &the_str, std::string_view delimiter)
Definition: Control/CxxUtils/Root/StringUtils.cxx:55
MuonCalib::MdtCalibDataContainer::storeData
bool storeData(const Identifier &mlID, CorrectionPtr corrFuncSet, MsgStream &msg)
Definition: MdtCalibDataContainer.cxx:49
MuonCalib::MdtFullCalibData::CorrectionPtr
GeoModel::TransientConstSharedPtr< MdtCorFuncSet > CorrectionPtr
Definition: MdtFullCalibData.h:16
TRTCalib_Extractor.rts
dictionary rts
Definition: TRTCalib_Extractor.py: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
CheckAppliedSFs.bin_width
bin_width
Definition: CheckAppliedSFs.py:242
MdtCalibDbAlg::m_createSlewingFunction
Gaudi::Property< bool > m_createSlewingFunction
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:85
MdtCalibDbAlg.h
parse
std::map< std::string, std::string > parse(const std::string &list)
Definition: egammaLayerRecalibTool.cxx:1054
MuonCalib::RtDataFromFile
Manages the I/O of the Rt realtions from/to file.
Definition: RtDataFromFile.h:21
ALFA_EventTPCnv_Dict::t0
std::vector< ALFA_RawData_p1 > t0
Definition: ALFA_EventTPCnvDict.h:42
MdtCalibDbAlg::m_detMgr
const MuonGM::MuonDetectorManager * m_detMgr
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:66
MuonCalib::MdtFullCalibData::rtRelation
RtRelationPtr rtRelation
Definition: MdtFullCalibData.h:21
skel.it
it
Definition: skel.GENtoEVGEN.py:423
StringUtils.h
ToString.h
MdtCalibDbAlg::m_randomStream
StringProperty m_randomStream
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:114
MdtCalibDbAlg::loadTube
StatusCode loadTube(const EventContext &ctx, MuonCalib::MdtCalibDataContainer &writeCdo) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:775
MuonCalib::MdtTubeCalibContainer::numMultilayers
unsigned int numMultilayers() const
Definition: MdtTubeCalibContainer.h:49
yodamerge_tmp.npoints
npoints
Definition: yodamerge_tmp.py:250
AthCommonMsg< Gaudi::Algorithm >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
python.subdetectors.tile.Blob
Blob
Definition: tile.py:17
MdtCondDbData
Definition: MdtCondDbData.h:21
athena.value
value
Definition: athena.py:124
MdtCalibDbAlg::m_AthRNGSvc
ServiceHandle< IAthRNGSvc > m_AthRNGSvc
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:113
IdToFixedIdTool.h
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
MdtCalibDbAlg::getRtResolutionInterpolation
static std::unique_ptr< MuonCalib::RtResolutionLookUp > getRtResolutionInterpolation(const std::vector< MuonCalib::SamplePoint > &sample_points)
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:889
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
isValid
bool isValid(const T &p)
Definition: AtlasPID.h:221
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
MdtCalibDbAlg::legacyTubePayloadToJSON
StatusCode legacyTubePayloadToJSON(const coral::AttributeList &attr, nlohmann::json &json) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:659
beamspotman.tokens
tokens
Definition: beamspotman.py:1284
dumpTruth.statusCode
statusCode
Definition: dumpTruth.py:89
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
IIOVDbSvc.h
Abstract interface to IOVDbSvc to access IOVRange and tag information.
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
MdtCalibDbAlg::m_TsCorrectionT0
Gaudi::Property< double > m_TsCorrectionT0
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:103
BFieldCorFunc.h
MuonCalib::MdtTubeCalibContainer::setCalib
bool setCalib(SingleTubeCalib &&val, const Identifier &tubeId, MsgStream &msg)
set the calibration constants of a single tube
Definition: MdtTubeCalibContainer.cxx:19
x
#define x
AthenaAttributeList.h
MdtCalibDbAlg::loadRt
StatusCode loadRt(const EventContext &ctx, MuonCalib::MdtCalibDataContainer &writeCdo) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:395
MuonCalib::MdtFullCalibData
class which holds the full set of calibration constants for a given tube
Definition: MdtFullCalibData.h:15
MuonCalib::SamplePoint::set_error
void set_error(const double merror)
set the error of the x2 coordinate sample point to merror
MdtCalibDbAlg::m_TimeSlewingCorrection
Gaudi::Property< bool > m_TimeSlewingCorrection
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:98
MdtCalibDbAlg::getInnerTubeRadius
std::optional< double > getInnerTubeRadius(const Identifier &id) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:283
WireSagCorFunc.h
AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
MuonCalib::RtData_t_r_reso::times
const DataVec & times() const
Definition: RtData_t_r_reso.h:28
MuonCalib::CalibFunc::par
double par(unsigned int index) const
Definition: CalibFunc.h:41
MdtCalibDbAlg::initializeSagCorrection
void initializeSagCorrection(MuonCalib::MdtCorFuncSet &funcSet) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:923
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:83
MdtCalibDbAlg::m_writeKey
SG::WriteCondHandleKey< MuonCalib::MdtCalibDataContainer > m_writeKey
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:124
MuonCalib::MdtTubeCalibContainer::numLayers
unsigned int numLayers() const
Definition: MdtTubeCalibContainer.h:50
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::statusCode
unsigned int statusCode
Definition: MdtTubeCalibContainer.h:26
MdtSlewCorFuncHardcoded.h
MuonCalib::SamplePoint::set_x2
void set_x2(const double mx2)
set the x2 coordinate of the sample point to mx2
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
MdtCalibDbAlg::m_prop_beta
Gaudi::Property< double > m_prop_beta
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:111
MuonCalib::RtFromPoints::getRtRelationLookUp
static RtRelationLookUp getRtRelationLookUp(const std::vector< SamplePoint > &sample_points)
Definition: RtFromPoints.cxx:78
MuonCalib::MdtFullCalibData::tubeCalib
TubeContainerPtr tubeCalib
Definition: MdtFullCalibData.h:22
MuonCalib::SamplePoint::x1
double x1() const
get the x1 coordinate of the sample point
FortranAlgorithmOptions.fileName
fileName
Definition: FortranAlgorithmOptions.py:13
MuonCalib::MdtCalibDataContainer::granularity
RegionGranularity granularity() const
Definition: MdtCalibDataContainer.cxx:13
MdtCalibDbAlg::m_RTfileName
StringProperty m_RTfileName
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:117
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MdtCalibDbAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:63
MuonGM::MuonDetectorManager::getMdtReadoutElement
const MdtReadoutElement * getMdtReadoutElement(const Identifier &id) const
access via extended identifier (requires unpacking)
Definition: MuonDetDescr/MuonReadoutGeometry/src/MuonDetectorManager.cxx:204
FullCPAlgorithmsTest_eljob.sh
sh
Definition: FullCPAlgorithmsTest_eljob.py:101
MuonCalib::MdtCorFuncSet
Class which holds all correction functions for a given region.
Definition: MdtCorFuncSet.h:18
MuonGM::MdtReadoutElement
Definition: MuonDetDescr/MuonReadoutGeometry/MuonReadoutGeometry/MdtReadoutElement.h:51
CaloCondBlobAlgs_fillNoiseFromASCII.inputFile
string inputFile
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:17
lumiFormat.i
int i
Definition: lumiFormat.py:85
MdtCalibDbAlg::m_UseMLRt
Gaudi::Property< bool > m_UseMLRt
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:99
CoralUtilities::readBlobAsString
bool readBlobAsString(const coral::Blob &, std::string &)
Definition: blobaccess.cxx:85
beamspotman.n
n
Definition: beamspotman.py:731
MdtCalibDbAlg::initialize
virtual StatusCode initialize() override
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:55
RtFromPoints.h
RCU::Shell
Definition: ShellExec.cxx:28
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
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
CxxUtils
Definition: aligned_vector.h:29
MuonCond::DcsConstants
Helper struct to cache all dcs constants in a common place of the memory.
Definition: MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondData/MuonCondData/Defs.h:31
MdtIdHelper
Definition: MdtIdHelper.h:61
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:127
MuonCalib::RtData_t_r_reso::radii
const DataVec & radii() const
Definition: RtData_t_r_reso.h:29
MuonCalib
CscCalcPed - algorithm that finds the Cathode Strip Chamber pedestals from an RDO.
Definition: CscCalcPed.cxx:22
MdtCalibDbAlg::m_readKeyDCS
SG::ReadCondHandleKey< MdtCondDbData > m_readKeyDCS
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:127
MuonCalib::CalibFunc::ParVec
std::vector< double > ParVec
Definition: CalibFunc.h:35
MdtCalibDbAlg::legacyRtPayloadToJSON
StatusCode legacyRtPayloadToJSON(const coral::AttributeList &attr, nlohmann::json &json) const
Parses the legacy payload for the RT functions to a json format.
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:302
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonCalib::MdtTubeCalibContainer::numTubes
unsigned int numTubes() const
Definition: MdtTubeCalibContainer.h:51
IRtResolution.h
MdtCalibDbAlg::m_newFormat2020
Gaudi::Property< bool > m_newFormat2020
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:76
MdtCalibDbAlg::m_createWireSagFunction
Gaudi::Property< bool > m_createWireSagFunction
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:83
MdtCalibDbAlg::m_t0Spread
Gaudi::Property< double > m_t0Spread
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:107
MuonGMR4::MdtReadoutElement::innerTubeRadius
double innerTubeRadius() const
Returns the inner tube radius.
MuonCalib::IRtRelation::SetTmaxDiff
void SetTmaxDiff(const float &d)
set the difference in total drift time betwene the two multilayers (ML1 - ML2)
Definition: IRtRelation.h:33
MuonCalib::MdtCalibrationFactory::createRtRelation
static IRtRelation * createRtRelation(const std::string &name, const ParVec &pars)
Definition: MdtCalibrationFactory.cxx:71
lumiFormat.array
array
Definition: lumiFormat.py:91
MdtCalibDbAlg::m_r4detMgr
const MuonGMR4::MuonDetectorManager * m_r4detMgr
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:67
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::adcCal
float adcCal
quality flag for the SingleTubeCalib constants: 0 all ok, 1 no hits found, 2 too few hits,...
Definition: MdtTubeCalibContainer.h:24
MuonCalib::TIME_SLEWING_CORRECTION_APPLIED
@ TIME_SLEWING_CORRECTION_APPLIED
Definition: MdtCalibCreationFlags.h:10
IOVInfiniteRange.h
MdtCalibDbAlg::m_readKeyRt
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyRt
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:122
PathResolver.h
MuonCalib::SamplePoint::x2
double x2() const
get the x2 coordinate of the sample point
MuonGMR4::MdtReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:25
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:220
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
RtResolutionFromPoints.h
MuonCalib::SamplePoint
Definition: SamplePoint.h:17
MuonCalib::MuonFixedId
Definition: MuonFixedId.h:50
MdtCalibDbAlg::declareDependency
StatusCode declareDependency(const EventContext &ctx, SG::WriteCondHandle< MuonCalib::MdtCalibDataContainer > &writeHandle) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:99
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib::inversePropSpeed
float inversePropSpeed
multiplicative correction factor for ADC measurement w.r.t.
Definition: MdtTubeCalibContainer.h:22
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
HI::TowerBins::numLayers
constexpr unsigned int numLayers()
Definition: HIEventDefs.h:23
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
MuonCalib::MdtCalibDataContainer::getCalibData
const MdtFullCalibData * getCalibData(const Identifier &measId, MsgStream &msg) const
Returns the calibration data associated with this station
Definition: MdtCalibDataContainer.cxx:38
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
PixelModuleFeMask_create_db.payload
string payload
Definition: PixelModuleFeMask_create_db.py:69
ATHRNG::RNGWrapper::getEngine
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
Definition: RNGWrapper.h:134
RNGWrapper.h
MuonCalib::RtData_t_r_reso::resolution
const DataVec & resolution() const
Definition: RtData_t_r_reso.h:30
MuonCalib::SamplePoint::set_x1
void set_x1(const double mx1)
set the x1 coordinate of the sample point to mx1
SG::ReadCondHandleKey< CondAttrListCollection >
MdtCalibDbAlg::m_readKeyTube
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyTube
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:123
MdtCalibDbAlg::MdtCalibDbAlg
MdtCalibDbAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:52
y
#define y
CaloSwCorrections.time
def time(flags, cells_name, *args, **kw)
Definition: CaloSwCorrections.py:242
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
MdtCalibDbAlg::m_MeanCorrectionVsR
Gaudi::Property< std::vector< float > > m_MeanCorrectionVsR
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:101
MdtReadoutElement.h
MdtCalibDbAlg::m_checkTubes
Gaudi::Property< bool > m_checkTubes
only needed to retrieve information on number of tubes etc. (no alignment needed)
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:74
MdtCalibDbAlg::defaultT0s
StatusCode defaultT0s(MuonCalib::MdtCalibDataContainer &writeCdoTube) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:610
MuonCalib::MdtCalibDataContainer
Definition: MdtCalibDataContainer.h:20
IRtRelation.h
TransientAddress.h
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
MdtFullCalibData.h
MdtCalibDbAlg::m_RNGWrapper
ATHRNG::RNGWrapper * m_RNGWrapper
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:115
MuonCalib::MdtFullCalibData::TubeContainerPtr
GeoModel::TransientConstSharedPtr< MdtTubeCalibContainer > TubeContainerPtr
Definition: MdtFullCalibData.h:18
MdtCalibDbAlg::m_t0Shift
Gaudi::Property< double > m_t0Shift
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:106
MdtCalibDbAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:123
MuonCalib::CalibFunc::nPar
unsigned int nPar() const
Definition: CalibFunc.h:39
MuonIdHelper::const_id_iterator
std::vector< Identifier >::const_iterator const_id_iterator
Definition: MuonIdHelper.h:143
MdtCalibCreationFlags.h
MdtCalibDbAlg::defaultRt
StatusCode defaultRt(MuonCalib::MdtCalibDataContainer &writeCdoRt, LoadedRtMap &loadedRts) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:150
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
MuonCalib::MdtCalibDataContainer::hasDataForChannel
bool hasDataForChannel(const Identifier &measId, MsgStream &msg) const
Checks whether a calibration data object is already present.
Definition: MdtCalibDataContainer.cxx:33
MuonCalib::MdtCorFuncSet::setSlewing
void setSlewing(std::unique_ptr< IMdtSlewCorFunc > &&slew)
Definition: MdtCorFuncSet.cxx:21
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib
Definition: MdtTubeCalibContainer.h:18
SamplePoint.h
MdtCalibrationFactory.h
IOVInfiniteRange::infiniteTime
static EventIDRange infiniteTime()
Produces an EventIDRange that is inifinite in Time and invalid in RunLumi.
Definition: IOVInfiniteRange.h:47
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
MdtCalibDbAlg::m_idToFixedIdTool
ToolHandle< MuonCalib::IIdToFixedIdTool > m_idToFixedIdTool
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:64
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
MuonCalib::RtData_t_r_reso::DataVec
std::vector< double > DataVec
Definition: RtData_t_r_reso.h:18
MuonFixedId.h
calibdata.tube
tube
Definition: calibdata.py:31
MdtCalibDbAlg::LoadedRtMap
std::map< Identifier, RtRelationPtr > LoadedRtMap
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:50
plot_times.times
def times(fn)
Definition: plot_times.py:11
CalibFunc.h
fitman.k
k
Definition: fitman.py:528
SG::WriteCondHandle::addDependency
void addDependency(const EventIDRange &range)
Definition: WriteCondHandle.h:275
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
RtDataFromFile.h
Identifier
Definition: IdentifierFieldParser.cxx:14