ATLAS Offline Software
Loading...
Searching...
No Matches
TileEMScale.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Tile includes
6#include <cmath>
7
11
12
13//
14//____________________________________________________________________
27
28//
29//____________________________________________________________________
32
33//
34//____________________________________________________________________
52
53
54//
55//____________________________________________________________________
57
58 //=== recalculate online cache
59 for (unsigned int drawerIdx = 0; drawerIdx < TileCalibUtils::MAX_DRAWERIDX; ++ drawerIdx) {
60 for (unsigned int channel = 0; channel < m_maxChannels; ++channel) {
61 for (unsigned int adc = 0; adc < m_maxGains; ++adc) {
62 m_onlCache[getCacheIndex(drawerIdx, channel, adc)] = getOnlineCalibration(drawerIdx, channel, adc, m_onlCacheUnit);
63 }
64 }
65 }
66
67}
68
69//
70//____________________________________________________________________
71float TileEMScale::getOnlineCalibration(unsigned int drawerIdx, unsigned int channel,
72 unsigned int adc, TileRawChannelUnit::UNIT onlUnit) const {
73
74 float onlCalib(1.);
75 //=== CIS calibration
77 onlCalib = m_calibOnlCis->getCalibDrawer(drawerIdx)->getCalib(channel, adc, onlCalib);
78
79 //=== LAS+CES calibration
81 onlCalib = m_calibOnlLas->getCalibDrawer(drawerIdx)->getCalib(channel, adc, onlCalib);
82 onlCalib = m_calibOnlCes->getCalibDrawer(drawerIdx)->getCalib(channel, adc, onlCalib);
83 }
84 //=== EMSCALE calibration
86 onlCalib = m_calibOnlEms->getCalibDrawer(drawerIdx)->getCalib(channel, adc, onlCalib);
87 }
88 }
89 //=== Convert float to 16 bit fixed point DSP precision
90 onlCalib = TileCalibUtils::fixedPointPrecision(onlCalib);
91
92 return onlCalib;
93}
94
95//
96//____________________________________________________________________
97float TileEMScale::undoOnlineChannelCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc,
98 float amplitude, TileRawChannelUnit::UNIT onlUnit) const {
99
100 //=== Check if online folders are available
102 throw TileCalib::InvalidRawChanUnit("TileCalibEms::channelCalib(onl)", onlUnit);
103 }
104
105 //=== Check for valid unit request
108 throw TileCalib::InvalidRawChanUnit("TileCalibEms::channelCalib(onl)", onlUnit);
109 }
110
111 float onlCalib(0.);
112 //=== Look up total calib constant in cache if possible ...
113 if (onlUnit == m_onlCacheUnit) {
114 unsigned int idx = getCacheIndex(drawerIdx, channel, adc);
115 if (idx >= m_onlCache.size()) {
116 throw TileCalib::IndexOutOfRange("TileCalibEms::undoOnlineCalib", idx, m_onlCache.size());
117 }
118
119 onlCalib = m_onlCache[idx];
120 } else { //=== ... otherwise compute on the fly
121
122 onlCalib = getOnlineCalibration(drawerIdx, channel, adc, onlUnit);
123
124 }
125
126 //=== Sanity check
127 if (onlCalib == 0.) {
128 throw TileCalib::InvalidValue("TileCalibEms::undoOnlCalib", onlCalib);
129 }
130
131 return amplitude / onlCalib;
132}
133
134//
135//____________________________________________________________________
136float TileEMScale::calibrateChannel(unsigned int drawerIdx, unsigned int channel, unsigned int adc,
137 float amplitude, TileRawChannelUnit::UNIT rawDataUnitIn,
138 TileRawChannelUnit::UNIT rawDataUnitOut) const {
139
140 //=== Undo online calibration, result is offline ADC counts
141 if (rawDataUnitIn >= TileRawChannelUnit::OnlineADCcounts) {
143 throw TileCalib::InvalidRawChanUnit("TileCalibEms::channelCalib(onl)", rawDataUnitIn);
144 } else if (rawDataUnitIn > TileRawChannelUnit::OnlineADCcounts) {
145 amplitude = undoOnlineChannelCalibration(drawerIdx, channel, adc, amplitude, rawDataUnitIn);
146 }
147 rawDataUnitIn = TileRawChannelUnit::ADCcounts;
148 }
149
150 //=== Allow only "forward" calibration from here on
151 if (rawDataUnitOut < rawDataUnitIn || rawDataUnitOut > TileRawChannelUnit::MegaElectronVolts) {
152 throw TileCalib::InvalidRawChanUnit("TileCalibEms::channelCalib(out)", rawDataUnitOut);
153 }
154
155 //=== decide which calibrations to apply
156 switch (rawDataUnitIn) {
157
160 if (rawDataUnitOut > TileRawChannelUnit::ADCcounts) {
161 amplitude = applyChargeCalibration(drawerIdx, channel, adc, amplitude);
162 if (rawDataUnitOut > TileRawChannelUnit::PicoCoulombs) {
163 amplitude = applyLaserCalibration(drawerIdx, channel, amplitude);
164 amplitude = applyCesiumCalibration(drawerIdx, channel, amplitude);
165 if (rawDataUnitOut > TileRawChannelUnit::CesiumPicoCoulombs) {
166 amplitude = applyEMScaleCalibration(drawerIdx, channel, amplitude);
167 }
168 }
169 }
170 break;
171
173 if (rawDataUnitOut > TileRawChannelUnit::PicoCoulombs) {
174 amplitude = applyLaserCalibration(drawerIdx, channel, amplitude);
175 amplitude = applyCesiumCalibration(drawerIdx, channel, amplitude);
176 if (rawDataUnitOut > TileRawChannelUnit::CesiumPicoCoulombs) {
177 amplitude = applyEMScaleCalibration(drawerIdx, channel, amplitude);
178 }
179 }
180 break;
181
183 if (rawDataUnitOut > TileRawChannelUnit::CesiumPicoCoulombs) {
184 amplitude = applyEMScaleCalibration(drawerIdx, channel, amplitude);
185 }
186 break;
187
189 break;
190
191 default:
192 throw TileCalib::InvalidRawChanUnit("TileCalibEms::channelCalib", rawDataUnitIn);
193
194 }
195
196 return amplitude;
197}
198
199//
200//____________________________________________________________________
201float TileEMScale::applyEMScaleCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
202
203 return m_calibOflEms->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
204}
205
206//
207//____________________________________________________________________
208float TileEMScale::applyCesiumCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr) const {
209
210 amplitude = m_calibOflCes->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
211
212 if (applyLasCorr) {
213 //=== At some point a correction relative to the mono-energy laser reference
214 //=== taken with each Cesium calibration run needs to be implemented here.
215 }
216
217 return amplitude;
218}
219
220//
221//____________________________________________________________________
222float TileEMScale::applyLaserCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
223
224 //=== Linear correction
225 if (m_isOflLasLinUsed) {
226 amplitude = m_calibOflLasLin->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
227 }
228
229 //=== Non-linear correction
230 if (m_isOflLasNlnUsed) {
231 amplitude = m_calibOflLasNln->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
232 }
233
234 return amplitude;
235}
236
237//
238//____________________________________________________________________
239float TileEMScale::applyLaserLinearCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
240
241 //=== Linear correction
242 if (m_isOflLasLinUsed) {
243 amplitude = m_calibOflLasLin->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
244 }
245
246 return amplitude;
247}
248
249//
250//____________________________________________________________________
251float TileEMScale::applyLaserNonLinearCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
252
253 //=== Non-linear correction
254 if (m_isOflLasNlnUsed) {
255 amplitude = m_calibOflLasNln->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
256 }
257
258 return amplitude;
259}
260
261
262//
263//____________________________________________________________________
264float TileEMScale::applyChargeCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
265
266 //=== Linear correction
267 amplitude = m_calibOflCisLin->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
268
269 //=== Non-linear correction
270 return m_calibOflCisNln->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
271}
272
273//
274//____________________________________________________________________
275float TileEMScale::applyChargLinearCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
276
277 //=== Linear correction
278 return m_calibOflCisLin->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
279
280}
281
282//
283//____________________________________________________________________
284float TileEMScale::applyChargeNonLinearCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
285
286 //=== Non-linear correction
287 return m_calibOflCisNln->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
288}
289
290//
291//____________________________________________________________________
292float TileEMScale::calibrateOnlineChannel(unsigned int drawerIdx, unsigned int channel, unsigned int adc,
293 float amplitude, TileRawChannelUnit::UNIT onlUnit) const {
294
295 //=== CIS calibration
297 amplitude = m_calibOnlCis->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
298
299 //=== LAS+CES calibration
301 amplitude = m_calibOnlLas->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
302 amplitude = m_calibOnlCes->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
303 }
304
305 //=== EMSCALE calibration
307 amplitude = m_calibOnlEms->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
308 }
309 }
310
311 //=== convert float to 16 bit fixed point DSP precision
312 amplitude = TileCalibUtils::fixedPointPrecision(amplitude);
313
314 return amplitude;
315
316}
317
318//
319//____________________________________________________________________
320float TileEMScale::applyOnlineEMScaleCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
321
322 return m_calibOnlEms->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
323}
324
325//
326//____________________________________________________________________
327float TileEMScale::applyOnlineCesiumCalibration(unsigned int drawerIdx, unsigned int channel,
328 float amplitude, bool applyLasCorr) const {
329
330 amplitude = m_calibOnlCes->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
331 if (applyLasCorr) {
332 //=== At some point a correction relative to the mono-energy laser reference
333 //=== taken with each Cesium calibration run needs to be implemented here.
334 }
335
336 return amplitude;
337}
338
339//
340//____________________________________________________________________
341float TileEMScale::applyOnlineLaserCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
342
343 //=== Linear correction only
344 return m_calibOnlLas->getCalibDrawer(drawerIdx)->getCalib(channel, 0, amplitude);
345}
346
347//
348//____________________________________________________________________
349float TileEMScale::applyOnlineChargeCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
350
351
352 //=== Linear correction only
353 return m_calibOnlCis->getCalibDrawer(drawerIdx)->getCalib(channel, adc, amplitude);
354}
355
356//
357//____________________________________________________________________
358float TileEMScale::getCesiumReferenceLaserGain(unsigned int drawerIdx, unsigned int channel, unsigned int adc) const {
359
360 return m_calibOflCes->getCalibDrawer(drawerIdx)->getData(channel, adc, 1);
361}
362
363//
364//____________________________________________________________________
365float TileEMScale::getCesiumReferenceHV(unsigned int drawerIdx, unsigned int channel) const {
366
367 return m_calibOflCes->getCalibDrawer(drawerIdx)->getData(channel, 0, 2);
368}
369
370//
371//____________________________________________________________________
372float TileEMScale::getCesiumReferenceTemperature(unsigned int drawerIdx, unsigned int channel) const {
373
374 return m_calibOflCes->getCalibDrawer(drawerIdx)->getData(channel, 0, 3);
375}
376
377//
378//____________________________________________________________________
379float TileEMScale::getLaserFiberVariation(unsigned int drawerIdx, unsigned int channel) const {
380
381 return m_calibOflLasFib->getCalibDrawer(drawerIdx)->getData(channel, 0, 0);
382}
383
384//
385//____________________________________________________________________
386float TileEMScale::getLaserPartitionVariation(unsigned int drawerIdx) const {
387
388 unsigned int firstDrawerIdx = TileCalibUtils::getFirstDrawerInPartitionIdx(drawerIdx);
389 return m_calibOflLasFib->getCalibDrawer(firstDrawerIdx)->getData( TileCalibUtils::LAS_PART_CHAN, 0, 0);
390}
391
392//
393//____________________________________________________________________
394float TileEMScale::getLaserReferenceHV(unsigned int drawerIdx, unsigned int channel) const {
395
396 float val = -4.;
397
398 const TileCalibDrawerFlt* calibDrawer = m_calibOflLasLin->getCalibDrawer(drawerIdx);
399 int size = calibDrawer->getObjSizeUint32();
400 if (size > 1) {
401 val = m_calibOflLasLin->getCalibDrawer(drawerIdx)->getData(channel, 0, 1);
402 }
403
404 return val;
405}
406//
407
408void TileEMScale::setCalibOflCisLin(std::unique_ptr<TileCalibDataFlt> calibData) {
409 m_calibOflCisLin = std::move(calibData);
410}
411
412void TileEMScale::setCalibOflCisNln(std::unique_ptr<TileCalibDataFlt> calibData) {
413 m_calibOflCisNln = std::move(calibData);
414}
415
416void TileEMScale::setCalibOflLasLin(std::unique_ptr<TileCalibDataFlt> calibData) {
417 m_calibOflLasLin = std::move(calibData);
418}
419
420void TileEMScale::setCalibOflLasNln(std::unique_ptr<TileCalibDataFlt> calibData) {
421 m_calibOflLasNln = std::move(calibData);
422}
423
424void TileEMScale::setCalibOflLasFib(std::unique_ptr<TileCalibDataFlt> calibData) {
425 m_calibOflLasFib = std::move(calibData);
426}
427
428void TileEMScale::setCalibOflCes(std::unique_ptr<TileCalibDataFlt> calibData) {
429 m_calibOflCes = std::move(calibData);
430}
431
432void TileEMScale::setCalibOflEms(std::unique_ptr<TileCalibDataFlt> calibData) {
433 m_calibOflEms = std::move(calibData);
434}
435
436
437void TileEMScale::setCalibOnlCis(std::unique_ptr<TileCalibDataFlt> calibData) {
438 m_calibOnlCis = std::move(calibData);
439}
440
441void TileEMScale::setCalibOnlLas(std::unique_ptr<TileCalibDataFlt> calibData) {
442 m_calibOnlLas = std::move(calibData);
443}
444
445void TileEMScale::setCalibOnlCes(std::unique_ptr<TileCalibDataFlt> calibData) {
446 m_calibOnlCes = std::move(calibData);
447}
448
449void TileEMScale::setCalibOnlEms(std::unique_ptr<TileCalibDataFlt> calibData) {
450 m_calibOnlEms = std::move(calibData);
451}
452
453
455
456 const float defval = 1.0;
457 const float epsilon = defval * m_epsilon;
458 float val(defval);
459 for (unsigned int drawerIdx = 0; drawerIdx < TileCalibUtils::MAX_DRAWERIDX; ++drawerIdx) {
460 for (unsigned int chn = 0; chn < TileCalibUtils::MAX_CHAN; ++chn) {
461 val = m_calibOflLasLin->getCalibDrawer(drawerIdx)->getCalib(chn, 0, defval);
462 if (std::abs(val - defval) > epsilon) {
463 return true;
464 }
465 }
466 }
467
468 return false;
469}
470
472
473 const float defval = 100.0;
474 const float epsilon = defval * m_epsilon;
475 float val(defval);
476
477 for (unsigned int drawerIdx = 0; drawerIdx < TileCalibUtils::MAX_DRAWERIDX; ++drawerIdx) {
478 for (unsigned int chn = 0; chn < TileCalibUtils::MAX_CHAN; ++chn) {
479 val = m_calibOflLasNln->getCalibDrawer(drawerIdx)->getCalib(chn, 0, defval);
480 if (std::abs(val - defval) > epsilon) {
481 return true;
482 }
483 }
484 }
485
486 return false;
487}
Generic class for storing a number of floats (Flt) for each channel or ADC.
static const unsigned int MAX_DRAWERIDX
Maximal drawer index.
static const unsigned int LAS_PART_CHAN
Empty channel number to store laser partition variation.
static float fixedPointPrecision(float val, unsigned int nBits=16)
Returns the input in fixed point precision.
static unsigned int getFirstDrawerInPartitionIdx(unsigned int drawerIdx)
Returns the first drawer Idx in a partition of a given input drawer.
static const unsigned int MAX_CHAN
Number of channels in drawer.
float getLaserFiberVariation(unsigned int drawerIdx, unsigned int channel) const
Return laser fiber relative variation.
float undoOnlineChannelCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
Undo the calibration applied in ROD signal reconstruction.
float applyChargLinearCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Apply CIS linear calibration: ADC counts -> pC.
void setCalibOflLasFib(std::unique_ptr< TileCalibDataFlt > calibData)
void setCalibOflEms(std::unique_ptr< TileCalibDataFlt > calibData)
void setCalibOflCisLin(std::unique_ptr< TileCalibDataFlt > calibData)
float applyChargeCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Apply CIS calibration: ADC counts -> pC.
float calibrateOnlineChannel(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
Calibrate an online Tile channel from OnlineADCcounts to an arbitrary Online unit,...
void setCalibOflCisNln(std::unique_ptr< TileCalibDataFlt > calibData)
TileRawChannelUnit::UNIT m_onlCacheUnit
void setCalibOnlCes(std::unique_ptr< TileCalibDataFlt > calibData)
std::unique_ptr< TileCalibDataFlt > m_calibOflEms
std::unique_ptr< TileCalibDataFlt > m_calibOflCisNln
void setCalibOnlCis(std::unique_ptr< TileCalibDataFlt > calibData)
std::unique_ptr< TileCalibDataFlt > m_calibOnlCes
float applyChargeNonLinearCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Apply CIS non-linear calibration: ADC counts -> pC.
void setCalibOnlLas(std::unique_ptr< TileCalibDataFlt > calibData)
std::unique_ptr< TileCalibDataFlt > m_calibOflCes
std::unique_ptr< TileCalibDataFlt > m_calibOnlEms
bool m_useOflLasFib
float getCesiumReferenceHV(unsigned int drawerIdx, unsigned int channel) const
Return the reference PMT HV set in last cesium calibration.
bool initialize()
bool m_isOflLasNlnUsed
std::unique_ptr< TileCalibDataFlt > m_calibOnlLas
float getLaserReferenceHV(unsigned int drawerIdx, unsigned int channel) const
Returns the reference PMT HV from appropriate laser calibration.
unsigned int m_maxChannels
float applyEMScaleCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Calibrate a Tile channel to EM scale: Equalized pC -> MeV.
const float m_epsilon
float applyLaserNonLinearCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Apply laser (PMT nonlinearity) correction.
void setCalibOflCes(std::unique_ptr< TileCalibDataFlt > calibData)
float getLaserPartitionVariation(unsigned int drawerIdx) const
Return laser partition relative variation.
std::unique_ptr< TileCalibDataFlt > m_calibOnlCis
float applyOnlineLaserCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Apply online laser (PMT linearity) correction.
float applyOnlineChargeCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Apply online CIS calibration: ADC counts -> pC.
float applyOnlineEMScaleCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Calibrate online chnnel to EM scale: Equalized pC -> MeV.
std::unique_ptr< TileCalibDataFlt > m_calibOflLasNln
float calibrateChannel(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT rawDataUnitIn, TileRawChannelUnit::UNIT rawDataUnitOut) const
Calibrate a Tile channel.
float getCesiumReferenceTemperature(unsigned int drawerIdx, unsigned int channel) const
Return the drawer temperature as measured during last cesium equalization.
std::unique_ptr< TileCalibDataFlt > m_calibOflLasFib
std::vector< float > m_onlCache
float applyLaserLinearCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Apply laser (PMT linearity) correction.
float applyOnlineCesiumCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Apply online cesium calibration constant.
unsigned int getCacheIndex(unsigned int drawerIdx, unsigned int channel, unsigned int adc) const
Return cache index used for online calibration constants.
void setCalibOflLasNln(std::unique_ptr< TileCalibDataFlt > calibData)
unsigned int m_maxGains
std::unique_ptr< TileCalibDataFlt > m_calibOflLasLin
void resetOnlineCache()
Recache the total online calibration constant applied in ROD.
void setCalibOflLasLin(std::unique_ptr< TileCalibDataFlt > calibData)
void setCalibOnlEms(std::unique_ptr< TileCalibDataFlt > calibData)
bool m_isOflLasLinUsed
bool checkIfOflLaserLinearCalibrationUsed() const
Check if offline linear laser calibration will be used.
float getCesiumReferenceLaserGain(unsigned int drawerIdx, unsigned int channel, unsigned int adc) const
Return the PMT gain reference as measured by the laser system.
float applyLaserCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Apply laser correction.
float applyCesiumCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Apply cesium calibration constant.
float getOnlineCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, TileRawChannelUnit::UNIT onlUnit) const
Return the calibration constant applied in the DSP.
std::unique_ptr< TileCalibDataFlt > m_calibOflCisLin
bool checkIfOflLaserNonLinearCalibrationUsed() const
Check if offline nonlinear laser calibration will be used.
virtual ~TileEMScale()
unsigned int m_drawerCacheSize
STL namespace.