CMS 3D CMS Logo

CastorChannelCoder.cc
Go to the documentation of this file.
1 
7 #include <iostream>
8 
11 
12 CastorChannelCoder::CastorChannelCoder(const float fOffset[16], const float fSlope[16]) { // [CapId][Range]
13  for (int range = 0; range < 4; range++) {
14  for (int capId = 0; capId < 4; capId++) {
15  mOffset[capId][range] = fOffset[index(capId, range)];
16  mSlope[capId][range] = fSlope[index(capId, range)];
17  }
18  }
19 }
20 
21 double CastorChannelCoder::charge(const reco::castor::QieShape& fShape, int fAdc, int fCapId) const {
22  int range = (fAdc >> 6) & 0x3;
23  double charge = fShape.linearization(fAdc) / mSlope[fCapId][range] + mOffset[fCapId][range];
24  // std::cout << "CastorChannelCoder::charge-> " << fAdc << '/' << fCapId
25  // << " result: " << charge << std::endl;
26  return charge;
27 }
28 
29 int CastorChannelCoder::adc(const reco::castor::QieShape& fShape, double fCharge, int fCapId) const {
30  int adc = -1; //nothing found yet
31  // search for the range
32  for (int range = 0; range < 4; range++) {
33  double qieCharge = (fCharge - mOffset[fCapId][range]) * mSlope[fCapId][range];
34  double qieChargeMax = fShape.linearization(32 * range + 31) + 0.5 * fShape.binSize(32 * range + 31);
35  if (range == 3 && qieCharge > qieChargeMax)
36  adc = 127; // overflow
37  if (qieCharge > qieChargeMax)
38  continue; // next range
39  for (int bin = 32 * range; bin < 32 * (range + 1); bin++) {
40  if (qieCharge < fShape.linearization(bin) + 0.5 * fShape.binSize(bin)) {
41  adc = bin;
42  break;
43  }
44  }
45  if (adc >= 0)
46  break; // found
47  }
48  if (adc < 0)
49  adc = 0; // underflow
50 
51  // std::cout << "CastorChannelCoder::adc-> " << fCharge << '/' << fCapId
52  // << " result: " << adc << std::endl;
53  return adc;
54 }
CastorChannelCoder(const float fOffset[16], const float fSlope[16])
double charge(const reco::castor::QieShape &fShape, int fAdc, int fCapId) const
ADC[0..127]+capid[0..3]->fC conversion.
double binSize(int fAdc) const
Definition: QieShape.h:19
int index(int fCapId, int Range)
int adc(const reco::castor::QieShape &fShape, double fCharge, int fCapId) const
fC + capid[0..3] -> ADC conversion
double linearization(int fAdc) const
Definition: QieShape.h:17