ATLAS Offline Software
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 //____________________________________________________________________
12 static const InterfaceID IID_TileExpertToolEmscale("TileExpertToolEmscale", 1, 0);
13 
14 const InterfaceID& TileExpertToolEmscale::interfaceID() {
15  return IID_TileExpertToolEmscale;
16 }
17 
18 //
19 //____________________________________________________________________
20 TileExpertToolEmscale::TileExpertToolEmscale(const std::string& type, const std::string& name,
21  const IInterface* parent)
23  , m_setOnceCounter(false)
24  , m_emOptions(0)
25 {
26  declareInterface<TileExpertToolEmscale>(this);
27 }
28 
29 //
30 //___________________________________________________________________
31 float 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) {
38  if (rawDataUnitIn > TileRawChannelUnit::OnlineMegaElectronVolts) {
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 //____________________________________________________________________
105 float TileExpertToolEmscale::doCalibEms(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
106 
108  return TileCondToolEmscale::doCalibEms(drawerIdx, channel, amplitude);
109  } else {
110  return amplitude;
111  }
112 }
113 
114 //
115 //____________________________________________________________________
116 float TileExpertToolEmscale::doCalibCes(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr) const {
117 
119  return TileCondToolEmscale::doCalibCes(drawerIdx, channel, amplitude, applyLasCorr);
120  } else {
121  return amplitude;
122  }
123 
124 }
125 
126 //
127 //____________________________________________________________________
128 float TileExpertToolEmscale::doCalibLas(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
129 
131 
132  //=== Linear correction
134  amplitude = emScale->applyLaserLinearCalibration(drawerIdx, channel, amplitude);
135  } // OflLasLin
136 
137  //=== Non-linear correction
139  amplitude = emScale->applyLaserNonLinearCalibration(drawerIdx, channel, amplitude);
140  } // OflLasNln
141 
142  return amplitude;
143 }
144 
145 //
146 //____________________________________________________________________
147 float TileExpertToolEmscale::doCalibCis(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
148 
150 
151  //=== Linear correction
153  amplitude = emScale->applyChargLinearCalibration(drawerIdx, channel, adc, amplitude);
154  } // OflCisFitLin
155 
156  //=== non-linear correction
158  amplitude = emScale->applyChargeNonLinearCalibration(drawerIdx, channel, adc, amplitude);
159  } // OflCisFitNln
160 
161  return amplitude;
162 }
163 
164 //
165 //____________________________________________________________________
166 float 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
175  if (onlUnit > TileRawChannelUnit::OnlineADCcounts) {
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 //____________________________________________________________________
205 float TileExpertToolEmscale::doCalibEmsOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
206 
208  return TileCondToolEmscale::doCalibEmsOnl(drawerIdx, channel, amplitude);
209  } else {
210  return amplitude;
211  }
212 
213 }
214 
215 //
216 //____________________________________________________________________
217 float TileExpertToolEmscale::doCalibCesOnl(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr) const {
218 
220  return TileCondToolEmscale::doCalibCesOnl(drawerIdx, channel, amplitude, applyLasCorr);
221  } else {
222  return amplitude;
223  }
224 
225 }
226 
227 //
228 //____________________________________________________________________
229 float TileExpertToolEmscale::doCalibLasOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const {
230 
232  return TileCondToolEmscale::doCalibLasOnl(drawerIdx, channel, amplitude);
233  } else {
234  return amplitude;
235  }
236 
237 }
238 
239 //
240 //____________________________________________________________________
241 float TileExpertToolEmscale::doCalibCisOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const {
242 
244  return TileCondToolEmscale::doCalibCisOnl(drawerIdx, channel, adc, amplitude);
245  } else {
246  return amplitude;
247  }
248 
249 }
250 
251 //
252 //____________________________________________________________________
253 float 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
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 //____________________________________________________________________
284 float TileExpertToolEmscale::getLasPartition(unsigned int drawerIdx) const {
285 
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 = "
305  }
306 }
TileCondToolEmscale::doCalibEms
float doCalibEms(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Calibration to EM scale: Equalized pC -> MeV.
Definition: TileCondToolEmscale.cxx:79
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
TileCondToolEmscale::m_emScaleKey
SG::ReadCondHandleKey< TileEMScale > m_emScaleKey
Definition: TileCondToolEmscale.h:259
plotting.yearwise_efficiency.channel
channel
Definition: yearwise_efficiency.py:28
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TileCondToolEmscale::doCalibLasOnl
float doCalibLasOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Online application of laser (PMT linearity) correction.
Definition: TileCondToolEmscale.cxx:143
TileExpertToolEmscale::m_emOptions
TileEmscaleCalibOptions m_emOptions
Definition: TileExpertToolEmscale.h:58
TileCalib::InvalidRawChanUnit
Signals invalid use of TileRawChannelUnit.
Definition: TileCalorimeter/TileConditions/TileConditions/Exception.h:20
TileEmscaleCalibOptions::OnlCes
@ OnlCes
Definition: TileEmscaleCalibOptions.h:40
TileRawChannelUnit::CesiumPicoCoulombs
@ CesiumPicoCoulombs
Definition: TileRawChannelUnit.h:19
TileEmscaleCalibOptions::OnlCisLin
@ OnlCisLin
Definition: TileEmscaleCalibOptions.h:38
TileEMScale::getOnlineCacheUnit
TileRawChannelUnit::UNIT getOnlineCacheUnit() const
Return the unit of cached online calibration constants.
Definition: TileEMScale.h:440
TileEMScale::applyChargeNonLinearCalibration
float applyChargeNonLinearCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Apply CIS non-linear calibration: ADC counts -> pC.
Definition: TileEMScale.cxx:284
TileExpertToolEmscale.h
TileEMScale::applyChargLinearCalibration
float applyChargLinearCalibration(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Apply CIS linear calibration: ADC counts -> pC.
Definition: TileEMScale.cxx:275
TileCalibUtils.h
TileRawChannelUnit::OnlineADCcounts
@ OnlineADCcounts
Definition: TileRawChannelUnit.h:21
TileEmscaleCalibOptions::OflCes
@ OflCes
Definition: TileEmscaleCalibOptions.h:33
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TileRawChannelUnit::PicoCoulombs
@ PicoCoulombs
Definition: TileRawChannelUnit.h:18
TileEmscaleCalibOptions::getEmscaleCalibBit
bool getEmscaleCalibBit(CalBitPos idx) const
Returns a bit for a given calibration option.
Definition: TileEmscaleCalibOptions.h:88
TileEmscaleCalibOptions::OflEms
@ OflEms
Definition: TileEmscaleCalibOptions.h:34
TileCondToolEmscale::doCalibCisOnl
float doCalibCisOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Online Application of CIS calibration: ADC counts -> pC.
Definition: TileCondToolEmscale.cxx:152
TileExpertToolEmscale::doCalibCisOnl
float doCalibCisOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Definition: TileExpertToolEmscale.cxx:241
TileEmscaleCalibOptions::OflLasLin
@ OflLasLin
Definition: TileEmscaleCalibOptions.h:30
TileRawChannelUnit::OnlinePicoCoulombs
@ OnlinePicoCoulombs
Definition: TileRawChannelUnit.h:22
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TileExpertToolEmscale::doCalibEmsOnl
float doCalibEmsOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Definition: TileExpertToolEmscale.cxx:205
TileRawChannelUnit::OnlineCesiumPicoCoulombs
@ OnlineCesiumPicoCoulombs
Definition: TileRawChannelUnit.h:23
TileEmscaleCalibOptions::OflCisFitNln
@ OflCisFitNln
Definition: TileEmscaleCalibOptions.h:29
TileRawChannelUnit::Invalid
@ Invalid
Definition: TileRawChannelUnit.h:26
TileExpertToolEmscale::m_setOnceCounter
bool m_setOnceCounter
Definition: TileExpertToolEmscale.h:57
TileRawChannelUnit::MegaElectronVolts
@ MegaElectronVolts
Definition: TileRawChannelUnit.h:20
test_pyathena.parent
parent
Definition: test_pyathena.py:15
TileExpertToolEmscale::channelCalib
float channelCalib(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT rawDataUnitIn, TileRawChannelUnit::UNIT rawDataUnitOut) const
Definition: TileExpertToolEmscale.cxx:31
TileEmscaleCalibOptions
Class for encoding Tile calibration options into a bit map.
Definition: TileEmscaleCalibOptions.h:24
TileEmscaleCalibOptions::OnlLasLin
@ OnlLasLin
Definition: TileEmscaleCalibOptions.h:39
TileRawChannelUnit::UNIT
UNIT
Definition: TileRawChannelUnit.h:16
TileExpertToolEmscale::doCalibLasOnl
float doCalibLasOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Definition: TileExpertToolEmscale.cxx:229
TileEmscaleCalibOptions::OnlEms
@ OnlEms
Definition: TileEmscaleCalibOptions.h:41
TileExpertToolEmscale::interfaceID
static const InterfaceID & interfaceID()
Definition: TileExpertToolEmscale.cxx:14
TileEMScale::applyLaserLinearCalibration
float applyLaserLinearCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Apply laser (PMT linearity) correction.
Definition: TileEMScale.cxx:239
TileEmscaleCalibOptions::OflCisFitLin
@ OflCisFitLin
Definition: TileEmscaleCalibOptions.h:28
TileCondToolEmscale::doCalibEmsOnl
float doCalibEmsOnl(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Online calibration to EM scale: Equalized pC -> MeV.
Definition: TileCondToolEmscale.cxx:125
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TileExpertToolEmscale::doCalibCes
float doCalibCes(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Definition: TileExpertToolEmscale.cxx:116
TileExpertToolEmscale::undoOnlCalib
float undoOnlCalib(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
Definition: TileExpertToolEmscale.cxx:253
TileCondToolEmscale
Calibration of TileCal channels and access to calibration factors.
Definition: TileCondToolEmscale.h:58
TileExpertToolEmscale::doCalibLas
float doCalibLas(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Definition: TileExpertToolEmscale.cxx:128
TileExpertToolEmscale::TileExpertToolEmscale
TileExpertToolEmscale(const std::string &type, const std::string &name, const IInterface *parent)
Definition: TileExpertToolEmscale.cxx:20
TileEMScale::applyLaserNonLinearCalibration
float applyLaserNonLinearCalibration(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Apply laser (PMT nonlinearity) correction.
Definition: TileEMScale.cxx:251
TileEmscaleCalibOptions::OflLasNln
@ OflLasNln
Definition: TileEmscaleCalibOptions.h:31
TileExpertToolEmscale::channelCalibOnl
float channelCalibOnl(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude, TileRawChannelUnit::UNIT onlUnit) const
Definition: TileExpertToolEmscale.cxx:166
TileExpertToolEmscale::doCalibCis
float doCalibCis(unsigned int drawerIdx, unsigned int channel, unsigned int adc, float amplitude) const
Definition: TileExpertToolEmscale.cxx:147
TileExpertToolEmscale::doCalibEms
float doCalibEms(unsigned int drawerIdx, unsigned int channel, float amplitude) const
Definition: TileExpertToolEmscale.cxx:105
ReadFloatFromCool.adc
adc
Definition: ReadFloatFromCool.py:48
TileExpertToolEmscale::setEmOptions
void setEmOptions(const TileEmscaleCalibOptions &emOptions)
Definition: TileExpertToolEmscale.cxx:296
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Pythia8_RapidityOrderMPI.val
val
Definition: Pythia8_RapidityOrderMPI.py:14
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Exception.h
TileCondToolEmscale::doCalibCes
float doCalibCes(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Application of cesium calibration constant.
Definition: TileCondToolEmscale.cxx:88
TileEmscaleCalibOptions::getEmscaleCalibOptions
uint32_t getEmscaleCalibOptions() const
Returns the complete bitmap with all EM scale calibration options.
Definition: TileEmscaleCalibOptions.h:80
TileCondToolEmscale::getLasPartition
float getLasPartition(unsigned int drawerIdx) const
Returns laser partition relative variation.
Definition: TileCondToolEmscale.cxx:197
TileCalibUtils::fixedPointPrecision
static float fixedPointPrecision(float val, unsigned int nBits=16)
Returns the input in fixed point precision.
Definition: TileCalibUtils.cxx:268
TileCondToolEmscale::doCalibCesOnl
float doCalibCesOnl(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Online application of cesium calibration constant.
Definition: TileCondToolEmscale.cxx:134
TileExpertToolEmscale::doCalibCesOnl
float doCalibCesOnl(unsigned int drawerIdx, unsigned int channel, float amplitude, bool applyLasCorr=true) const
Definition: TileExpertToolEmscale.cxx:217
TileExpertToolEmscale::getLasPartition
float getLasPartition(unsigned int drawerIdx) const
Definition: TileExpertToolEmscale.cxx:284
TileRawChannelUnit::ADCcounts
@ ADCcounts
Definition: TileRawChannelUnit.h:17
TileCalib::InvalidValue
Thrown to prevent invalid results, eg.
Definition: TileCalorimeter/TileCalib/TileCalibBlobObjs/TileCalibBlobObjs/Exception.h:224
TileRawChannelUnit::OnlineMegaElectronVolts
@ OnlineMegaElectronVolts
Definition: TileRawChannelUnit.h:24
TileEmscaleCalibOptions::OflLasPart
@ OflLasPart
Definition: TileEmscaleCalibOptions.h:32