Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
MuonAlignmentErrorDbAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 #include <GaudiKernel/EventIDRange.h>
8 #include <format>
9 #include <fstream>
10 #include <iterator>
11 
12 MuonAlignmentErrorDbAlg::MuonAlignmentErrorDbAlg(const std::string& name, ISvcLocator* pSvcLocator) :
13  AthReentrantAlgorithm(name, pSvcLocator) {}
14 
16  ATH_MSG_DEBUG("initialize " << name());
19  ATH_CHECK(m_idHelperSvc.retrieve());
20  ATH_CHECK(m_idTool.retrieve());
21  return StatusCode::SUCCESS;
22 }
23 
24 StatusCode MuonAlignmentErrorDbAlg::execute(const EventContext& ctx) const {
25  ATH_MSG_DEBUG("execute " << name());
26 
27  // Write Cond Handle
28 
30  if (writeHandle.isValid()) {
31  ATH_MSG_DEBUG("CondHandle " << writeHandle.fullKey() << " is already valid."
32  << ". In theory this should not be called, but may happen"
33  << " if multiple concurrent events are being processed out of order.");
34  return StatusCode::SUCCESS;
35  }
36  std::unique_ptr<MuonAlignmentErrorData> writeCdo{std::make_unique<MuonAlignmentErrorData>()};
37 
38  std::string clobContent;
39  EventIDRange rangeW;
40  std::tie(clobContent, rangeW) = m_clobFileOverride.value().empty() ? getDbClobContent(ctx) : getFileClobContent();
41 
42  if (clobContent.empty()) {
43  ATH_MSG_ERROR("Cannot retrieve alignment error CLOB");
44  return StatusCode::FAILURE;
45  }
46 
47  std::istringstream indata(clobContent);
48  if (!indata) {
49  ATH_MSG_ERROR("Alignment error configuration invalid");
50  return StatusCode::FAILURE;
51  }
52 
53  ATH_MSG_DEBUG("***********************************");
54  ATH_MSG_DEBUG("PARSING LIST OF DEVIATIONS...");
55 
56  std::string line;
57  std::vector<MuonAlignmentErrorData::MuonAlignmentErrorRule> MuonAlignmentErrorRuleVec;
59  while (getline(indata, line)) {
60  // READING COMMENTS
61  if (line.compare(0, 1,"#") == 0) {
62  // ATH_MSG_DEBUG("Reading a commented line saying " << line);
63  continue;
64  }
65 
66  // READING FROM INPUT FILE: //
67  std::string flag("");
68  std::string name_sstring("");
69  std::string multilayer_sstring("");
70  double translation(0.);
71  double rotation(0.);
72 
73  // GET INPUT FILE VERSION
74  if (line.compare(0, 7, "version") == 0) {
75  std::string clobVersion;
76  std::istringstream(line) >> flag >> clobVersion;
77  ATH_MSG_INFO("*****************************************");
78  ATH_MSG_INFO("Input file version " << clobVersion);
79  ATH_MSG_INFO("*****************************************");
80  writeCdo->setClobVersion(std::move(clobVersion));
81  continue;
82  }
83 
84  // get the flag has_nsw_hits
85  if (line.compare(0, 12, "has_nsw_hits") == 0) {
86  bool hasNswHits{false};
87  std::istringstream(line) >> flag >> hasNswHits;
88  writeCdo->setHasNswHits(hasNswHits);
89  continue;
90  }
91 
92  // A FLAG CHARACTERIZING THE TYPE OF ERROR
93  // A REGULAR EXPRESSION FOR THE STATION NAME (EX: BIL.*) //
94  // TWO DOUBLES FOR THE TRANSLATION AND ROTATION DEVIATIONS //
95  if (std::istringstream(line) >> flag >> name_sstring >> multilayer_sstring >> translation >> rotation) {
96  ATH_MSG_DEBUG(flag << " " << name_sstring << " " << multilayer_sstring << " " << translation << " " << rotation);
97 
98  // SAVING THE STATION DEVIATIONS IN THE STRUCT //
99  aDev.stationName = name_sstring;
100  aDev.multilayer = multilayer_sstring;
101  aDev.translation = translation;
102  aDev.rotation = rotation;
103 
104  // FILLING THE VECTOR OF STRUCT CONTAINING THE STATION DEVIATIONS //
105  MuonAlignmentErrorRuleVec.emplace_back(std::move(aDev));
106 
107  } // check stream is not at the end
108 
109  } // end of loop on input file lines
110 
111  std::vector<MuonAlignmentErrorData::MuonAlignmentErrorRuleCache> MuonAlignmentErrorRuleCacheVec;
113 
114  // Check the presence of detector elements in current reco and generate multimap to deviationVec
115  if (writeCdo->hasNswHits() == 1){
116  ATH_MSG_DEBUG("CLOB HAS NSW errors");
117  if(m_idHelperSvc->hasSTGC()){
118  ATH_MSG_DEBUG("HAS STGC");
119  generateMap(m_idHelperSvc->stgcIdHelper(), m_idTool, aDev_cache, MuonAlignmentErrorRuleVec);
120  }
121  if(m_idHelperSvc->hasMM()){
122  ATH_MSG_DEBUG("HAS MM");
123  generateMap(m_idHelperSvc->mmIdHelper(), m_idTool, aDev_cache, MuonAlignmentErrorRuleVec);
124  }
125  }
126  if (m_idHelperSvc->hasMDT()){
127  ATH_MSG_DEBUG("HAS MDT");
128  generateMap(m_idHelperSvc->mdtIdHelper(), m_idTool, aDev_cache, MuonAlignmentErrorRuleVec);
129  }
130  if (m_idHelperSvc->hasRPC()){
131  ATH_MSG_DEBUG("HAS RPC");
132  generateMap(m_idHelperSvc->rpcIdHelper(), m_idTool, aDev_cache, MuonAlignmentErrorRuleVec);
133  }
134  if (m_idHelperSvc->hasTGC()){
135  ATH_MSG_DEBUG("HAS TGC");
136  generateMap(m_idHelperSvc->tgcIdHelper(), m_idTool, aDev_cache, MuonAlignmentErrorRuleVec);
137  }
138  if (m_idHelperSvc->hasCSC()){
139  ATH_MSG_DEBUG("HAS CSC");
140  generateMap(m_idHelperSvc->cscIdHelper(), m_idTool, aDev_cache, MuonAlignmentErrorRuleVec);
141  }
142 
143  MuonAlignmentErrorRuleCacheVec.emplace_back(std::move(aDev_cache));
144  if (MuonAlignmentErrorRuleVec.empty()) {
145  ATH_MSG_WARNING("Could not read any alignment error configuration");
146  return StatusCode::FAILURE;
147  }
148 
149  writeCdo->setAlignmentErrorRules(std::move(MuonAlignmentErrorRuleVec));
150  writeCdo->setMuonAlignmentErrorRuleCache(std::move(MuonAlignmentErrorRuleCacheVec));
151 
152  if (writeHandle.record(rangeW, std::move(writeCdo)).isFailure()) {
153  ATH_MSG_FATAL("Could not record MuonAlignmentErrorData " << writeHandle.key() << " with EventRange " << rangeW
154  << " into Conditions Store");
155  return StatusCode::FAILURE;
156  }
157  ATH_MSG_INFO("recorded new " << writeHandle.key() << " with range " << rangeW << " into Conditions Store");
158 
159  return StatusCode::SUCCESS;
160 }
161 
162 inline void MuonAlignmentErrorDbAlg::generateMap(const auto & helper_obj, const auto & idTool,
164  std::vector<MuonAlignmentErrorData::MuonAlignmentErrorRule>& devVec) const {
165 
166  for(auto itr = helper_obj.detectorElement_begin(); itr!= helper_obj.detectorElement_end(); ++itr){
167  // GATHERING INFORMATION TO PUT TOGETHER THE STATION NAME //
168  MuonCalib::MuonFixedLongId calibId = idTool->idToFixedLongId(*itr);
169  if (!calibId.isValid()) continue;
170  int multilayer = 1;
171  if (calibId.is_mdt()) {
172  multilayer = calibId.mdtMultilayer();
173  } else if (calibId.is_mmg()) {
174  multilayer = calibId.mmgMultilayer();
175  } else if (calibId.is_stg()) {
176  multilayer = calibId.stgMultilayer();
177  }
178  std::string multilayerName = std::to_string(multilayer);
179  std::string alignStationName = hardwareName(calibId);
181  // try to regexp-match the station name and the multilayer name then fill multimap
182  for (auto& iDev : devVec){
183  if (!boost::regex_match(alignStationName, iDev.stationName)) {
184  ++i;
185  continue;
186  }
187  if (!boost::regex_match(multilayerName, iDev.multilayer)) {
188  ++i;
189  continue;
190  }
191  adev_new.id_rule_map.insert({*itr, i});
192  ++i;
193  }
194  }
195 }
196 
197 std::tuple<std::string, EventIDRange> MuonAlignmentErrorDbAlg::getDbClobContent(const EventContext& ctx) const {
198  // Read Cond Handle
200  const CondAttrListCollection* readCdo{*readHandle};
201  // const CondAttrListCollection* atrc(0);
202  // readCdo = *readHandle;
203  if (readCdo == nullptr) {
204  ATH_MSG_ERROR("Null pointer to the read conditions object");
205  return std::make_tuple(std::string(), EventIDRange());
206  }
207 
208  EventIDRange rangeW;
209  if (!readHandle.range(rangeW)) {
210  ATH_MSG_ERROR("Failed to retrieve validity range for " << readHandle.key());
211  return std::make_tuple(std::string(), EventIDRange());
212  }
213 
214  ATH_MSG_INFO("Size of CondAttrListCollection " << readHandle.fullKey() << " readCdo->size()= " << readCdo->size());
215  ATH_MSG_INFO("Range of input is " << rangeW);
216 
217  // like MuonAlignmentErrorDbTool::loadAlignmentError() after retrieving atrc (readCdo)
218 
219  std::string clobContent, dbClobVersion;
221  for (itr = readCdo->begin(); itr != readCdo->end(); ++itr) {
222  const coral::AttributeList& atr = itr->second;
223  clobContent = *(static_cast<const std::string*>((atr["syserrors"]).addressOfData()));
224  dbClobVersion = *(static_cast<const std::string*>((atr["version"]).addressOfData()));
225  }
226  return std::make_tuple(std::move(clobContent), rangeW);
227 }
228 
229 std::tuple<std::string, EventIDRange> MuonAlignmentErrorDbAlg::getFileClobContent() const {
230  ATH_MSG_INFO("Retrieving alignment error CLOB from file override " << m_clobFileOverride.value());
231 
232  std::ifstream in(m_clobFileOverride.value());
233  if (!in) {
234  ATH_MSG_ERROR("Failed to read CLOB file " << m_clobFileOverride.value());
235  return std::make_tuple(std::string(), EventIDRange());
236  }
237  return std::make_tuple(std::string(std::istreambuf_iterator<char>(in), {}), IOVInfiniteRange::infiniteTime());
238 }
240 // RECOGNIZE STATION NAME //
242 
244  using StationName = MuonCalib::MuonFixedLongId::StationName;
245 
246  // The only exception that cannot be caught by hardwareEta() above
247  if (sector(calibId)==13) {
248  if (calibId.eta()== 7 && calibId.stationName()==StationName::BOL) return "BOE1A13"; // BOE1A13 not BOL7A13
249  if (calibId.eta()==-7 && calibId.stationName()==StationName::BOL) return "BOE1C13"; // BOE1C13 not BOL7C13
250  if (calibId.eta()== 8 && calibId.stationName()==StationName::BOL) return "BOE2A13"; // BOE2A13 not BOL8A13
251  if (calibId.eta()==-8 && calibId.stationName()==StationName::BOL) return "BOE2C13"; // BOE2C13 not BOL8C13
252  }
253 
254  std::string ret = std::format("{}{}{}{}", calibId.stationNameString(), std::abs(hardwareEta(calibId)), side(calibId), sectorString(calibId) );
255  return ret;
256 }
257 
258 inline std::string_view MuonAlignmentErrorDbAlg::side(MuonCalib::MuonFixedLongId calibId) const {
259  return calibId.eta()>0 ? "A" : calibId.eta()<0 ? "C" : "B";
260 }
261 
263  int sec = sector(calibId);
264  if (sec<0 || sec > 99) {
265  throw std::runtime_error("Unhandled sector number");
266  }
267  return std::to_string(sec/10) + std::to_string(sec%10);
268 }
269 
271  if (calibId.is_tgc()) {
272  // TGC sector convention is special
273  return calibId.phi();
274  } else {
275  return isSmallSector(calibId) ? 2*calibId.phi() : 2*calibId.phi()-1;
276  }
277 }
278 
280  using StationName = MuonCalib::MuonFixedLongId::StationName;
281  switch (calibId.stationName()) {
282  case StationName::BIS:
283  case StationName::BMS:
284  case StationName::BOS:
285  case StationName::BEE:
286  case StationName::BMF:
287  case StationName::BOF:
288  case StationName::BOG:
289  case StationName::EES:
290  case StationName::EMS:
291  case StationName::EOS:
292  case StationName::EIS:
293  case StationName::CSS:
294  case StationName::BMG:
295  case StationName::MMS:
296  case StationName::STS:
297  return true;
298  default:
299  return false;
300  }
301 }
302 
304  using StationName = MuonCalib::MuonFixedLongId::StationName;
305  switch (calibId.stationName()) {
306  case StationName::BML:
307  {
308  if (sector(calibId)==13) {
309  switch (calibId.eta()) {
310  case 4: return 5;
311  case 5: return 6;
312  case 6: return 7;
313  case -4: return -5;
314  case -5: return -6;
315  case -6: return -7;
316  }
317  }
318  return calibId.eta();
319  }
320  case StationName::BOL:
321  {
322  // In sector 13, the BOE chambers are coded as BOL, with eta=7
323  if (sector(calibId)==13) {
324  if (calibId.eta()== 7) return 1; // BOE1A13 not BOL7A13
325  if (calibId.eta()==-7) return -1; // BOE1C13 not BOL7C13
326  }
327  return calibId.eta();
328  }
329  case StationName::BOF:
330  // In sectors 12 and 14 BOF1, BOF3, BOF5 are coded with eta=1,2,3
331  return calibId.eta()>0 ? calibId.eta()*2-1 : calibId.eta()*2+1;
332  case StationName::BOG:
333  // In sectors 12 and 14, BOG2, BOG4, BOG6 are coded with eta=1,2,3
334  return calibId.eta()*2;
335  case StationName::EIL:
336  {
337  if ((sector(calibId) == 1) || (sector(calibId) == 9)) {
338  switch (calibId.eta()) {
339  // In sectors 1 and 9 the small chamber is called EIL5, although it comes inward wrt EIL4, so athena indices need to be swapped
340  case 4: return 5;
341  case 5: return 4;
342  case -4: return -5;
343  case -5: return -4;
344  }
345  }
346  return calibId.eta();
347  }
348  case StationName::EEL:
349  {
350  // In sector 5, special EEL chamber called EEL2X05, while athena eta = 1
351  if ((sector(calibId) == 5) && (calibId.eta() == 1)) return 2;
352  if ((sector(calibId) == 5) && (calibId.eta() == -1)) return -2;
353  return calibId.eta();
354  }
355  default: return calibId.eta();
356  }
357 }
BIS
@ BIS
Definition: RegSelEnums.h:11
MuonAlignmentErrorDbAlg::m_readKey
SG::ReadCondHandleKey< CondAttrListCollection > m_readKey
Definition: MuonAlignmentErrorDbAlg.h:38
MuonAlignmentErrorData::MuonAlignmentErrorRule::stationName
boost::regex stationName
Definition: MuonAlignmentErrorData.h:26
MuonCalib::MuonFixedLongId::mmgMultilayer
int mmgMultilayer() const
Mmg specific:
Definition: MuonFixedLongId.h:1451
MuonCalib::MuonFixedLongId::phi
int phi() const
Definition: MuonFixedLongId.h:935
MuonCalib::MuonFixedLongId::is_tgc
bool is_tgc() const
Definition: MuonFixedLongId.h:778
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
MuonCalib::MuonFixedLongId::is_mdt
bool is_mdt() const
Definition: MuonFixedLongId.h:774
MuonAlignmentErrorData::MuonAlignmentErrorRule::translation
double translation
Definition: MuonAlignmentErrorData.h:28
CSS
@ CSS
Definition: ParabolaCscClusterFitter.h:25
vtune_athena.format
format
Definition: vtune_athena.py:14
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
collListGuids.line
string line
Definition: collListGuids.py:77
MuonAlignmentErrorDbAlg::initialize
StatusCode initialize() override
Definition: MuonAlignmentErrorDbAlg.cxx:15
BOG
@ BOG
Definition: RegSelEnums.h:19
MuonAlignmentErrorDbAlg::m_idTool
ToolHandle< MuonCalib::IIdToFixedIdTool > m_idTool
Definition: MuonAlignmentErrorDbAlg.h:45
MuonCalib::MuonFixedLongId::StationName
StationName
an enum with the station names
Definition: MuonFixedLongId.h:64
xAOD::L2MuonParameters::BEE
@ BEE
BEE measurement point.
Definition: TrigMuonDefs.h:24
MuonCalib::MuonFixedLongId::isValid
bool isValid() const
check validity of the identifier.
Definition: MuonFixedLongId.h:770
MuonAlignmentErrorDbAlg::hardwareEta
int hardwareEta(MuonCalib::MuonFixedLongId calibId) const
Definition: MuonAlignmentErrorDbAlg.cxx:303
MuonAlignmentErrorDbAlg::sector
int sector(MuonCalib::MuonFixedLongId calibId) const
Definition: MuonAlignmentErrorDbAlg.cxx:270
MuonAlignmentErrorDbAlg::getDbClobContent
std::tuple< std::string, EventIDRange > getDbClobContent(const EventContext &ctx) const
Definition: MuonAlignmentErrorDbAlg.cxx:197
MuonCalib::MuonFixedLongId::is_mmg
bool is_mmg() const
Definition: MuonFixedLongId.h:790
MuonAlignmentErrorDbAlg::m_idHelperSvc
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Definition: MuonAlignmentErrorDbAlg.h:44
BMF
@ BMF
Definition: RegSelEnums.h:16
MuonAlignmentErrorData::MuonAlignmentErrorRuleCache
Definition: MuonAlignmentErrorData.h:32
MuonCalib::MuonFixedLongId::is_stg
bool is_stg() const
Definition: MuonFixedLongId.h:794
python.PyKernel.AttributeList
AttributeList
Definition: PyKernel.py:36
BOL
@ BOL
Definition: RegSelEnums.h:14
CondAttrListCollection
This class is a collection of AttributeLists where each one is associated with a channel number....
Definition: CondAttrListCollection.h:52
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
MuonCalib::MuonFixedLongId::stgMultilayer
int stgMultilayer() const
Stg specific:
Definition: MuonFixedLongId.h:1516
BOF
@ BOF
Definition: RegSelEnums.h:18
MuonCalib::MuonFixedLongId
Definition: MuonFixedLongId.h:50
MuonCalib::MuonFixedLongId::stationNameString
std::string_view stationNameString() const
Definition: MuonFixedLongId.h:886
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
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
xAOD::rotation
rotation
Definition: TrackSurface_v1.cxx:15
master.flag
bool flag
Definition: master.py:29
MuonAlignmentErrorDbAlg::generateMap
void generateMap(const auto &helper_obj, const auto &idTool, MuonAlignmentErrorData::MuonAlignmentErrorRuleCache &adev_new, std::vector< MuonAlignmentErrorData::MuonAlignmentErrorRule > &devVec) const
Definition: MuonAlignmentErrorDbAlg.cxx:162
MuonAlignmentErrorData::MuonAlignmentErrorRule::multilayer
boost::regex multilayer
Definition: MuonAlignmentErrorData.h:27
MuonAlignmentErrorDbAlg::m_writeKey
SG::WriteCondHandleKey< MuonAlignmentErrorData > m_writeKey
Definition: MuonAlignmentErrorDbAlg.h:40
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
MuonAlignmentErrorDbAlg::MuonAlignmentErrorDbAlg
MuonAlignmentErrorDbAlg(const std::string &name, ISvcLocator *pSvcLocator)
Definition: MuonAlignmentErrorDbAlg.cxx:12
MuonCalib::MuonFixedLongId::eta
int eta() const
Definition: MuonFixedLongId.h:912
MuonAlignmentErrorData::MuonAlignmentErrorRuleCache::id_rule_map
std::unordered_multimap< Identifier, MuonAlignmentErrorRuleIndex > id_rule_map
For each multilayer identifier, cache the indices of the affecting rules.
Definition: MuonAlignmentErrorData.h:36
MuonAlignmentErrorDbAlg::side
std::string_view side(MuonCalib::MuonFixedLongId calibId) const
Definition: MuonAlignmentErrorDbAlg.cxx:258
IOVInfiniteRange.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
MuonAlignmentErrorData::MuonAlignmentErrorRule
Definition: MuonAlignmentErrorData.h:25
MuonAlignmentErrorData::MuonAlignmentErrorRuleIndex
size_t MuonAlignmentErrorRuleIndex
Definition: MuonAlignmentErrorData.h:31
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
MuonAlignmentErrorData::MuonAlignmentErrorRule::rotation
double rotation
Definition: MuonAlignmentErrorData.h:29
MuonAlignmentErrorDbAlg::getFileClobContent
std::tuple< std::string, EventIDRange > getFileClobContent() const
Definition: MuonAlignmentErrorDbAlg.cxx:229
MuonAlignmentErrorDbAlg::hardwareName
std::string hardwareName(MuonCalib::MuonFixedLongId calibId) const
Definition: MuonAlignmentErrorDbAlg.cxx:243
MuonAlignmentErrorDbAlg.h
BML
@ BML
Definition: RegSelEnums.h:12
MuonCalib::MuonFixedLongId::stationName
StationName stationName() const
Definition: MuonFixedLongId.h:882
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CondAttrListCollection::const_iterator
ChanAttrListMap::const_iterator const_iterator
Definition: CondAttrListCollection.h:63
BMS
@ BMS
Definition: RegSelEnums.h:13
MuonCalib::MuonFixedLongId::mdtMultilayer
int mdtMultilayer() const
Mdt specific:
Definition: MuonFixedLongId.h:1070
IOVInfiniteRange::infiniteTime
static EventIDRange infiniteTime()
Produces an EventIDRange that is inifinite in Time and invalid in RunLumi.
Definition: IOVInfiniteRange.h:47
MuonAlignmentErrorDbAlg::m_clobFileOverride
Gaudi::Property< std::string > m_clobFileOverride
Definition: MuonAlignmentErrorDbAlg.h:42
MuonAlignmentErrorDbAlg::execute
StatusCode execute(const EventContext &ctx) const override
Definition: MuonAlignmentErrorDbAlg.cxx:24
BOS
@ BOS
Definition: RegSelEnums.h:15
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
MuonAlignmentErrorDbAlg::sectorString
std::string sectorString(MuonCalib::MuonFixedLongId calibId) const
Definition: MuonAlignmentErrorDbAlg.cxx:262
MuonAlignmentErrorDbAlg::isSmallSector
bool isSmallSector(MuonCalib::MuonFixedLongId calibId) const
Definition: MuonAlignmentErrorDbAlg.cxx:279