ATLAS Offline Software
Loading...
Searching...
No Matches
TileExpertToolEmscale.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Tile includes
9
10//
11//____________________________________________________________________
12static const InterfaceID IID_TileExpertToolEmscale("TileExpertToolEmscale", 1, 0);
13
17
18//
19//____________________________________________________________________
20TileExpertToolEmscale::TileExpertToolEmscale(const std::string& type, const std::string& name,
21 const IInterface* parent)
22 : TileCondToolEmscale(type, name, parent)
23 , m_setOnceCounter(false)
24 , m_emOptions(0)
25{
26 declareInterface<TileExpertToolEmscale>(this);
27}
28
29//
30//___________________________________________________________________
31float TileExpertToolEmscale::channelCalib(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude
32 , TileRawChannelUnit::UNIT rawDataUnitIn, TileRawChannelUnit::UNIT rawDataUnitOut) const {
33
35
36 //=== Undo online calibration, result is offline ADC counts
37 if (rawDataUnitIn >= TileRawChannelUnit::OnlineADCcounts) {
39 throw TileCalib::InvalidRawChanUnit("TileExpertToolEmscale::channelCalib(onl)", rawDataUnitIn);
40 } else if (rawDataUnitIn > TileRawChannelUnit::OnlineADCcounts) {
41 amplitude = undoOnlCalib(drawerIdx, channel, adc, amplitude, rawDataUnitIn);
42 }
43 rawDataUnitIn = TileRawChannelUnit::ADCcounts;
44 }
45
46 //=== Allow only "forward" calibration from here on
47 if (rawDataUnitOut < rawDataUnitIn || rawDataUnitOut > TileRawChannelUnit::MegaElectronVolts) {
48 ATH_MSG_ERROR( "Invalid unit combination: "
49 << "in=" << rawDataUnitIn << " ,"
50 << "out="<< rawDataUnitOut );
51 throw TileCalib::InvalidRawChanUnit("TileExpertToolEmscale::channelCalib(out)", rawDataUnitOut);
52 }
53
54 //=== Decide which calibrations to apply
55 switch (rawDataUnitIn) {
56
59 if (rawDataUnitOut > TileRawChannelUnit::ADCcounts) {
60 amplitude = doCalibCis(drawerIdx, channel, adc, amplitude);
61 if (rawDataUnitOut > TileRawChannelUnit::PicoCoulombs) {
62 amplitude = doCalibLas(drawerIdx, channel, amplitude);
63 amplitude = doCalibCes(drawerIdx, channel, amplitude);
64 if (rawDataUnitOut > TileRawChannelUnit::CesiumPicoCoulombs) {
65 amplitude = doCalibEms(drawerIdx, channel, amplitude);
66 }
67 }
68 }
69 break;
70
72 if (rawDataUnitOut > TileRawChannelUnit::PicoCoulombs) {
73 amplitude = doCalibLas(drawerIdx, channel, amplitude);
74 amplitude = doCalibCes(drawerIdx, channel, amplitude);
75 if (rawDataUnitOut > TileRawChannelUnit::CesiumPicoCoulombs) {
76 amplitude = doCalibEms(drawerIdx, channel, amplitude);
77 }
78 }
79 break;
80
82 if (rawDataUnitOut > TileRawChannelUnit::CesiumPicoCoulombs) {
83 amplitude = doCalibEms(drawerIdx, channel, amplitude);
84 }
85 break;
86
88 break;
89
90 default:
91 ATH_MSG_ERROR( "We should never come here: "
92 << "in=" << rawDataUnitIn << " ,"
93 << "out=" << rawDataUnitOut );
94
95 throw TileCalib::InvalidRawChanUnit("TileExpertToolEmscale::channelCalib", rawDataUnitIn);
96
97 }
98
99 return amplitude;
100
101}
102
103//
104//____________________________________________________________________
105float TileExpertToolEmscale::doCalibEms(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
106
107 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflEms)) {
108 return TileCondToolEmscale::doCalibEms(drawerIdx, channel, amplitude);
109 } else {
110 return amplitude;
111 }
112}
113
114//
115//____________________________________________________________________
116float TileExpertToolEmscale::doCalibCes(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr) const {
117
118 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflCes)) {
119 return TileCondToolEmscale::doCalibCes(drawerIdx, channel, amplitude, applyLasCorr);
120 } else {
121 return amplitude;
122 }
123
124}
125
126//
127//____________________________________________________________________
128float TileExpertToolEmscale::doCalibLas(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
129
131
132 //=== Linear correction
133 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflLasLin)) {
134 amplitude = emScale->applyLaserLinearCalibration(drawerIdx, channel, amplitude);
135 } // OflLasLin
136
137 //=== Non-linear correction
138 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflLasNln)) {
139 amplitude = emScale->applyLaserNonLinearCalibration(drawerIdx, channel, amplitude);
140 } // OflLasNln
141
142 return amplitude;
143}
144
145//
146//____________________________________________________________________
147float TileExpertToolEmscale::doCalibCis(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
148
150
151 //=== Linear correction
152 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflCisFitLin)) {
153 amplitude = emScale->applyChargLinearCalibration(drawerIdx, channel, adc, amplitude);
154 } // OflCisFitLin
155
156 //=== non-linear correction
157 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflCisFitNln)) {
158 amplitude = emScale->applyChargeNonLinearCalibration(drawerIdx, channel, adc, amplitude);
159 } // OflCisFitNln
160
161 return amplitude;
162}
163
164//
165//____________________________________________________________________
166float TileExpertToolEmscale::channelCalibOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc
167 , float amplitude, TileRawChannelUnit::UNIT onlUnit) const {
168
169 ATH_MSG_VERBOSE( "Recalculating total online constant for "
170 << drawerIdx << "/" << channel << "/" << adc << " , " << onlUnit );
171
173
174 //=== CIS calibration
176 amplitude = doCalibCisOnl(drawerIdx, channel, adc, amplitude);
177 ATH_MSG_VERBOSE( "---> amplitude after CIS: " << amplitude );
178
179 //=== LAS+CES calibration
181 amplitude = doCalibLasOnl(drawerIdx, channel, amplitude);
182 ATH_MSG_VERBOSE( "---> amplitude after LAS: " << amplitude );
183
184 amplitude = doCalibCesOnl(drawerIdx, channel, amplitude);
185 ATH_MSG_VERBOSE( "---> amplitude after CES: " << amplitude );
186
187 }
188 //=== EMSCALE calibration
190 amplitude = doCalibEmsOnl(drawerIdx, channel, amplitude);
191 ATH_MSG_VERBOSE( "---> amplitude after EMS: " << amplitude );
192 }
193 }
194
195 //=== convert float to 16 bit fixed point DSP precision
196 amplitude = TileCalibUtils::fixedPointPrecision(amplitude);
197 ATH_MSG_VERBOSE( "---> amplitude in fixed point precision: " << amplitude );
198
199 return amplitude;
200
201}
202
203//
204//____________________________________________________________________
205float TileExpertToolEmscale::doCalibEmsOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
206
207 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OnlEms)) {
208 return TileCondToolEmscale::doCalibEmsOnl(drawerIdx, channel, amplitude);
209 } else {
210 return amplitude;
211 }
212
213}
214
215//
216//____________________________________________________________________
217float TileExpertToolEmscale::doCalibCesOnl(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr) const {
218
219 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OnlCes)) {
220 return TileCondToolEmscale::doCalibCesOnl(drawerIdx, channel, amplitude, applyLasCorr);
221 } else {
222 return amplitude;
223 }
224
225}
226
227//
228//____________________________________________________________________
229float TileExpertToolEmscale::doCalibLasOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
230
231 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OnlLasLin)) {
232 return TileCondToolEmscale::doCalibLasOnl(drawerIdx, channel, amplitude);
233 } else {
234 return amplitude;
235 }
236
237}
238
239//
240//____________________________________________________________________
241float TileExpertToolEmscale::doCalibCisOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
242
243 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OnlCisLin)) {
244 return TileCondToolEmscale::doCalibCisOnl(drawerIdx, channel, adc, amplitude);
245 } else {
246 return amplitude;
247 }
248
249}
250
251//
252//____________________________________________________________________
253float TileExpertToolEmscale::undoOnlCalib(unsigned int drawerIdx, unsigned int channel, unsigned int adc
254 , float amplitude, TileRawChannelUnit::UNIT onlUnit) const {
255
257
258 //=== Check if online folders are available
259 if (emScale->getOnlineCacheUnit() == TileRawChannelUnit::Invalid) {
260 ATH_MSG_FATAL( "Trying to undo online calibration, but COOL folders were not loaded" );
261 std::abort();
262 }
263
264 //=== Check for valid unit request
267 throw TileCalib::InvalidRawChanUnit("TileExpertToolEmscale::channelCalib(onl)", onlUnit);
268 }
269
270 float val(1.);
271 //=== Compute total calib constant on the fly
272 val = channelCalibOnl(drawerIdx, channel, adc, val, onlUnit);
273
274 //=== Sanity check
275 if (val == 0.) {
276 throw TileCalib::InvalidValue("TileExpertToolEmscale::undoOnlCalib", val);
277 }
278
279 return amplitude / val;
280}
281
282//
283//____________________________________________________________________
284float TileExpertToolEmscale::getLasPartition(unsigned int drawerIdx) const {
285
286 if (m_emOptions.getEmscaleCalibBit(TileEmscaleCalibOptions::OflLasPart)) {
287 return TileCondToolEmscale::getLasPartition(drawerIdx);
288 } else {
289 return 1.0;
290 }
291
292}
293
294//
295//____________________________________________________________________
297 //=== check whether the m_emOptions were not already set (except for the constructor)
298 if (!m_setOnceCounter) {
299 m_emOptions = emOptions;
300 m_setOnceCounter = true;
301 ATH_MSG_INFO( "m_emOptions set to = " << m_emOptions.getEmscaleCalibOptions() );
302 } else {
303 ATH_MSG_WARNING( "m_emOptions already set, original value is kept = "
304 << m_emOptions.getEmscaleCalibOptions() );
305 }
306}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
static const InterfaceID IID_TileExpertToolEmscale("TileExpertToolEmscale", 1, 0)
static float fixedPointPrecision(float val, unsigned int nBits=16)
Returns the input in fixed point precision.
float doCalibCesOnl(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Online application of cesium calibration constant.
float doCalibCes(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Application of cesium calibration constant.
TileCondToolEmscale(const std::string &type, const std::string &name, const IInterface *parent)
SG::ReadCondHandleKey< TileEMScale > m_emScaleKey
float doCalibEms(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Calibration to EM scale: Equalized pC -> MeV.
float doCalibEmsOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Online calibration to EM scale: Equalized pC -> MeV.
float doCalibLasOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Online application of laser (PMT linearity) correction.
float doCalibCisOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Online Application of CIS calibration: ADC counts -> pC.
float getLasPartition(unsigned int drawerIdx) const
Returns laser partition relative variation.
Class for encoding Tile calibration options into a bit map.
float doCalibLasOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
float getLasPartition(unsigned int drawerIdx) const
float doCalibCesOnl(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
static const InterfaceID & interfaceID()
float doCalibEmsOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
float doCalibCis(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
float channelCalibOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
TileEmscaleCalibOptions m_emOptions
float doCalibCes(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
TileExpertToolEmscale(const std::string &type, const std::string &name, const IInterface *parent)
void setEmOptions(const TileEmscaleCalibOptions &emOptions)
float doCalibCisOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
float doCalibEms(unsigned int drawerIdx, unsigned int channel, float amplitude) const
float channelCalib(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT rawDataUnitIn, TileRawChannelUnit::UNIT rawDataUnitOut) const
float doCalibLas(unsigned int drawerIdx, unsigned int channel, float amplitude) const
float undoOnlCalib(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const