ATLAS Offline Software
MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 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"
33 
34 #include "CxxUtils/StringUtils.h"
35 
36 
37 #include <fstream>
38 
39 #include "TFile.h"
40 #include "TSpline.h"
41 #include "GeoModelKernel/throwExcept.h"
42 
43 using namespace MuonCalib;
44 using namespace CxxUtils;
48 
49 MdtCalibDbAlg::MdtCalibDbAlg(const std::string &name, ISvcLocator *pSvcLocator) :
50  AthReentrantAlgorithm(name, pSvcLocator) {}
51 
53  ATH_MSG_DEBUG("initialize " << name());
54 
55  // if timeslew correction vector m_MeanCorrectionVsR has non-zero size then set
56  // m_TsCorrectionT0=m_MeanCorrectionVsR[0] and subtract this each value in the vector.
57  if (m_MeanCorrectionVsR.size()) {
59  for (float & it : m_MeanCorrectionVsR) {
61  }
62  }
63 
64  ATH_CHECK(m_idHelperSvc.retrieve());
65  ATH_CHECK(m_idToFixedIdTool.retrieve());
66  // initiallize random number generator if doing t0 smearing (for robustness studies)
67  if (m_t0Spread != 0.) {
68  ATH_CHECK(m_AthRNGSvc.retrieve());
69  ATH_MSG_DEBUG(" initialize Random Number Service: running with t0 shift "
70  << m_t0Shift << " spread " << m_t0Spread << " rt shift " << m_rtShift);
71  // getting our random numbers stream
72  m_RNGWrapper = m_AthRNGSvc->getEngine(this, m_randomStream);
73  if (!m_RNGWrapper) {
74  ATH_MSG_ERROR("Could not get random number engine from AthRNGSvc. Abort.");
75  return StatusCode::FAILURE;
76  }
77  }
78 
79  if (m_rtShift != 0. || m_rtScale != 1. || m_t0Shift != 0. || m_t0Spread != 0.) {
80  ATH_MSG_INFO("************************************" << std::endl
81  << " Running with Calibration Deformations! " << std::endl
82  << " For performance studies only!" << std::endl
83  << " **************************************");
84  ATH_MSG_DEBUG(" rt scale " << m_rtScale << " t0 shift " << m_t0Shift << " spread " << m_t0Spread << " rt shift " << m_rtShift);
85  }
86 
91 
94  return StatusCode::SUCCESS;
95 }
96  StatusCode MdtCalibDbAlg::declareDependency(const EventContext& ctx,
98 
99  writeHandle.addDependency(EventIDRange(IOVInfiniteRange::infiniteTime()));
101  if (key.empty()) continue;
103  if (!readHandle.isValid()) {
104  ATH_MSG_FATAL("Failed to retrieve conditions object "<<readHandle.fullKey());
105  return StatusCode::FAILURE;
106  }
107  writeHandle.addDependency(readHandle);
108  ATH_MSG_INFO("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdoRt->size()= " << readHandle->size());
109  ATH_MSG_INFO("Range of input is " << readHandle.getRange());
110  }
111  if (m_readKeyDCS.empty()) return StatusCode::SUCCESS;
113  if (!readHandle.isValid()) {
114  ATH_MSG_FATAL("Failed to retrieve conditions object "<<m_readKeyDCS.fullKey());
115  return StatusCode::FAILURE;
116  }
117  writeHandle.addDependency(readHandle);
118  return StatusCode::SUCCESS;
119 }
120 StatusCode MdtCalibDbAlg::execute(const EventContext& ctx) const {
121  ATH_MSG_DEBUG("execute " << name());
123  if (writeHandle.isValid()) {
124  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
125  << ". In theory this should not be called, but may happen"
126  << " if multiple concurrent events are being processed out of order.");
127  return StatusCode::SUCCESS;
128  }
129  ATH_CHECK(declareDependency(ctx, writeHandle));
130 
131  RegionGranularity gran{RegionGranularity::OnePerChamber};
132  if (m_readKeyRt.key() == "/MDT/RTUNIQUE") {
133  ATH_MSG_DEBUG("Save one set of Rt constants per chamber");
134  gran = RegionGranularity::OneRt;
135  } else if (m_UseMLRt) {
136  ATH_MSG_DEBUG("Save one set of calibration constants per multi layer");
137  gran = RegionGranularity::OnePerMultiLayer;
138  } else ATH_MSG_DEBUG("Save one set of calibration constants per chamber");
139  std::unique_ptr<MuonCalib::MdtCalibDataContainer> writeCdo = std::make_unique<MuonCalib::MdtCalibDataContainer>(m_idHelperSvc.get(), gran);
140 
141  ATH_CHECK(loadRt(ctx, *writeCdo));
142  ATH_CHECK(loadTube(ctx, *writeCdo));
143  ATH_CHECK(writeHandle.record(std::move(writeCdo)));
144  return StatusCode::SUCCESS;
145 }
146 
148  ATH_MSG_DEBUG("defaultRt " << name());
150  std::ifstream inputFile(fileName);
151  if (!inputFile) {
152  ATH_MSG_ERROR("Unable to open RT Ascii file: " << fileName);
153  return StatusCode::FAILURE;
154  }
155  ATH_MSG_DEBUG("Opened RT Ascii file: " << fileName);
156 
157 
158  // Read the RTs from the text file
160  rts.read(inputFile);
161  ATH_MSG_VERBOSE("File contains " << rts.nRts() << " RT relations ");
162 
163  // Loop over all RTs in the file (but the default file only has 1 RT)
164  // Use the first valid RT found in the file as the default for all chambers.
165  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
166  for (unsigned int n = 0; n < rts.nRts(); ++n) {
167  std::unique_ptr<MuonCalib::RtDataFromFile::RtRelation> rt(rts.getRt(n));
168 
172 
173  // check if rt contains data, at least two points on the rt are required
174  if (times.size() < 2) {
175  ATH_MSG_ERROR(" defaultRt rt table has too few entries");
176  return StatusCode::FAILURE;
177  }
178  // check if all tables have same size
179  if (times.size() != radii.size() || times.size() != reso.size()) {
180  ATH_MSG_ERROR("defaultRt rt table size mismatch ");
181  return StatusCode::FAILURE;
182  }
183  // check for negative time bins, i.e. decreasing time value with radius
184  double t_min = times[0];
185  double bin_size = times[1] - t_min;
186  if (bin_size <= 0) {
187  ATH_MSG_ERROR("defaultRt rt table negative binsize ");
188  return StatusCode::FAILURE;
189  }
190 
191  // create a vector to hold the r values,
192  // we need two extra fields to store t_min and bin_size
194  rtPars.push_back(t_min);
195  rtPars.push_back(bin_size);
196 
197  // copy r values into vector
198  rtPars.insert(rtPars.end(), radii.begin(), radii.end());
199 
200  ATH_MSG_DEBUG("defaultRt new MuonCalib::IRtRelation");
201 
202  MuonCalib::CalibFunc::ParVec resoPars{t_min, bin_size};
203  // copy r values into vector
204  resoPars.insert(resoPars.end(), reso.begin(), reso.end());
205 
206  ATH_MSG_DEBUG("defaultRt new MuonCalib::IRtResolution");
207 
208  // create RT and resolution "I" objects
209  std::shared_ptr<MuonCalib::IRtRelation> rtRel{std::make_unique<RtRelationLookUp>(rtPars)};
210  std::shared_ptr<MuonCalib::IRtResolution> resoRel{std::make_unique<RtResolutionLookUp>(resoPars)};
211 
212 
213  // Since the same RT is loaded for all chambers you might be tempted to create it once
214  // and simply store the same pointer in writeCdoRt for all regions.
215  // However it seems that when StoreGate clears writeCdoRt (which will happen in LoadRt
216  // by detStore()->removeDataAndProxy) it will crash unless there are unique pointers/objects
217  // for rtRel, resoRel, and MdtRtRelation
218 
219  // Loop over RT regions and store the default RT in each
220  RtRelationPtr MdtRt = std::make_unique<MuonCalib::MdtRtRelation>(rtRel, resoRel, 0.);
221 
222  for(auto itr = idHelper.detectorElement_begin();
223  itr!= idHelper.detectorElement_end();++itr){
224  const Identifier detElId{*itr};
225  if (writeCdo.hasDataForChannel(detElId, msgStream())) {
226  const MdtFullCalibData* dataObj = writeCdo.getCalibData(detElId, msgStream());
227  if (dataObj->rtRelation) {
228  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(detElId)<<" already exists");
229  continue;
230  }
231  }
233  RtRelationPtr storeMe = MdtRt;
234  if (idHelper.multilayer(detElId) == 2) {
235  if (writeCdo.granularity() != RegionGranularity::OnePerMultiLayer) continue;
236  const Identifier firstML = idHelper.multilayerID(detElId, 1);
237  if (writeCdo.hasDataForChannel(firstML, msgStream())) {
238  const MdtFullCalibData* dataObj = writeCdo.getCalibData(firstML, msgStream());
239  if (dataObj->rtRelation) {
240  ATH_MSG_DEBUG("Copy Rt constanst from the first multi layer for "<<m_idHelperSvc->toString(detElId));
241  storeMe = dataObj->rtRelation;
242  }
243  }
244  }
245  ATH_MSG_DEBUG("Add default rt constants for "<<m_idHelperSvc->toString(detElId));
246  if (!writeCdo.storeData(detElId, storeMe, msgStream())) {
247  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to save default rts for "<<m_idHelperSvc->toString(detElId));
248  return StatusCode::FAILURE;
249  }
250 
252  loadedRts[detElId] = MdtRt;
253 
254  }
255 
256  // if VERBOSE enabled print out RT function
257  if (msgLvl(MSG::VERBOSE)) {
258  int npoints = rtRel->nPar() - 2;
259  ATH_MSG_VERBOSE("defaultRt npoints from rtRel=" << npoints);
260  for (int ipt = 0; ipt < npoints; ++ipt) {
261  double t = t_min + ipt * bin_size;
262  ATH_MSG_VERBOSE(" " << ipt << " " << t << " " << rtRel->radius(t) << " " << resoRel->resolution(t));
263  }
264  }
265  break; // only need the first good RT from the text file
266 
267  } // end loop over RTs in file
268 
269  return StatusCode::SUCCESS;
270 }
271 std::optional<double> MdtCalibDbAlg::getInnerTubeRadius(const Identifier& id) const {
272  static std::atomic<bool> rtWarningPrinted = false;
273 
274  if (m_detMgr) {
276  if (detEl) { return std::make_optional<double>(detEl->innerTubeRadius()); }
277 
278  } else if (m_r4detMgr) {
279  const MuonGMR4::MdtReadoutElement* detEl = m_r4detMgr->getMdtReadoutElement(id);
280  if (detEl) { return std::make_optional<double>(detEl->innerTubeRadius()); }
281  }
282  if (!rtWarningPrinted) {
283  ATH_MSG_WARNING("getInnerTubeRadius() - no Muon station known under the name "
284  << m_idHelperSvc->toString(id));
285  rtWarningPrinted = true;
286  }
287  return std::nullopt;
288 }
289 
291  std::string data{}, delim{};
292  if (attr["data"].specification().type() == typeid(coral::Blob)) {
293  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
294  if (!CoralUtilities::readBlobAsString(attr["data"].data<coral::Blob>(), data)) {
295  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
296  return StatusCode::FAILURE;
297  }
298  delim = "\n";
299  } else {
300  data = *(static_cast<const std::string *>((attr["data"]).addressOfData()));
301  delim = " ";
302  }
303  const std::vector<std::string> tokens = tokenize(data, delim);
304  if (tokens.size() < 2) {
305  ATH_MSG_FATAL("The line "<<data<<" cannot be resolved into header & payload");
306  return StatusCode::FAILURE;
307  }
308  const std::string& header = tokens[0];
309  const std::string& payload = tokens[1];
310  ATH_MSG_DEBUG("Header: '"<<header<<"' payload: '"<<payload<<"'");
312  unsigned int numPoints{0};
314  const bool rt_ts_applied = (attr["tech"].data<int>() & MuonCalib::TIME_SLEWING_CORRECTION_APPLIED);
315  channel["appliedRT"] = rt_ts_applied;
316  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
317  {
318 
319  std::vector<int> tokensHeader = tokenizeInt(header, ",");
320  if(tokensHeader.size()< 2){
321  ATH_MSG_FATAL("Failed to deduce extract number of points & calib Identifier from "<<header);
322  return StatusCode::FAILURE;
323  }
324  unsigned int calibId = tokensHeader[0];
325  numPoints = tokensHeader[1];
326  MuonCalib::MuonFixedId id(calibId);
327  if (!id.is_mdt()) {
328  ATH_MSG_FATAL("Found non-MDT MuonFixedId, continuing...");
329  return StatusCode::FAILURE;
330  }
331  const Identifier athenaId = m_idToFixedIdTool->fixedIdToId(id);
332  if (!m_idHelperSvc->isMuon(athenaId)) {
333  ATH_MSG_WARNING("The translation from the calibration ID with station: "
334  <<id.stationNameString()<<"("<<id.stationName()<<") "
335  <<" eta:"<<id.eta()<<" phi: "<<id.phi());
336  }
337  channel["station"] = m_idHelperSvc->stationNameString(athenaId);
338  channel["eta"] = m_idHelperSvc->stationEta(athenaId);
339  channel["phi"] = m_idHelperSvc->stationPhi(athenaId);
340  channel["ml"] = idHelper.multilayer(athenaId);
341  channel["layer"] = idHelper.tubeLayer(athenaId);
342  channel["tube"] = idHelper.tube(athenaId);
343  }
345  const std::vector<double> dataPoints = tokenizeDouble(payload, ",");
346  std::vector<double> radii{}, times{}, resos{};
347  radii.reserve(numPoints);
348  times.reserve(numPoints);
349  resos.reserve(numPoints);
353  for (unsigned int k = 0 ; k < dataPoints.size(); ++k) {
354  const double value = dataPoints[k];
355  switch (k%3) {
356  case 0:
357  radii.push_back(value);
358  break;
359  case 1:
360  times.push_back(value);
361  break;
362  case 2:
363  resos.push_back(value);
364  break;
365  default:
366  break;
367  }
368  }
370  if (radii.size() != numPoints ||
371  times.size() != numPoints ||
372  resos.size() != numPoints) {
373  ATH_MSG_FATAL("Payload "<<payload<<" does not lead to the expected number of points "<<numPoints<<" vs. "<<dataPoints.size());
374  return StatusCode::FAILURE;
375  }
376  channel["radii"] = std::move(radii);
377  channel["times"] = std::move(times);
378  channel["resolutions"] = std::move(resos);
379  json.push_back(channel);
380  return StatusCode::SUCCESS;
381 }
382 
383 StatusCode MdtCalibDbAlg::loadRt(const EventContext& ctx, MuonCalib::MdtCalibDataContainer& writeCdo) const {
384  ATH_MSG_DEBUG("loadRt " << name());
385 
386  // Read Cond Handle
388  if (!readHandleRt.isValid()) {
389  ATH_MSG_ERROR("readCdoRt==nullptr");
390  return StatusCode::FAILURE;
391  }
392  // read new-style format 2020
393 
394  nlohmann::json rtCalibJson = nlohmann::json::array();
395  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
396  if (m_newFormat2020) {
397  for (CondAttrListCollection::const_iterator itr = readHandleRt->begin();
398  itr != readHandleRt->end(); ++itr) {
399  const coral::AttributeList &atr = itr->second;
400  std::string data{};
401  if (atr["data"].specification().type() == typeid(coral::Blob)) {
402  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
403  if (!CoralUtilities::readBlobAsString(atr["data"].data<coral::Blob>(), data)) {
404  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
405  return StatusCode::FAILURE;
406  }
407  } else {
408  ATH_MSG_VERBOSE("Loading data as a STRING");
409  data = *(static_cast<const std::string *>((atr["data"]).addressOfData()));
410  }
411  // unwrap the json and build the data vector
413  for (auto &it : yy.items()) {
414  nlohmann::json yx = it.value();
415  rtCalibJson.push_back(yx);
416  }
417  }
418  }
419  // read old-style format
420  else {
421  for (CondAttrListCollection::const_iterator itr = readHandleRt->begin();
422  itr != readHandleRt->end(); ++itr) {
423  ATH_CHECK(legacyRtPayloadToJSON(itr->second, rtCalibJson));
424  }
425  }
427  LoadedRtMap loadedRtRel{};
428  // unpack the strings in the collection and update the writeCdoRt
429  for (const auto& payload : rtCalibJson) {
430  const bool rt_ts_applied = payload["appliedRT"];
432  const std::string stName = payload["station"];
433  const Identifier athenaId = idHelper.channelID(stName, payload["eta"], payload["phi"],
434  payload["ml"], payload["layer"], payload["tube"]);
435 
436  std::optional<double> innerTubeRadius = getInnerTubeRadius(idHelper.multilayerID(athenaId, 1));
437  if (!innerTubeRadius) continue;
438 
439 
440  const std::vector<double> radii = payload["radii"];
441  const std::vector<double> times = payload["times"];
442  const std::vector<double> resolutions = payload["resolutions"];
443 
444  if (writeCdo.hasDataForChannel(athenaId, msgStream())) {
445  const MdtFullCalibData* dataObj = writeCdo.getCalibData(athenaId, msgStream());
446  if (dataObj->rtRelation) {
447  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(athenaId)<<" already exists");
448  continue;
449  }
450  }
451 
452  MuonCalib::CalibFunc::ParVec rtPars{}, resoPars{};
453 
454  MuonCalib::SamplePoint tr_point, ts_point; // pairs of numbers; tr = (time,radius); ts = (time,sigma) [sigma=resolution]
455  std::vector<MuonCalib::SamplePoint> tr_points{}, ts_points{};
457  float multilayer_tmax_diff{-std::numeric_limits<float>::max()};
458 
459  // loop over RT function payload (triplets of radius,time,sigma(=resolution) )
460  for (unsigned int k = 0; k < radii.size(); ++k) {
461  float radius = radii[k];
462  if (m_rtShift != 0.) {
463  float oldradius = radius;
464  // TODO: What is this magic number
465  float rshift = m_rtShift * 1.87652e-2 * radius * (radius - *innerTubeRadius);
466  radius = oldradius + rshift;
467  ATH_MSG_DEBUG("DEFORM RT: old radius " << oldradius << " new radius " << radius << " shift " << rshift
468  << " max shift " << m_rtShift);
469  }
470 
471  if (m_rtScale != 1.) {
472  float oldradius = radius;
473  radius = radius * m_rtScale;
474  ATH_MSG_DEBUG("DEFORM RT: old radius " << oldradius << " new radius " << radius << " scale factor " << m_rtScale);
475  }
476  tr_point.set_x2(radius);
477 
478  float time = times[k];
479  tr_point.set_x1(time);
480  ts_point.set_x1(time);
481 
482  float sigma = resolutions[k];
483  ts_point.set_x2(sigma);
484  ts_point.set_error(1.0);
485  tr_point.set_error(1.0);
486  if (tr_point.x2() < -99) { // if radius is < -99 then treat time as ML Tmax difference
487  multilayer_tmax_diff = tr_point.x1();
488  } else if (k == 0 || (tr_points[k - 1].x1() < tr_point.x1() && tr_points[k - 1].x2() < tr_point.x2())) {
489  tr_points.push_back(tr_point);
490  ts_points.push_back(ts_point);
491  }
492  } // end loop over RT function payload (triplets of radius,time,resolution)
493 
495  if (ts_points.size() < 3) {
496  ATH_MSG_FATAL("Rt relation broken!");
497  return StatusCode::FAILURE;
498  }
499 
500  if (rt_ts_applied != m_TimeSlewingCorrection) {
501  float sign(rt_ts_applied ? -1.0 : 1.0);
502  float slice_width = (*innerTubeRadius) / static_cast<float>(m_MeanCorrectionVsR.size());
503  for (auto & tr_point : tr_points) {
504  int slice_number = static_cast<int>(std::floor(tr_point.x2() / slice_width));
505  if (slice_number < 0) slice_number = 0;
506  if (slice_number >= static_cast<int>(m_MeanCorrectionVsR.size()))
507  slice_number = static_cast<int>(m_MeanCorrectionVsR.size()) - 1;
508  tr_point.set_x1(tr_point.x1() + sign * m_MeanCorrectionVsR[slice_number]);
509  }
510  }
511 
512  // Create resolution function from ts_points
513  std::unique_ptr<MuonCalib::IRtResolution> reso = getRtResolutionInterpolation(ts_points);
514  if (msgLvl(MSG::VERBOSE)) {
515  ATH_MSG_VERBOSE("Resolution points :");
516  for (const MuonCalib::SamplePoint& point : tr_points) {
517  ATH_MSG_VERBOSE(point.x1() << "|" << point.x2() << "|" << point.error());
518  }
519  ATH_MSG_DEBUG("Resolution parameters :");
520  for (unsigned int i = 0; i < reso->nPar(); i++) { ATH_MSG_VERBOSE(i << " " << reso->par(i)); }
521  }
522 
523  // Create RT function from tr_points and load RT and resolution functions
524  std::unique_ptr<MuonCalib::IRtRelation> rt = std::make_unique<MuonCalib::RtRelationLookUp>(MuonCalib::RtFromPoints::getRtRelationLookUp(tr_points));
525  if (!reso || !rt) { continue; }
526 
527  if (rt->par(1) == 0.) {
528  ATH_MSG_FATAL("Bin size is 0");
529  for (const MuonCalib::SamplePoint& it: tr_points)
530  ATH_MSG_WARNING(it.x1() << " " << it.x2() << " " << it.error());
531  return StatusCode::FAILURE;
532  }
533  // Save ML difference if it is available
534  if (multilayer_tmax_diff > -8e8) { rt->SetTmaxDiff(multilayer_tmax_diff); }
535  // Store RT and resolution functions for this region
536  RtRelationPtr rt_rel = std::make_unique<MuonCalib::MdtRtRelation>(std::move(rt), std::move(reso), 0.);
537 
538  if (!writeCdo.storeData(athenaId ,rt_rel, msgStream())) return StatusCode::FAILURE;
540  loadedRtRel[athenaId] = rt_rel;
541 
542  } // end loop over itr (strings read from COOL)
543  ATH_CHECK(defaultRt(writeCdo, loadedRtRel));
544 
545  if (loadedRtRel.empty()) {
546  return StatusCode::SUCCESS;
547  }
548 
549  ATH_MSG_DEBUG("Initializing " << loadedRtRel.size()<< " b-field functions");
550  const MdtCondDbData* condDbData{nullptr};
551  if (!m_readKeyDCS.empty()) {
552  SG::ReadCondHandle<MdtCondDbData> readCondHandleDb{m_readKeyDCS, ctx};
554  if (readCondHandleDb->hasDCS()) {
555  condDbData = readCondHandleDb.cptr();
556  } else {
557  ATH_MSG_INFO("Do not retrieve the HV from DCS. Fall back to 2730 & 3080");
558  }
559  }
560 
561 
562  for (const auto& [athenaId, rtRelation] : loadedRtRel) {
563  CorrectionPtr corrFuncSet = std::make_unique<MuonCalib::MdtCorFuncSet>();
564 
566  std::vector<double> corr_params(2);
567  bool loadDefault{false};
568  if (condDbData){
569  const MuonCond::DcsConstants& dcs{condDbData->getHvState(athenaId)};
570  corr_params[0] = dcs.readyVolt;
572  if (corr_params[0] < std::numeric_limits<float>::epsilon()) {
573  ATH_MSG_DEBUG("Chamber "<<m_idHelperSvc->toString(athenaId)<<" is switched off "<<dcs);
574  loadDefault = true;
575  }
576  } else loadDefault = true;
577  if (loadDefault) {
578  if (m_idHelperSvc->issMdt(athenaId)) {
579  corr_params[0] = 2730.0;
580  } else {
581  corr_params[0] = 3080.0;
582  }
583  }
584  corr_params[1] = 0.11; // epsilon parameter
585  corrFuncSet->setBField(std::make_unique<MuonCalib::BFieldCorFunc>("medium", corr_params, rtRelation->rt()));
586  }
588  corrFuncSet->setSlewing(std::make_unique<MuonCalib::MdtSlewCorFuncHardcoded>(MuonCalib::CalibFunc::ParVec()));
589  }
590  if (!writeCdo.storeData(athenaId, corrFuncSet, msgStream())) return StatusCode::FAILURE;
591  }
592 
593  return StatusCode::SUCCESS;
594 }
595 
596 // build the transient structure and load some defaults for T0s
598  const MdtIdHelper& id_helper{m_idHelperSvc->mdtIdHelper()};
599 
600  // Inverse of wire propagation speed
601  const float inversePropSpeed = 1. / (Gaudi::Units::c_light * m_prop_beta);
602 
603  // loop over modules (MDT chambers) and create an MdtTubeContainer for each
604  MdtIdHelper::const_id_iterator it = id_helper.module_begin();
605  MdtIdHelper::const_id_iterator it_end = id_helper.module_end();
606  for (; it != it_end; ++it) {
607 
608  if (writeCdo.hasDataForChannel(*it, msgStream())) {
609  const MdtFullCalibData* dataObj = writeCdo.getCalibData(*it, msgStream());
610  if (dataObj->tubeCalib) {
611  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(*it)<<" already exists");
612  continue;
613  }
614  }
615  // create an MdtTubeContainer
616  TubeContainerPtr tubes = std::make_unique<MuonCalib::MdtTubeCalibContainer>(m_idHelperSvc.get(), *it);
617  if (!writeCdo.storeData(*it, tubes, msgStream())) return StatusCode::FAILURE;
618 
619  // is tubes ever 0? how could that happen?
620  double t0 = m_defaultT0;
621 
622  unsigned int nml = tubes->numMultilayers();
623  unsigned int nlayers = tubes->numLayers();
624  unsigned int ntubes = tubes->numTubes();
625  int size = nml * nlayers * ntubes;
626 
627  ATH_MSG_VERBOSE("Adding chamber " << m_idHelperSvc->toString(*it)
628  <<" size " << size << " ml " << nml << " l " << nlayers << " t " << ntubes);
629  for (unsigned int ml = 1; ml <= nml; ++ml) {
630  for (unsigned int l = 1; l <= nlayers; ++l) {
631  for (unsigned int t = 1; t <= ntubes; ++t) {
633  const Identifier tubeId = id_helper.channelID(*it, ml, l, t);
634  data.t0 = t0;
635  data.adcCal = 1.;
636  data.inversePropSpeed = inversePropSpeed;
637  tubes->setCalib(std::move(data), tubeId, msgStream());
638  }
639  }
640  }
641  }
642  return StatusCode::SUCCESS;
643 }
644 
645 
647  std::string data{};
648  if (attr["data"].specification().type() == typeid(coral::Blob)) {
649  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
650  if (!CoralUtilities::readBlobAsString(attr["data"].data<coral::Blob>(), data)) {
651  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
652  return StatusCode::FAILURE;
653  }
654 
655  } else {
656  data = *(static_cast<const std::string *>((attr["data"]).addressOfData()));
657  }
658  std::vector<std::string> tokens = tokenize(data, "\n");
659  if (tokens.size() < 2) {
660  ATH_MSG_FATAL("The line "<<data<<" cannot be resolved into header & payload");
661  return StatusCode::FAILURE;
662  }
663  std::string& header = tokens[0];
664  const std::string& payload = tokens[1];
665 
670  const std::string stName = header.substr(2,3);
671  int eta{0}, phi{0}, nTubes{0};
672  {
673  std::replace(header.begin(), header.end(),'_', ',');
674  const std::vector<std::string> headerTokens = tokenize(header, ",");
675  phi = atoi(headerTokens[1]);
676  eta = atoi(headerTokens[2]);
677  nTubes = atoi(headerTokens[5]);
678  }
679  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
680  bool isValid{false};
681  const Identifier chamID = idHelper.elementID(stName, eta, phi, isValid);
682  if (!isValid) {
683  static std::atomic<bool> idWarningPrinted = false;
684  if (!idWarningPrinted) {
685  ATH_MSG_WARNING(__FILE__<<":"<<__LINE__<<" Identifier: "<<stName<<","<<eta<<","<<phi
686  <<" is invalid. Skipping");
687  idWarningPrinted.store(true, std::memory_order_relaxed);
688  }
689  return StatusCode::SUCCESS;
690  }
692  const bool t0_ts_applied = (attr["tech"].data<int>() & MuonCalib::TIME_SLEWING_CORRECTION_APPLIED);
693  channel["appliedT0"] = t0_ts_applied;
694  channel["station"] = stName;
695  channel["eta"] = eta;
696  channel["phi"] = phi;
697 
698  const std::vector<double> payLoadData = tokenizeDouble(payload, ",");
699  std::vector<double> tzeros{}, meanAdcs{};
700  std::vector<int> statusCodes{};
703  for (unsigned int k = 0; k < payLoadData.size(); ++k){
704  const double value = payLoadData[k];
705  switch (k%3) {
706  case 0:
707  tzeros.push_back(value);
708  break;
709  case 1:
710  statusCodes.push_back(value);
711  break;
712  case 2:
713  meanAdcs.push_back(value);
714  break;
715  default:
716  break;
717  }
718  }
719  if (statusCodes.size() != tzeros.size() ||
720  statusCodes.size() != meanAdcs.size() ||
721  statusCodes.empty()) {
722  ATH_MSG_FATAL("Failed to properly readt t0 calibrations for chamber "<<m_idHelperSvc->toStringChamber(chamID));
723  return StatusCode::FAILURE;
724  }
726  int ml{1}, layer{1}, tube{1};
727 
728  const int numMl = idHelper.numberOfMultilayers(chamID);
729  const Identifier secondMlID = idHelper.multilayerID(chamID, numMl);
730  const int tubesPerLay = std::max(idHelper.tubeMax(chamID), idHelper.tubeMax(secondMlID));
731  const int numLayers = std::max(idHelper.tubeLayerMax(chamID), idHelper.tubeLayerMax(secondMlID));
732  if (m_checkTubes && (numMl * numLayers * tubesPerLay) != nTubes) {
733  ATH_MSG_FATAL("Calibration database differs in terms of number of tubes for chamber "
734  <<m_idHelperSvc->toStringChamber(chamID)<<". Expected "<<(numMl * numLayers * tubesPerLay)
735  <<" vs. observed "<<nTubes);
736  return StatusCode::FAILURE;
737  }
739  for (unsigned int k = 0; k < tzeros.size(); ++k) {
740  nlohmann::json channelData{};
741  channelData["ml"] = ml;
742  channelData["layer"] =layer;
743  channelData["tube"] = tube;
744  channelData["t0"] = tzeros[k];
745  channelData["meanAdc"] = meanAdcs[k];
746  channelData["status"] = statusCodes[k];
747  ++tube;
748  if (tube > tubesPerLay){
749  tube = 1;
750  ++layer;
751  }
752  if (layer > numLayers){
753  layer = 1;
754  ++ml;
755  }
756  calibData.push_back(std::move(channelData));
757  }
758  channel["calibConstants"] = std::move(calibData);
759  json.push_back(std::move(channel));
760  return StatusCode::SUCCESS;
761 }
762 StatusCode MdtCalibDbAlg::loadTube(const EventContext& ctx, MuonCalib::MdtCalibDataContainer& writeCdo) const {
763  ATH_MSG_DEBUG("loadTube " << name());
764  const MdtIdHelper& idHelper{m_idHelperSvc->mdtIdHelper()};
765 
766  // Read Cond Handle
768  // read new-style format 2020
769  nlohmann::json t0CalibJson = nlohmann::json::array();
770  if (m_newFormat2020) {
771  for (CondAttrListCollection::const_iterator itr = readHandleTube->begin();
772  itr != readHandleTube->end(); ++itr) {
773  const coral::AttributeList &atr = itr->second;
774  std::string data{};
775  if (atr["data"].specification().type() == typeid(coral::Blob)) {
776  ATH_MSG_VERBOSE("Loading data as a BLOB, uncompressing...");
777  if (!CoralUtilities::readBlobAsString(atr["data"].data<coral::Blob>(), data)) {
778  ATH_MSG_FATAL("Cannot uncompress BLOB! Aborting...");
779  return StatusCode::FAILURE;
780  }
781  } else {
782  ATH_MSG_VERBOSE("Loading data as a STRING");
783  data = *(static_cast<const std::string *>((atr["data"]).addressOfData()));
784  }
785  // unwrap the json and build the data vector
787  for (auto &it : yy.items()) {
788  nlohmann::json yx = it.value();
789  t0CalibJson.push_back(yx);
790  }
791  }
792  }
793  // read old-style format
794  else {
795  for (CondAttrListCollection::const_iterator itr = readHandleTube->begin();
796  itr != readHandleTube->end(); ++itr) {
797  ATH_CHECK(legacyTubePayloadToJSON(itr->second, t0CalibJson));
798  }
799  }
800 
801  // Inverse of wire propagation speed
802  const float inversePropSpeed = 1. / (Gaudi::Units::c_light * m_prop_beta);
803 
804  // unpack the strings in the collection and update the
805  // MdtTubeCalibContainers in TDS
806  for (const auto& chambChannel : t0CalibJson) {
807  const std::string stName = chambChannel["station"];
808  const int ieta = chambChannel["eta"];
809  const int iphi = chambChannel["phi"];
810  const bool t0_ts_applied = chambChannel["appliedT0"];
811  // need to check validity of Identifier since database contains all Run 2 MDT chambers, e.g. also EI chambers which are
812  // potentially replaced by NSW
813  bool isValid{false}; // the elementID takes a bool pointer to check the validity of the Identifier
814  const Identifier chId = idHelper.elementID(stName, ieta, iphi, isValid);
815  if (!isValid) {
816  static std::atomic<bool> idWarningPrinted = false;
817  if (!idWarningPrinted) {
818  ATH_MSG_WARNING("Element Identifier " << chId.get_compact() << " retrieved for station name " << stName
819  << " is not valid, skipping");
820  idWarningPrinted.store(true, std::memory_order_relaxed);
821  }
822  continue;
823  }
824 
825  if (writeCdo.hasDataForChannel(chId, msgStream())) {
826  const MdtFullCalibData* dataObj = writeCdo.getCalibData(chId, msgStream());
827  if (dataObj->tubeCalib) {
828  ATH_MSG_DEBUG("Rt relation constants for "<<m_idHelperSvc->toString(chId)<<" already exists");
829  continue;
830  }
831  }
832 
833  TubeContainerPtr tubes = std::make_unique<MdtTubeCalibContainer>(m_idHelperSvc.get(), chId);
834  if (!writeCdo.storeData(chId, tubes, msgStream())) {
835  ATH_MSG_FATAL(__FILE__<<":"<<__LINE__<<" Failed to add chamber "<<m_idHelperSvc->toString(chId)
836  <<" ID fields: "<<stName<<","<<ieta<<","<<iphi);
837  return StatusCode::FAILURE;
838  }
839  //const ref. No copy
840  const nlohmann::json& tubeConstants = chambChannel["calibConstants"];
841  for (const auto& tubeChannel : tubeConstants) {
842  const int ml = tubeChannel["ml"];
843  const int l = tubeChannel["layer"];
844  const int t = tubeChannel["tube"];
845  double tzero = tubeChannel["t0"];
846  if (m_t0Shift != 0.) {
847  tzero += m_t0Shift;
848  ATH_MSG_VERBOSE("T0 shift " << m_t0Shift << " t0 " << tzero << " id " << ml << " " << l << " " << t);
849  }
850  if (m_t0Spread != 0.) {
851  CLHEP::HepRandomEngine *engine = m_RNGWrapper->getEngine(ctx);
852  double sh = CLHEP::RandGaussZiggurat::shoot(engine, 0., m_t0Spread);
853  tzero += sh;
854  ATH_MSG_VERBOSE("T0 spread " << sh << " t0 " << tzero << " id " << ml << " " << l << " " << t);
855  }
856  if (!t0_ts_applied && m_TimeSlewingCorrection) { tzero += m_TsCorrectionT0; }
857  if (t0_ts_applied && !m_TimeSlewingCorrection) { tzero -= m_TsCorrectionT0; }
858 
859  const int statusCode = tubeChannel["status"];
860  const double meanAdc = tubeChannel["meanAdc"];
862  datatube.statusCode = statusCode;
863  datatube.inversePropSpeed = inversePropSpeed;
864  datatube.t0 = tzero;
865  datatube.adcCal = meanAdc;
866  const Identifier tubeId = idHelper.channelID(chId, ml, l, t);
867  tubes->setCalib(std::move(datatube), tubeId, msgStream());
868  }
869  } // end loop over readCdoTube
870 
871  ATH_CHECK(defaultT0s(writeCdo));
872  // finally record writeCdo
873  return StatusCode::SUCCESS;
874 }
875 
876 std::unique_ptr<MuonCalib::RtResolutionLookUp> MdtCalibDbAlg::getRtResolutionInterpolation(const std::vector<MuonCalib::SamplePoint> &sample_points) {
878  // VARIABLES //
880  std::vector<Double_t> x(sample_points.size(),0);
881  std::vector<Double_t> y(sample_points.size(),0);
882 
883  for (unsigned int i = 0; i < sample_points.size(); i++) {
884  x[i] = sample_points[i].x1();
885  y[i] = sample_points[i].x2();
886  }
887  TSpline3 sp("Rt Res Tmp", x.data(), y.data(), sample_points.size());
889  // CREATE AN RtRelationLookUp OBJECT WITH THE CORRECT PARAMETERS //
891  unsigned int nb_points(100);
892  std::vector<double> res_param(nb_points + 2); // r-t parameters
893  Double_t bin_width = (x[sample_points.size() - 1] - x[0]) / static_cast<Double_t>(nb_points);
894 
895  res_param[0] = x[0];
896  res_param[1] = bin_width;
897  for (unsigned int k = 0; k < nb_points; k++) {
898  Double_t xx = x[0] + k * bin_width;
899  res_param[k + 2] = sp.Eval(xx);
900  if (std::isnan(res_param[k + 2])) {
901  TFile outf("kacke.root", "RECREATE");
902  sp.Write("kacke");
903  THROW_EXCEPTION("MdtCalibDbAlg::getRtResolutionInterpolation "
904  "encountered nan element");
905  }
906  }
907  return std::make_unique<MuonCalib::RtResolutionLookUp>(std::move(res_param));
908 }
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::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
MdtCalibDbAlg::m_rtScale
Gaudi::Property< double > m_rtScale
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:107
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
MdtCalibDbAlg::m_rtShift
Gaudi::Property< double > m_rtShift
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:106
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:22
dumpTgcDigiDeadChambers.stationName
dictionary stationName
Definition: dumpTgcDigiDeadChambers.py:30
MdtCalibDbAlg::m_defaultT0
Gaudi::Property< double > m_defaultT0
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:102
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
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
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:83
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:396
StringUtils.h
MdtCalibDbAlg::m_randomStream
StringProperty m_randomStream
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:111
MdtCalibDbAlg::loadTube
StatusCode loadTube(const EventContext &ctx, MuonCalib::MdtCalibDataContainer &writeCdo) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:762
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:110
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:876
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
MuonCalib::IRtRelation::SetTmaxDiff
void SetTmaxDiff(const double d)
set the difference in total drift time betwene the two multilayers (ML1 - ML2)
Definition: IRtRelation.h:39
isValid
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition: AtlasPID.h:620
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:646
beamspotman.tokens
tokens
Definition: beamspotman.py:1284
dumpTruth.statusCode
statusCode
Definition: dumpTruth.py:85
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:100
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:383
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)
Definition: SamplePoint.h:63
MdtCalibDbAlg::m_TimeSlewingCorrection
Gaudi::Property< bool > m_TimeSlewingCorrection
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:95
MdtCalibDbAlg::getInnerTubeRadius
std::optional< double > getInnerTubeRadius(const Identifier &id) const
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:271
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
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:121
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 error of the x2 coordinate sample point to merror
Definition: SamplePoint.h:61
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:108
MuonCalib::RtFromPoints::getRtRelationLookUp
static RtRelationLookUp getRtRelationLookUp(const std::vector< SamplePoint > &sample_points)
Definition: RtFromPoints.cxx:76
MuonCalib::MdtFullCalibData::tubeCalib
TubeContainerPtr tubeCalib
Definition: MdtFullCalibData.h:22
MuonCalib::SamplePoint::x1
double x1() const
< get the x1 coordinate of the sample point
Definition: SamplePoint.h:43
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:114
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:111
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:96
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:52
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:107
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:124
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:290
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_t0Spread
Gaudi::Property< double > m_t0Spread
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:104
MuonGMR4::MdtReadoutElement::innerTubeRadius
double innerTubeRadius() const
Returns the inner tube radius.
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:119
PathResolver.h
MuonCalib::SamplePoint::x2
double x2() const
get the error on the x2 coordinate of the sample point
Definition: SamplePoint.h:45
MuonGMR4::MdtReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MdtReadoutElement.h:22
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:227
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
RtResolutionFromPoints.h
MuonCalib::SamplePoint
Definition: SamplePoint.h:16
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:96
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 x2 coordinate of the sample point to mx2
Definition: SamplePoint.h:59
SG::ReadCondHandleKey< CondAttrListCollection >
MdtCalibDbAlg::m_readKeyTube
SG::ReadCondHandleKey< CondAttrListCollection > m_readKeyTube
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/MuonCondAlg/MdtCalibDbAlg.h:120
MdtCalibDbAlg::MdtCalibDbAlg
MdtCalibDbAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:49
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:98
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:597
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:112
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:103
MdtCalibDbAlg::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: MuonConditions/MuonCondGeneral/MuonCondAlg/src/MdtCalibDbAlg.cxx:120
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:147
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:19
MuonCalib::MdtTubeCalibContainer::SingleTubeCalib
Definition: MdtTubeCalibContainer.h:18
SamplePoint.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