ATLAS Offline Software
TgcReadoutGeomTool.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 
7 #include <GaudiKernel/SystemOfUnits.h>
10 
11 #include <GeoModelKernel/GeoFullPhysVol.h>
12 #include <GeoModelKernel/GeoPhysVol.h>
13 #include <GeoModelKernel/GeoTrd.h>
14 #include <GeoModelKernel/GeoBox.h>
15 
16 #include <GeoModelRead/ReadGeoModel.h>
20 #include "CxxUtils/starts_with.h"
21 
23 
25 
26 using namespace CxxUtils;
27 using namespace ActsTrk;
28 
29 namespace MuonGMR4 {
30 
33 
34 
35 TgcReadoutGeomTool::TgcReadoutGeomTool(const std::string& type,
36  const std::string& name,
37  const IInterface* parent)
38  : AthAlgTool{type, name, parent} {
39  declareInterface<IMuonReadoutGeomTool>(this);
40 
41 }
43  FactoryCache& factoryCache) {
44  ATH_MSG_VERBOSE("Load dimensions of "<<m_idHelperSvc->toString(define.detElId)
45  <<std::endl<<std::endl<<m_geoUtilTool->dumpVolume(define.physVol));
46  const GeoShape* shape = m_geoUtilTool->extractShape(define.physVol);
47  if (!shape) {
48  ATH_MSG_FATAL("Failed to deduce a valid shape for "<<m_idHelperSvc->toString(define.detElId));
49  return StatusCode::FAILURE;
50  }
51 
52  if (shape->typeID() != GeoTrd::getClassTypeID()) {
53  ATH_MSG_FATAL("The shape of "<<m_idHelperSvc->toStringDetEl(define.detElId)
54  <<" is expected to be a trapezoid "<<m_geoUtilTool->dumpShape(shape));
55  return StatusCode::FAILURE;
56  }
57  const GeoTrd* chambTrd = static_cast<const GeoTrd*>(shape);
58  define.halfWidthShort = std::min(chambTrd->getYHalfLength1(), chambTrd->getYHalfLength2());
59  define.halfWidthLong = std::max(chambTrd->getYHalfLength1(), chambTrd->getYHalfLength2());
60  define.halfHeight = chambTrd->getZHalfLength();
61  define.halfThickness = chambTrd->getXHalfLength1();
63  std::vector<physVolWithTrans> allGasGaps = m_geoUtilTool->findAllLeafNodesByName(define.physVol, "TgcGas");
64  if (allGasGaps.empty()) {
65  ATH_MSG_FATAL("The volume "<<m_idHelperSvc->toStringDetEl(define.detElId)<<" does not have any childern TgcGas"
66  <<std::endl<<m_geoUtilTool->dumpVolume(define.physVol));
67  return StatusCode::FAILURE;
68  }
69  unsigned int gasGap{0};
70  for (const physVolWithTrans& pVolTrans : allGasGaps) {
71  std::stringstream key{};
72  key<<define.chambDesign<<"_"<<(gasGap+1)
73  <<(m_idHelperSvc->stationEta(define.detElId) > 0 ? "A" : "C");
74 
75  StripLayerPtr& stripLayout{factoryCache.stripDesigns[key.str()]};
76  StripLayerPtr& wireLayout{factoryCache.wireDesigns[key.str()]};
77 
78  if (!stripLayout || !wireLayout) {
79  const wTgcTable& table{factoryCache.parameterBook[key.str()]};
80  if (!table.gasGap) {
81  ATH_MSG_FATAL("No wTGC table could be found for "
82  <<m_idHelperSvc->toStringDetEl(define.detElId)
83  <<" "<<define.chambDesign<<", gasGap "<<(gasGap+1));
84  return StatusCode::FAILURE;
85  }
86  const GeoShape* gapShape = m_geoUtilTool->extractShape(pVolTrans.volume);
87  if (gapShape->typeID() != GeoTrd::getClassTypeID()) {
88  ATH_MSG_FATAL("Expected shape "<<m_geoUtilTool->dumpShape(gapShape)
89  <<" to be a trapezoid");
90  return StatusCode::FAILURE;
91  }
92  const GeoTrd* gapTrd = static_cast<const GeoTrd*>(gapShape);
93 
94  const double halfMinX = std::min(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
95  const double halfMaxX = std::max(gapTrd->getYHalfLength1(), gapTrd->getYHalfLength2());
96  const double halfY = gapTrd->getZHalfLength();
97 
98  if (!wireLayout && table.wireGangs.size()) {
99  WireDesignPtr wireGrp = std::make_unique<WireGroupDesign>();
100  wireGrp->defineTrapezoid(halfMinX, halfMaxX, halfY);
101  for (unsigned int gang : table.wireGangs) {
102  wireGrp->declareGroup(gang);
103  }
104  const double wireOffSet = -0.5*table.wirePitch * wireGrp->nAllWires();
105  wireGrp->defineStripLayout(Amg::Vector2D{wireOffSet, 0.},
106  table.wirePitch, 0., table.wireGangs.size());
107 
108  const Amg::Transform3D trans{pVolTrans.transform
112  const IdentifierHash hash{gasGap << 1};
113  wireLayout = std::make_unique<StripLayer>(trans, (*factoryCache.wireLayouts.insert(std::move(wireGrp)).first), hash);
114  }
115  if (!stripLayout && table.bottomStripPos.size()) {
116  RadialStripDesignPtr radDesign = std::make_unique<RadialStripDesign>();
117  radDesign->defineTrapezoid(halfMinX, halfMaxX, halfY);
118  radDesign->defineStripLayout(Amg::Vector2D{-halfY,0.},
119  0.,0.,table.bottomStripPos.size());
120  radDesign->flipTrapezoid();
121  for (size_t s = 0; s < table.bottomStripPos.size(); ++s) {
122  radDesign->addStrip(table.bottomStripPos.at(s),
123  table.topStripPos.at(s));
124  }
126  const IdentifierHash hash{gasGap<< 1 | 1};
127  const Amg::Transform3D trans{pVolTrans.transform
130  stripLayout = std::make_unique<StripLayer>(trans, (*factoryCache.stripLayouts.insert(std::move(radDesign)).first), hash);
131  }
132  }
133  ++gasGap;
134  if (stripLayout) {
135  unsigned int stripIdx = static_cast<unsigned>(stripLayout->hash());
136  if (stripIdx >= define.sensorLayouts.size()) {
137  ATH_MSG_FATAL("The strip index "<<stripIdx<<" is out of range for gasGap "<<gasGap);
138  return StatusCode::FAILURE;
139  }
140  define.sensorLayouts[stripIdx] = stripLayout;
141  }
142  if (wireLayout) {
143  unsigned int wireIdx = static_cast<unsigned>(wireLayout->hash());
144  if (wireIdx >= define.sensorLayouts.size()) {
145  ATH_MSG_FATAL("The wire index "<<wireIdx<<" is out of range for gasGap "<<gasGap);
146  return StatusCode::FAILURE;
147  }
148  define.sensorLayouts[wireIdx] = wireLayout;
149  }
150  }
151  define.nGasGaps = gasGap;
152  return StatusCode::SUCCESS;
153 }
155  ATH_CHECK(m_geoDbTagSvc.retrieve());
156  ATH_CHECK(m_idHelperSvc.retrieve());
157  ATH_CHECK(m_geoUtilTool.retrieve());
158  GeoModelIO::ReadGeoModel* sqliteReader = m_geoDbTagSvc->getSqliteReader();
159  if (!sqliteReader) {
160  ATH_MSG_FATAL("Error, the tool works exclusively from sqlite geometry inputs");
161  return StatusCode::FAILURE;
162  }
163 
164  FactoryCache facCache{};
165  ATH_CHECK(readParameterBook(facCache));
166 
167 #ifndef SIMULATIONBASE
168  SurfaceBoundSetPtr<Acts::TrapezoidBounds> layerBounds = std::make_shared<SurfaceBoundSet<Acts::TrapezoidBounds>>();
169 #endif
170  const TgcIdHelper& idHelper{m_idHelperSvc->tgcIdHelper()};
171  // Get the list of full phys volumes from SQLite, and create detector elements
173  physNodeMap mapFPV = sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>("Muon");
174  for (auto& [key, pv] : mapFPV) {
178  std::vector<std::string> key_tokens = tokenize(key, "_");
179  if (key_tokens.size() < 4 ||
180  !CxxUtils::starts_with (key_tokens[0], "TGC"))
181  continue;
182 
183  bool isValid{false};
184  const Identifier elementID = idHelper.elementID(key_tokens[1].substr(0,3), atoi(key_tokens[2]), atoi(key_tokens[3]), isValid);
186  if (!isValid){
187  ATH_MSG_FATAL("Failed to construct the station Identifier from "<<key);
188  return StatusCode::FAILURE;
189  }
190  defineArgs define{};
191  define.physVol = pv;
192  define.detElId = elementID;
193  define.chambDesign = key_tokens[0];
194  define.alignTransform = m_geoUtilTool->findAlignableTransform(define.physVol);
195 #ifndef SIMULATIONBASE
196  define.layerBounds = layerBounds;
197 #endif
198  ATH_MSG_DEBUG("Key "<<key<<" lead to Identifier "<<m_idHelperSvc->toStringDetEl(define.detElId));
199  ATH_CHECK(loadDimensions(define, facCache));
200  std::unique_ptr<TgcReadoutElement> readoutEle = std::make_unique<TgcReadoutElement>(std::move(define));
201  ATH_CHECK(mgr.addTgcReadoutElement(std::move(readoutEle)));
202  }
204  return StatusCode::SUCCESS;
205 }
208  std::vector<const TgcReadoutElement*> tgcReadOutEles = mgr.getAllTgcReadoutElements();
209  std::unique_ptr<std::vector<int>> tgcSectorMapping = std::make_unique<std::vector<int>>();
210  tgcSectorMapping->resize(m_idHelperSvc->tgcIdHelper().module_hash_max());
211  Muon::MuonSectorMapping sectorMapping{};
212  const ActsGeometryContext gctx{};
213  for (const TgcReadoutElement* readoutEle : tgcReadOutEles) {
214  int& sectNumb = (*tgcSectorMapping)[m_idHelperSvc->moduleHash(readoutEle->identify())];
215  sectNumb = sectorMapping.getSector(readoutEle->center(gctx).phi());
216  }
217  ATH_CHECK(detStore()->record(std::move(tgcSectorMapping), "TGC_SectorMapping"));
218  return StatusCode::SUCCESS;
219 }
221  ServiceHandle<IRDBAccessSvc> accessSvc(m_geoDbTagSvc->getParamSvcName(), name());
222  ATH_CHECK(accessSvc.retrieve());
223  IRDBRecordset_ptr paramTable = accessSvc->getRecordsetPtr("TgcSensorLayout", "");
224  if (paramTable->size() == 0) {
225  ATH_MSG_FATAL("Empty parameter book table found");
226  return StatusCode::FAILURE;
227  }
228  for (const IRDBRecord_ptr& record : *paramTable) {
229  const std::string chambType = record->getString("technology");
230  const int gasGap = record->getInt("gasGap");
231  const std::vector<int> wireGangs{tokenizeInt(record->getString("wireGangs"),",")};
232  const std::vector<double> botStrips = tokenizeDouble(record->getString("bottomStrips"), ",");
233  const std::vector<double> topStrips = tokenizeDouble(record->getString("topStrips"), ",");
234  const std::vector<std::string> sides = tokenize(record->getString("side"), ";");
235  const double wirePitch = record->getDouble("wirePitch");
236  for (const std::string& side : sides) {
237  std::stringstream key{};
238  key<<chambType<<"_"<<gasGap<<side;
239  wTgcTable& parBook{cache.parameterBook[key.str()]};
240  parBook.wireGangs.insert(parBook.wireGangs.end(), wireGangs.begin(), wireGangs.end());
241  parBook.bottomStripPos = botStrips;
242  parBook.topStripPos = topStrips;
243  parBook.wirePitch = wirePitch;
244  parBook.gasGap = gasGap;
245  }
246 
247  }
248  ATH_MSG_DEBUG("Read in total "<<cache.parameterBook.size()<<" chamber layouts");
249  return StatusCode::SUCCESS;
250 }
251 } // namespace MuonGMR4
GeoModel::TransientConstSharedPtr
The TransientConstSharedPtr allows non-const access if the pointer itself is non-const but in the con...
Definition: TransientConstSharedPtr.h:13
dumpTgcDigiDeadChambers.gasGap
list gasGap
Definition: dumpTgcDigiDeadChambers.py:33
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
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
CxxUtils::starts_with
bool starts_with(const char *s, const char *prefix)
Test whether one null-terminated byte string starts with another.
MuonGMR4::TgcReadoutGeomTool::FactoryCache::stripDesigns
ReadoutTable stripDesigns
Definition: TgcReadoutGeomTool.h:53
max
#define max(a, b)
Definition: cfImp.cxx:41
MuonGMR4::MuonDetectorManager
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonDetectorManager.h:61
TgcIdHelper
Definition: TgcIdHelper.h:50
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
CxxUtils::tokenizeInt
std::vector< int > tokenizeInt(const std::string &the_str, std::string_view delimiter)
Definition: Control/CxxUtils/Root/StringUtils.cxx:55
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
MuonGMR4::TgcReadoutGeomTool::wTgcTable
Helper struct to cache the essential readout parameters from the WTGC tables.
Definition: TgcReadoutGeomTool.h:40
WireGroupDesign.h
MuonGMR4::TgcReadoutElement::parameterBook::halfThickness
double halfThickness
Describe the chamber dimensions Half thickness of the chamber.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:24
deg
#define deg
Definition: SbPolyhedron.cxx:17
RadialStripDesign.h
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
isValid
bool isValid(const T &p)
Definition: AtlasPID.h:214
MuonGMR4::TgcReadoutGeomTool::FactoryCache::stripLayouts
RadialStripDesignSet stripLayouts
Definition: TgcReadoutGeomTool.h:55
AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore
const ServiceHandle< StoreGateSvc > & detStore() const
The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:95
Amg::getRotateZ3D
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Definition: GeoPrimitivesHelpers.h:270
TRT::Hit::side
@ side
Definition: HitInfo.h:83
BchCleanup.mgr
mgr
Definition: BchCleanup.py:294
MuonGMR4::TgcReadoutGeomTool::writeSectorMapping
StatusCode writeSectorMapping(const MuonDetectorManager &mgr) const
Map the Tgc sectors to the classical Muon System sectors.
Definition: TgcReadoutGeomTool.cxx:206
Amg::getRotateX3D
Amg::Transform3D getRotateX3D(double angle)
get a rotation transformation around X-axis
Definition: GeoPrimitivesHelpers.h:252
IRDBAccessSvc.h
Definition of the abstract IRDBAccessSvc interface.
MuonGMR4
A muon chamber is a collection of readout elements belonging to the same station.
Definition: ChamberAssembleTool.h:16
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
MuonGMR4::TgcReadoutGeomTool::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: TgcReadoutGeomTool.h:32
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
CxxUtils
Definition: aligned_vector.h:29
MuonGMR4::TgcReadoutGeomTool::readParameterBook
StatusCode readParameterBook(FactoryCache &cache)
Retrieves the auxillary tables from the database.
Definition: TgcReadoutGeomTool.cxx:220
MuonGMR4::TgcReadoutElement::parameterBook::halfWidthLong
double halfWidthLong
Half length of the chamber long edge (Top)
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:30
MuonDetectorManager.h
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonGMR4::TgcReadoutGeomTool::loadDimensions
StatusCode loadDimensions(TgcReadoutElement::defineArgs &args, FactoryCache &factory)
Loads the chamber dimensions from GeoModel.
Definition: TgcReadoutGeomTool.cxx:42
MuonGMR4::TgcReadoutGeomTool::FactoryCache::wireLayouts
WireGroupDesignSet wireLayouts
Definition: TgcReadoutGeomTool.h:56
TgcReadoutGeomTool.h
MuonGMR4::TgcReadoutGeomTool::buildReadOutElements
StatusCode buildReadOutElements(MuonDetectorManager &mgr) override final
Retrieves the GeoModel from the GeoModelSvc and append the ReadoutElements of the Given MuonDetectorT...
Definition: TgcReadoutGeomTool.cxx:154
MuonGMR4::TgcReadoutElement::parameterBook::halfWidthShort
double halfWidthShort
Half length of the chamber short edge (Bottom)
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:28
IRDBRecordset_ptr
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
Definition: IRDBAccessSvc.h:25
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:28
starts_with.h
C++20-like starts_with/ends_with for strings.
min
#define min(a, b)
Definition: cfImp.cxx:40
MuonGMR4::TgcReadoutElement::defineArgs
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:42
MuonGMR4::MuonReadoutElement::defineArgs::chambDesign
std::string chambDesign
chamber design name as it's occuring in the parameter book tables E.g. BMS5, RPC10,...
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:49
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
python.ext.table_printer.table
list table
Definition: table_printer.py:81
MuonGMR4::physVolWithTrans
IMuonGeoUtilityTool::physVolWithTrans physVolWithTrans
Definition: MdtReadoutGeomTool.cxx:25
Amg::getRotateY3D
Amg::Transform3D getRotateY3D(double angle)
get a rotation transformation around Y-axis
Definition: GeoPrimitivesHelpers.h:261
MuonGMR4::MuonChamber::defineArgs
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonChamber.h:42
MuonGMR4::TgcReadoutGeomTool::FactoryCache::parameterBook
ParamBookTable parameterBook
Definition: TgcReadoutGeomTool.h:49
MuonSectorMapping.h
IRDBRecord.h
Definition of the abstract IRDBRecord interface.
MuonGMR4::TgcReadoutElement::parameterBook::halfHeight
double halfHeight
Half height of the chamber (Top - botom edge)
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:26
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
IRDBRecord_ptr
std::unique_ptr< IRDBRecord > IRDBRecord_ptr
Definition: IRDBRecordset.h:23
python.changerun.pv
pv
Definition: changerun.py:81
MuonGMR4::TgcReadoutElement::parameterBook::sensorLayouts
std::array< StripLayerPtr, 6 > sensorLayouts
We have maximum 3 gasgaps times eta / phi measurement.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:34
MuonGMR4::TgcReadoutElement::parameterBook::nGasGaps
unsigned int nGasGaps
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:32
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
MuonGMR4::MuonReadoutElement::defineArgs::detElId
Identifier detElId
ATLAS identifier.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:51
Muon::MuonSectorMapping
Definition: MuonSectorMapping.h:20
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:34
ActsTrk::SurfaceBoundSetPtr
std::shared_ptr< SurfaceBoundSet< BoundType > > SurfaceBoundSetPtr
Aberivation to create a new SurfaceBoundSetPtr.
Definition: SurfaceBoundSet.h:50
MuonGMR4::TgcReadoutGeomTool::FactoryCache::wireDesigns
ReadoutTable wireDesigns
Definition: TgcReadoutGeomTool.h:52
IRDBRecordset.h
Definition of the abstract IRDBRecordset interface.
AthAlgTool
Definition: AthAlgTool.h:26
MuonGMR4::IMuonReadoutGeomTool::physNodeMap
std::map< std::string, GeoFullPhysVol * > physNodeMap
Definition: IMuonReaoutGeomTool.h:25
MuonGMR4::MuonReadoutElement::defineArgs::physVol
GeoIntrusivePtr< GeoVFullPhysVol > physVol
Pointer to the underlying physical volume in GeoModel.
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/MuonReadoutElement.h:45
MuonGMR4::TgcReadoutGeomTool::m_geoDbTagSvc
ServiceHandle< IGeoDbTagSvc > m_geoDbTagSvc
Definition: TgcReadoutGeomTool.h:35
MuonGMR4::TgcReadoutElement
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/MuonReadoutGeometryR4/TgcReadoutElement.h:16
MuonGMR4::TgcReadoutGeomTool::FactoryCache
Definition: TgcReadoutGeomTool.h:47
MuonGMR4::TgcReadoutGeomTool::m_geoUtilTool
PublicToolHandle< IMuonGeoUtilityTool > m_geoUtilTool
Definition: TgcReadoutGeomTool.h:37
MuonGMR4::defineArgs
MuonChamber::defineArgs defineArgs
Definition: ChamberAssembleTool.cxx:32
ServiceHandle< IRDBAccessSvc >
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37