ATLAS Offline Software
MdtMezzanineCard.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
5 
6 #include <algorithm>
7 #include <iostream>
8 #include <set>
9 
10 namespace {
11 using Mapping = MdtMezzanineCard::Mapping;
12 using OfflineCh = MdtMezzanineCard::OfflineCh;
13 std::ostream& operator<<(std::ostream& ostr, const Mapping& map) {
14  for (unsigned int ch = 0; ch < map.size(); ++ch) {
15  ostr << ch << " -> " << static_cast<int>(map[ch]);
16  if (ch != (map.size() - 1))
17  ostr << ", ";
18  }
19  return ostr;
20 }
21 } // namespace
22 std::ostream& operator<<(std::ostream& ostr, const MdtMezzanineCard& map) {
23  ostr << "MezzId: " << static_cast<int>(map.id()) << ", ";
24  ostr << "nTubeLayer: " << static_cast<int>(map.numTubeLayers()) << ", ";
25  ostr << "tdcToTubeMap: " << map.tdcToTubeMap() << ", ";
26  ostr << "tubeToTdcMap: " << std::endl;
27  for (uint8_t lay = map.numTubeLayers(); lay > 0; --lay) {
28  if (!(lay % 2))
29  ostr << " ";
30  for (uint8_t tube = 1; tube <= map.numTubesPerLayer(); ++tube) {
31  uint8_t tubeNum = map.tubeNumber(lay, tube);
32  ostr << std::setw(5)
33  << static_cast<int>(map.tubeToTdcMap()[tubeNum]);
34  }
35  ostr << std::endl;
36  }
37  return ostr;
38 }
40  uint8_t num_layers, uint8_t mezz_id)
41  : m_tdcToTubes{tdcToTubeMap}, m_nlay{num_layers}, m_mezzId{mezz_id} {
43  m_nTubes = m_tdcToTubes.size() / num_layers;
45  for (unsigned int tdc = 0; tdc < m_tdcToTubes.size(); ++tdc) {
46  uint8_t tube = m_tdcToTubes[tdc];
47  if (tube < m_tubesToTdc.size())
48  m_tubesToTdc[tube] = tdc;
49  }
50 }
51 
52 bool MdtMezzanineCard::checkConsistency(MsgStream& log) const {
53  const bool debug = (log.level() <= MSG::VERBOSE);
54  if (debug) {
55  log << MSG::VERBOSE << " Check consistency of mezzanine card "
56  << static_cast<int>(id()) << "." << endmsg;
57  }
58  if (numTubeLayers() != 3 && numTubeLayers() != 4) {
59  log << MSG::ERROR << "Mezzanine card " << static_cast<int>(id())
60  << " has invalid many tube layers "
61  << static_cast<int>(numTubeLayers()) << endmsg;
62  return false;
63  }
65  std::set<uint8_t> uniqueSet{};
66  std::copy_if(m_tdcToTubes.begin(), m_tdcToTubes.end(),
67  std::inserter(uniqueSet, uniqueSet.end()),
68  [](const uint8_t ch) { return ch != NOTSET; });
69  unsigned int unmapped =
70  std::count_if(m_tdcToTubes.begin(), m_tdcToTubes.end(),
71  [](const uint8_t ch) { return ch == NOTSET; });
72  if ((uniqueSet.size() + unmapped) != m_tdcToTubes.size()) {
73  log << MSG::ERROR
74  << "Mezzanine card has unassigned tdc -> tube channels " << endmsg;
75  log << MSG::ERROR << "Mapped channels " << uniqueSet.size()
76  << " dead channels: " << unmapped << std::endl;
77  log << MSG::ERROR << "Please check " << (*this) << endmsg;
78  return false;
79  }
80  if (unmapped == m_tdcToTubes.size()) {
81  log << MSG::ERROR
82  << "Mezzanine card does not have any associated channel " << endmsg;
83  log << MSG::ERROR << "Please check " << (*this) << endmsg;
84  }
85  uniqueSet.clear();
86  std::copy_if(m_tubesToTdc.begin(), m_tubesToTdc.end(),
87  std::inserter(uniqueSet, uniqueSet.end()),
88  [](const uint8_t ch) { return ch != NOTSET; });
89  unmapped = std::count_if(m_tubesToTdc.begin(), m_tubesToTdc.end(),
90  [](const uint8_t ch) { return ch == NOTSET; });
91  if ((uniqueSet.size() + unmapped) != m_tubesToTdc.size()) {
92  log << MSG::ERROR << " Mezzanine card maps tubes -> tdc inconsitently "
93  << endmsg;
94  log << MSG::ERROR << "Mapped channels " << uniqueSet.size()
95  << " dead channels: " << unmapped << std::endl;
96  log << MSG::ERROR << " Please check " << (*this) << endmsg;
97  return false;
98  }
99  if (debug) {
100  log << MSG::VERBOSE << " All checks passed " << std::endl
101  << (*this) << endmsg;
102  }
103  return true;
104 }
105 
107  MsgStream& msg) const {
108  if (tubeLay > numTubeLayers()) {
109  msg << MSG::WARNING << "MdtMezzanineCard::tdcChannel() -- Tube layer "
110  << static_cast<int>(tubeLay) << " is out of range. Max allowed "
111  << static_cast<int>(numTubeLayers()) << endmsg;
112  return NOTSET;
113  }
114  uint8_t globTubeNum = tubeNumber(tubeLay, tube);
115  if (msg.level() <= MSG::VERBOSE) {
116  msg << "MdtMezzanineCard::tdcChannel() -- Resolved layer "
117  << static_cast<int>(tubeLay) << " & tube " << static_cast<int>(tube)
118  << " to " << static_cast<int>(globTubeNum) << endmsg;
119  }
120  return m_tubesToTdc[globTubeNum];
121 }
123  return ((tube - 1) % numTubesPerLayer()) +
124  (numTubesPerLayer() * (tubeLay - 1));
125 }
127  if (tdc >= m_tdcToTubes.size()) {
128  msg << MSG::WARNING << " Tdc channel is out of range "
129  << static_cast<int>(tdc) << endmsg;
130  return {};
131  }
132  uint8_t globTubeNum = m_tdcToTubes[tdc];
133  uint8_t tube = globTubeNum % numTubesPerLayer();
134  uint8_t lay = (globTubeNum - tube) / numTubesPerLayer();
135  OfflineCh ret{};
138  ret.tube = tube;
139  ret.layer = lay + 1;
140  ret.isValid = globTubeNum != NOTSET;
141  return ret;
142 }
MdtMezzanineCard.h
sendEI_SPB.ch
ch
Definition: sendEI_SPB.py:35
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
MdtMezzanineCard::checkConsistency
bool checkConsistency(MsgStream &msg) const
checks whether the tdc mapping is complete.
Definition: MdtMezzanineCard.cxx:52
MdtMezzanineCard::tdcToTubeMap
const Mapping & tdcToTubeMap() const
Returns the underlying TDC -> Tube conversion map.
Definition: MdtMezzanineCard.h:80
MdtMezzanineCard::numTubesPerLayer
uint8_t numTubesPerLayer() const
returns the number of tubes per layer;
Definition: MdtMezzanineCard.h:68
MdtMezzanineCard::tdcChannel
uint8_t tdcChannel(uint8_t tubeLay, uint8_t tube, MsgStream &msg) const
returns the tdc channel number
Definition: MdtMezzanineCard.cxx:106
MdtMezzanineCard::Mapping
std::array< uint8_t, 24 > Mapping
Definition: MdtMezzanineCard.h:39
MdtMezzanineCard::offlineTube
OfflineCh offlineTube(uint8_t tdc, MsgStream &msg) const
Definition: MdtMezzanineCard.cxx:126
MdtMezzanineCard::numTubeLayers
uint8_t numTubeLayers() const
returns the number of layers
Definition: MdtMezzanineCard.h:66
MdtMezzanineCard::m_tdcToTubes
Mapping m_tdcToTubes
Mapping of the tdc channels to the mezzanine tube number.
Definition: MdtMezzanineCard.h:86
MdtMezzanineCard::NOTSET
static constexpr uint8_t NOTSET
Definition: MdtMezzanineCard.h:36
MdtMezzanineCard::id
uint8_t id() const
returns mezzanine database identifier
Definition: MdtMezzanineCard.h:64
MdtMezzanineCard::tubeNumber
uint8_t tubeNumber(uint8_t tubeLay, uint8_t tube) const
returns the tube number
Definition: MdtMezzanineCard.cxx:122
MdtMezzanineCard
MdtMezzanineCard - Helper struct to represent the structure of a mezzanine card in a consistent way E...
Definition: MdtMezzanineCard.h:34
MdtMezzanineCard::OfflineCh
Helper struct to pipe the result from the tdc -> offline channel translation.
Definition: MdtMezzanineCard.h:72
ret
T ret(T t)
Definition: rootspy.cxx:260
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
AnalysisUtils::copy_if
Out copy_if(In first, const In &last, Out res, const Pred &p)
Definition: IFilterUtils.h:30
MdtMezzanineCard::tubeToTdcMap
const Mapping & tubeToTdcMap() const
Returns the underlying Tube -> Tdc conversion map.
Definition: MdtMezzanineCard.h:82
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
MdtMezzanineCard::m_tubesToTdc
Mapping m_tubesToTdc
Mapping of the mezzanine tube number to the tdc channel.
Definition: MdtMezzanineCard.h:88
MdtMezzanineCard::MdtMezzanineCard
MdtMezzanineCard(const Mapping &tdcToTubeMap, uint8_t num_layers, uint8_t mezz_id)
Standard constructor of the mezzanine card.
Definition: MdtMezzanineCard.cxx:39
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
calibdata.tube
tube
Definition: calibdata.py:31
HitType::unmapped
@ unmapped
doL1CaloHVCorrections.num_layers
num_layers
retrieve num layers and layer names (from new or ref hv input)
Definition: doL1CaloHVCorrections.py:379
operator<<
std::ostream & operator<<(std::ostream &ostr, const MdtMezzanineCard &map)
Definition: MdtMezzanineCard.cxx:22