ATLAS Offline Software
Loading...
Searching...
No Matches
NswCalibDbTimeChargeData.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 "GeoModelKernel/throwExcept.h"
8#include <iostream>
9#include <iomanip>
10
11std::ostream& operator<<(std::ostream& ostr, const NswCalibDbTimeChargeData::CalibConstants& obj) {
12 ostr<<"slope: "<<std::setprecision(15)<<obj.slope;//<<" pm "<<std::setprecision(15)<<obj.slopeError;
13 ostr<<" intercept: "<<std::setprecision(15)<<obj.intercept;//<<" pm "<<std::setprecision(15)<<obj.interceptError;
14 return ostr;
15}
16
17// general functions ---------------------------------
24
26 const IdentifierHash hash = m_idHelperSvc->detElementHash(chan_id);
27 if (m_idHelperSvc->isMM(chan_id)) {
28 const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
29 return static_cast<unsigned int>(hash)*(idHelper.gasGapMax()) + (idHelper.gasGap(chan_id) -1);
30 } else if (m_idHelperSvc->issTgc(chan_id)) {
31 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
32 return static_cast<unsigned int>(hash)*(idHelper.gasGapMax() * 3 /*3 channel types*/) +
33 (idHelper.gasGap(chan_id) -1 + idHelper.gasGapMax() * idHelper.channelType(chan_id)) + m_nMmElements;
34 }
35 return -1;
36}
37
38// setting functions ---------------------------------
39
40// setData
41void
43 const Identifier& chnlId,
46
47
48 const int array_idx = identToModuleIdx(chnlId);
49 ATH_MSG_VERBOSE("Set "<<(type == CalibDataType::PDO ? "PDO" : "TDO")<<" calibration constants for channel "
50 <<m_idHelperSvc->toString(chnlId)<<", slot: "<< array_idx<<", "<<constants);
51 CalibModule& calib_mod = calibMap.at(array_idx);
52 const unsigned int channel = (m_idHelperSvc->isMM(chnlId) ?
53 m_idHelperSvc->mmIdHelper().channel(chnlId) :
54 m_idHelperSvc->stgcIdHelper().channel(chnlId)) -1;
55 if (calib_mod.channels.empty()) {
56 if (m_idHelperSvc->isMM(chnlId)) {
57 const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
58 calib_mod.layer_id = idHelper.channelID(chnlId, idHelper.multilayer(chnlId), idHelper.gasGap(chnlId), 1);
59 } else if (m_idHelperSvc->issTgc(chnlId)) {
60 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
61 calib_mod.layer_id = idHelper.channelID(chnlId, idHelper.multilayer(chnlId), idHelper.gasGap(chnlId), idHelper.channelType(chnlId), 1);
62 }
63 }
64 if (calib_mod.channels.size() <= channel) calib_mod.channels.resize(channel +1);
65 if (calib_mod.channels[channel]) {
66 THROW_EXCEPTION("setData() -- Cannot overwrite channel "<<m_idHelperSvc->toString(chnlId)
67 <<"Layer ID: "<<m_idHelperSvc->toString(calib_mod.layer_id)<<
68 " "<<(*calib_mod.channels[channel] ));
69 return;
70 }
71 calib_mod.channels[channel] = std::make_unique<CalibConstants>(std::move(constants));
72}
73
74// setZeroData
75void
77 ZeroCalibMap& calibMap = m_zero[tech];
78 calibMap.insert(std::make_pair(type, std::move(constants)));
79}
80
81
82
83// retrieval functions -------------------------------
84
85// getChannelIds
86std::vector<Identifier>
87NswCalibDbTimeChargeData::getChannelIds(const CalibDataType type, const std::string& tech, const std::string& side) const {
88 std::vector<Identifier> chnls;
90 chnls.reserve(calibMap.size());
91 for (const CalibModule& module : calibMap) {
93 if (module.channels.empty()) continue;
94 if (side == "A" && m_idHelperSvc->stationEta(module.layer_id) < 0) continue;
95 if (side == "C" && m_idHelperSvc->stationEta(module.layer_id) > 0) continue;
96
97 if (m_idHelperSvc->isMM(module.layer_id)) {
98 if (tech == "STGC") continue;
99 const MmIdHelper& idHelper{m_idHelperSvc->mmIdHelper()};
100 for (unsigned int chn = 1 ; chn <= module.channels.size() ; ++chn) {
101 if (!module.channels[chn -1]) continue;
102
103 chnls.push_back(idHelper.channelID(module.layer_id,
104 idHelper.multilayer(module.layer_id),
105 idHelper.gasGap(module.layer_id), chn ));
106 }
107 } else if (m_idHelperSvc->issTgc(module.layer_id)) {
108 if (tech == "MM") break;
109 const sTgcIdHelper& idHelper{m_idHelperSvc->stgcIdHelper()};
110 for (unsigned int chn = 1 ; chn <= module.channels.size() ; ++chn) {
111 if (!module.channels[chn -1]) continue;
112 chnls.push_back(idHelper.channelID(module.layer_id,
113 idHelper.multilayer(module.layer_id),
114 idHelper.gasGap(module.layer_id),
115 idHelper.channelType(module.layer_id), chn ));
116 }
117 }
118 }
119
120 return chnls;
121}
124 const int array_idx = identToModuleIdx(channelId);
125 const unsigned int channel = (m_idHelperSvc->isMM(channelId) ?
126 m_idHelperSvc->mmIdHelper().channel(channelId) :
127 m_idHelperSvc->stgcIdHelper().channel(channelId)) -1;
128 if (calibMap.at(array_idx).channels.size() > channel && calibMap[array_idx].channels[channel]) {
129 return calibMap[array_idx].channels[channel].get();
130 }
131 // search for data for channel zero
133 return getZeroCalibChannel(type, tech);
134
135}
137 std::map<MuonCond::CalibTechType, ZeroCalibMap>::const_iterator itr = m_zero.find(tech);
138 if(itr != m_zero.end()) {
139 const ZeroCalibMap& zeroMap = itr->second;
140 ZeroCalibMap::const_iterator type_itr = zeroMap.find(type);
141 if(type_itr != zeroMap.end()) return &type_itr->second;
142 }
143 return nullptr;
144}
145
146
#define ATH_MSG_VERBOSE(x)
std::ostream & operator<<(std::ostream &ostr, const NswCalibDbTimeChargeData::CalibConstants &obj)
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
This is a "hash" representation of an Identifier.
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channel) const
static int gasGapMax()
int gasGap(const Identifier &id) const override
get the hashes
int multilayer(const Identifier &id) const
Interface for Helper service that creates muon Identifiers and can be used to print Identifiers.
const CalibConstants * getCalibForChannel(const CalibDataType type, const Identifier &channelId) const
Retrieves the calibration constant for a particular readout channel.
const Muon::IMuonIdHelperSvc * m_idHelperSvc
int identToModuleIdx(const Identifier &chan_id) const
void setZero(CalibDataType type, MuonCond::CalibTechType tech, CalibConstants constants)
void setData(CalibDataType type, const Identifier &chnlId, CalibConstants constants)
NswCalibDbTimeChargeData(const Muon::IMuonIdHelperSvc *idHelperSvc)
const size_t m_nMmElements
Segmentation of the elements is per NSW gasGap. Each wedge has 4 gasgaps.
const CalibConstants * getZeroCalibChannel(const CalibDataType type, const MuonCond::CalibTechType tech) const
Returns the dummy calibration constant for the given technology type.
std::vector< Identifier > getChannelIds(const CalibDataType type, const std::string &tech, const std::string &side) const
std::vector< CalibModule > ChannelCalibMap
std::map< CalibDataType, CalibConstants > ZeroCalibMap
std::map< MuonCond::CalibTechType, ZeroCalibMap > m_zero
const size_t m_nStgcElements
Additionally reserve space for the 3 channel types.
int multilayer(const Identifier &id) const
int channelType(const Identifier &id) const
static int gasGapMax()
int gasGap(const Identifier &id) const override
get the hashes
Identifier channelID(int stationName, int stationEta, int stationPhi, int multilayer, int gasGap, int channelType, int channel) const
Helper struct to cache all calibration constants in a common place of the memory.
std::vector< std::unique_ptr< CalibConstants > > channels
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10