ATLAS Offline Software
NswCalibDbTimeChargeData.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
7 #include "Identifier/Identifier.h"
8 #include "GeoModelHelpers/throwExcept.h"
9 
10 std::ostream& operator<<(std::ostream& ostr, const NswCalibDbTimeChargeData::CalibConstants& obj) {
11  ostr<<"slope: "<<std::setprecision(15)<<obj.slope;//<<" pm "<<std::setprecision(15)<<obj.slopeError;
12  ostr<<" intercept: "<<std::setprecision(15)<<obj.intercept;//<<" pm "<<std::setprecision(15)<<obj.interceptError;
13  return ostr;
14 }
15 
16 // general functions ---------------------------------
18  AthMessaging{"NswCalibDbTimeChargeData"},
19  m_idHelperSvc{idHelperSvc} {
20  m_pdo_data.resize(m_nStgcElements + m_nMmElements);
21  m_tdo_data.resize(m_nStgcElements + m_nMmElements);
22 }
23 
26  if (m_idHelperSvc->isMM(chan_id)) {
27  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
28  return static_cast<unsigned int>(hash)*(idHelper.gasGapMax()) + (idHelper.gasGap(chan_id) -1);
29  } else if (m_idHelperSvc->issTgc(chan_id)) {
30  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
31  return static_cast<unsigned int>(hash)*(idHelper.gasGapMax() * 3 /*3 channel types*/) +
32  (idHelper.gasGap(chan_id) -1 + idHelper.gasGapMax() * idHelper.channelType(chan_id)) + m_nMmElements;
33  }
34  return -1;
35 }
36 
37 // setting functions ---------------------------------
38 
39 // setData
40 void
42  const Identifier& chnlId,
45 
46 
47  const int array_idx = identToModuleIdx(chnlId);
48  ATH_MSG_VERBOSE("Set "<<(type == CalibDataType::PDO ? "PDO" : "TDO")<<" calibration constants for channel "
49  <<m_idHelperSvc->toString(chnlId)<<", slot: "<< array_idx<<", "<<constants);
50  CalibModule& calib_mod = calibMap.at(array_idx);
51  const unsigned int channel = (m_idHelperSvc->isMM(chnlId) ?
52  m_idHelperSvc->mmIdHelper().channel(chnlId) :
53  m_idHelperSvc->stgcIdHelper().channel(chnlId)) -1;
54  if (calib_mod.channels.empty()) {
55  if (m_idHelperSvc->isMM(chnlId)) {
56  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
57  calib_mod.layer_id = idHelper.channelID(chnlId, idHelper.multilayer(chnlId), idHelper.gasGap(chnlId), 1);
58  } else if (m_idHelperSvc->issTgc(chnlId)) {
59  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
60  calib_mod.layer_id = idHelper.channelID(chnlId, idHelper.multilayer(chnlId), idHelper.gasGap(chnlId), idHelper.channelType(chnlId), 1);
61  }
62  }
63  if (calib_mod.channels.size() <= channel) calib_mod.channels.resize(channel +1);
64  if (calib_mod.channels[channel]) {
65  THROW_EXCEPTION("setData() -- Cannot overwrite channel "<<m_idHelperSvc->toString(chnlId)
66  <<"Layer ID: "<<m_idHelperSvc->toString(calib_mod.layer_id)<<
67  " "<<(*calib_mod.channels[channel] ));
68  return;
69  }
70  calib_mod.channels[channel] = std::make_unique<CalibConstants>(std::move(constants));
71 }
72 
73 // setZeroData
74 void
76  ZeroCalibMap& calibMap = m_zero[tech];
77  calibMap.insert(std::make_pair(type, std::move(constants)));
78 }
79 
80 
81 
82 // retrieval functions -------------------------------
83 
84 // getChannelIds
85 std::vector<Identifier>
86 NswCalibDbTimeChargeData::getChannelIds(const CalibDataType type, const std::string& tech, const std::string& side) const {
87  std::vector<Identifier> chnls;
89  chnls.reserve(calibMap.size());
90  for (const CalibModule& module : calibMap) {
92  if (module.channels.empty()) continue;
93  if (side == "A" && m_idHelperSvc->stationEta(module.layer_id) < 0) continue;
94  if (side == "C" && m_idHelperSvc->stationEta(module.layer_id) > 0) continue;
95 
96  if (m_idHelperSvc->isMM(module.layer_id)) {
97  if (tech == "STGC") continue;
98  const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
99  for (unsigned int chn = 1 ; chn <= module.channels.size() ; ++chn) {
100  if (!module.channels[chn -1]) continue;
101 
102  chnls.push_back(idHelper.channelID(module.layer_id,
103  idHelper.multilayer(module.layer_id),
104  idHelper.gasGap(module.layer_id), chn ));
105  }
106  } else if (m_idHelperSvc->issTgc(module.layer_id)) {
107  if (tech == "MM") break;
108  const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
109  for (unsigned int chn = 1 ; chn <= module.channels.size() ; ++chn) {
110  if (!module.channels[chn -1]) continue;
111  chnls.push_back(idHelper.channelID(module.layer_id,
112  idHelper.multilayer(module.layer_id),
113  idHelper.gasGap(module.layer_id),
114  idHelper.channelType(module.layer_id), chn ));
115  }
116  }
117  }
118 
119  return chnls;
120 }
122  const ChannelCalibMap& calibMap = type == CalibDataType::PDO ? m_pdo_data : m_tdo_data;
123  const int array_idx = identToModuleIdx(channelId);
124  const unsigned int channel = (m_idHelperSvc->isMM(channelId) ?
127  if (calibMap.at(array_idx).channels.size() > channel && calibMap[array_idx].channels[channel]) {
128  return calibMap[array_idx].channels[channel].get();
129  }
130  // search for data for channel zero
132  return getZeroCalibChannel(type, tech);
133 
134 }
136  std::map<MuonCond::CalibTechType, ZeroCalibMap>::const_iterator itr = m_zero.find(tech);
137  if(itr != m_zero.end()) {
138  const ZeroCalibMap& zeroMap = itr->second;
139  ZeroCalibMap::const_iterator type_itr = zeroMap.find(type);
140  if(type_itr != zeroMap.end()) return &type_itr->second;
141  }
142  return nullptr;
143 }
144 
145 
NswCalibDbTimeChargeData::setData
void setData(CalibDataType type, const Identifier &chnlId, CalibConstants constants)
Definition: NswCalibDbTimeChargeData.cxx:41
Muon::IMuonIdHelperSvc::stgcIdHelper
virtual const sTgcIdHelper & stgcIdHelper() const =0
access to TgcIdHelper
NswCalibDbTimeChargeData::CalibConstants
Helper struct to cache all calibration constants in a common place of the memory.
Definition: NswCalibDbTimeChargeData.h:28
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:24
NswCalibDbTimeChargeData.h
NswCalibDbTimeChargeData::CalibDataType::PDO
@ PDO
NswCalibDbTimeChargeData::m_nMmElements
const size_t m_nMmElements
Segmentation of the elements is per NSW gasGap. Each wedge has 4 gasgaps.
Definition: NswCalibDbTimeChargeData.h:58
Muon::IMuonIdHelperSvc::stationEta
virtual int stationEta(const Identifier &id) const =0
Return stationEta for all technologies.
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
NswCalibDbTimeChargeData::CalibDataType
CalibDataType
Definition: NswCalibDbTimeChargeData.h:22
Muon::IMuonIdHelperSvc::mmIdHelper
virtual const MmIdHelper & mmIdHelper() const =0
access to CscIdHelper
TRT::Hit::side
@ side
Definition: HitInfo.h:83
NswCalibDbTimeChargeData::setZero
void setZero(CalibDataType type, MuonCond::CalibTechType tech, CalibConstants constants)
Definition: NswCalibDbTimeChargeData.cxx:75
NswCalibDbTimeChargeData::getZeroCalibChannel
const CalibConstants * getZeroCalibChannel(const CalibDataType type, const MuonCond::CalibTechType tech) const
Returns the dummy calibration constant for the given technology type.
Definition: NswCalibDbTimeChargeData.cxx:135
python.PyAthena.module
module
Definition: PyAthena.py:131
NswCalibDbTimeChargeData::m_tdo_data
ChannelCalibMap m_tdo_data
Definition: NswCalibDbTimeChargeData.h:72
sTgcIdHelper::channel
int channel(const Identifier &id) const override
Definition: sTgcIdHelper.cxx:1027
NswCalibDbTimeChargeData::CalibModule::channels
std::vector< std::unique_ptr< CalibConstants > > channels
Definition: NswCalibDbTimeChargeData.h:66
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
NswCalibDbTimeChargeData::NswCalibDbTimeChargeData
NswCalibDbTimeChargeData(const Muon::IMuonIdHelperSvc *idHelperSvc)
Definition: NswCalibDbTimeChargeData.cxx:17
CaloCondBlobAlgs_fillNoiseFromASCII.channelId
channelId
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:122
NswCalibDbTimeChargeData::m_zero
std::map< MuonCond::CalibTechType, ZeroCalibMap > m_zero
Definition: NswCalibDbTimeChargeData.h:75
Muon::IMuonIdHelperSvc::isMM
virtual bool isMM(const Identifier &id) const =0
returns whether this is a MM Identifier or not
NswCalibDbTimeChargeData::ChannelCalibMap
std::vector< CalibModule > ChannelCalibMap
Definition: NswCalibDbTimeChargeData.h:70
NswCalibDbTimeChargeData::m_idHelperSvc
const Muon::IMuonIdHelperSvc * m_idHelperSvc
Definition: NswCalibDbTimeChargeData.h:56
sTgcIdHelper
Definition: sTgcIdHelper.h:55
MuonCond::CalibTechType::STGC
@ STGC
NswCalibDbTimeChargeData::getChannelIds
std::vector< Identifier > getChannelIds(const CalibDataType type, const std::string &tech, const std::string &side) const
Definition: NswCalibDbTimeChargeData.cxx:86
operator<<
std::ostream & operator<<(std::ostream &ostr, const NswCalibDbTimeChargeData::CalibConstants &obj)
Definition: NswCalibDbTimeChargeData.cxx:10
MmIdHelper::channel
int channel(const Identifier &id) const override
Definition: MmIdHelper.cxx:800
MmIdHelper
Definition: MmIdHelper.h:54
CaloCondBlobAlgs_fillNoiseFromASCII.hash
dictionary hash
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:109
Muon::IMuonIdHelperSvc::toString
virtual std::string toString(const Identifier &id) const =0
print all fields to string
constants
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:1
NswCalibDbTimeChargeData::m_pdo_data
ChannelCalibMap m_pdo_data
Definition: NswCalibDbTimeChargeData.h:71
MuonCond::CalibTechType
CalibTechType
Definition: MuonSpectrometer/MuonConditions/MuonCondGeneral/MuonCondData/MuonCondData/Defs.h:37
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
NswCalibDbTimeChargeData::ZeroCalibMap
std::map< CalibDataType, CalibConstants > ZeroCalibMap
Definition: NswCalibDbTimeChargeData.h:74
Muon::IMuonIdHelperSvc
Interface for Helper service that creates muon Identifiers and can be used to print Identifiers.
Definition: IMuonIdHelperSvc.h:26
NswCalibDbTimeChargeData::CalibModule::layer_id
Identifier layer_id
Definition: NswCalibDbTimeChargeData.h:67
NswCalibDbTimeChargeData::CalibModule
Definition: NswCalibDbTimeChargeData.h:65
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
NswCalibDbTimeChargeData::identToModuleIdx
int identToModuleIdx(const Identifier &chan_id) const
Definition: NswCalibDbTimeChargeData.cxx:24
python.PyAthena.obj
obj
Definition: PyAthena.py:132
NswCalibDbTimeChargeData::getCalibForChannel
const CalibConstants * getCalibForChannel(const CalibDataType type, const Identifier &channelId) const
Retrieves the calibration constant for a particular readout channel.
Definition: NswCalibDbTimeChargeData.cxx:121
Muon::IMuonIdHelperSvc::issTgc
virtual bool issTgc(const Identifier &id) const =0
returns whether this is a sTGC Identifier or not
IMuonIdHelperSvc.h
MuonCond::CalibTechType::MM
@ MM
Muon::IMuonIdHelperSvc::detElementHash
virtual IdentifierHash detElementHash(const Identifier &id) const =0
Returns the detector element hash associated to an Identifier.
Identifier
Definition: IdentifierFieldParser.cxx:14