CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
31  int adc = -1; //nothing found yet
32  // search for the range
33  for (int range = 0; range < 4; range++) {
34  double qieCharge = (fCharge - mOffset [fCapId][range]) * mSlope [fCapId][range];
35  double qieChargeMax = fShape.linearization (32*range+31) + 0.5 * fShape.binSize (32*range+31);
36  if (range == 3 && qieCharge > qieChargeMax) adc = 127; // overflow
37  if (qieCharge > qieChargeMax) continue; // next range
38  for (int bin = 32*range; bin < 32*(range+1); bin++) {
39  if (qieCharge < fShape.linearization (bin) + 0.5 * fShape.binSize (bin)) {
40  adc = bin;
41  break;
42  }
43  }
44  if (adc >= 0) break; // found
45  }
46  if (adc < 0) adc = 0; // underflow
47 
48  // std::cout << "CastorChannelCoder::adc-> " << fCharge << '/' << fCapId
49  // << " result: " << adc << std::endl;
50  return adc;
51 }
52 
double linearization(int fAdc) const
Definition: QieShape.h:17
CastorChannelCoder(const float fOffset[16], const float fSlope[16])
int adc(const reco::castor::QieShape &fShape, double fCharge, int fCapId) const
fC + capid[0..3] -&gt; ADC conversion
double charge(const reco::castor::QieShape &fShape, int fAdc, int fCapId) const
ADC[0..127]+capid[0..3]-&gt;fC conversion.
double binSize(int fAdc) const
Definition: QieShape.h:19
int index(int fCapId, int Range)