File indexing completed on 2024-04-06 12:02:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <iostream>
0011
0012 #include "CondFormats/HcalObjects/interface/HcalQIEShape.h"
0013 #include "CondFormats/HcalObjects/interface/HcalQIECoder.h"
0014
0015 namespace {
0016
0017 inline unsigned index(unsigned fRange, unsigned fCapId) { return fCapId * 4 + fRange; }
0018 }
0019
0020 float HcalQIECoder::charge(const HcalQIEShape& fShape, unsigned fAdc, unsigned fCapId) const {
0021 unsigned range = fShape.range(fAdc);
0022 return (fShape.center(fAdc) - offset(fCapId, range)) / slope(fCapId, range);
0023 }
0024
0025 unsigned HcalQIECoder::adc(const HcalQIEShape& fShape, float fCharge, unsigned fCapId) const {
0026
0027 for (unsigned range = 0; range < 4; range++) {
0028 float qieCharge = fCharge * slope(fCapId, range) + offset(fCapId, range);
0029 unsigned nbin = fShape.nbins();
0030 unsigned minBin = nbin * range;
0031 unsigned maxBin = minBin + nbin - 1;
0032 float qieChargeMax = fShape.highEdge(maxBin);
0033 if (qieCharge <= qieChargeMax) {
0034 for (unsigned bin = minBin; bin <= maxBin; bin++) {
0035 if (qieCharge < fShape.highEdge(bin)) {
0036 return bin;
0037 }
0038 }
0039 return minBin;
0040 } else if (range == 3) {
0041 return (4 * nbin - 1);
0042 }
0043 }
0044 return 0;
0045 }
0046
0047 float HcalQIECoder::offset(unsigned fCapId, unsigned fRange) const { return *((&mOffset00) + index(fRange, fCapId)); }
0048
0049 float HcalQIECoder::slope(unsigned fCapId, unsigned fRange) const { return *((&mSlope00) + index(fRange, fCapId)); }
0050
0051 void HcalQIECoder::setOffset(unsigned fCapId, unsigned fRange, float fValue) {
0052 if (fCapId < 4U && fRange < 4U) {
0053 *((&mOffset00) + index(fRange, fCapId)) = fValue;
0054 } else {
0055 std::cerr << "HcalQIECoder::setOffset-> Wrong parameters capid/range: " << fCapId << '/' << fRange << std::endl;
0056 }
0057 }
0058
0059 void HcalQIECoder::setSlope(unsigned fCapId, unsigned fRange, float fValue) {
0060 if (fCapId < 4U && fRange < 4U) {
0061 *((&mSlope00) + index(fRange, fCapId)) = fValue;
0062 } else {
0063 std::cerr << "HcalQIECoder::setSlope-> Wrong parameters capid/range: " << fCapId << '/' << fRange << std::endl;
0064 }
0065 }