Belle II Software  release-08-01-10
CDCDedxADCNonLinearity.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 #include <TObject.h>
11 #include <vector>
12 #include <cmath>
13 #include <framework/logging/Logger.h>
14 #include <iostream>
15 
16 namespace Belle2 {
29  class CDCDedxADCNonLinearity: public TObject {
30  public:
31 
36 
40  explicit CDCDedxADCNonLinearity(const std::vector<std::vector<double>>& nonlinearity): m_nonlADC(nonlinearity) {};
41 
46 
52  unsigned int getSize(int layer, int axis) const
53  {
54 
55  int mylayer = 0;
56  if (layer < 0 || layer > 55) {
57  B2ERROR("CDCDedxADCNonLinearity:CDC layer out of range, choose between 0-55");
58  return 0;
59  } else {
60  if (layer >= 8) mylayer = 2;
61  }
62 
63  if (axis < 0 || axis > 1) {
64  B2ERROR("CDCDedxADCNonLinearity:Problem with X/Y axis: choose 0/1 for X/Y");
65  return 0;
66  } else {
67  mylayer = mylayer + axis;
68  }
69 
70  return m_nonlADC[mylayer].size();
71  };
72 
73 
78  double getCorrectedADC(const double& ADC, const int layer)const
79  {
80 
81  int mylayer = 0;
82  if (layer < 0 || layer > 55) {
83  B2WARNING("CDCDedxADCNonLinearity:returning uncorrected ADC as input layer is out of range: must be 0-55");
84  return ADC;
85  } else {
86  if (layer >= 8) mylayer = 2;
87  }
88 
89  std::vector<double> tempX = m_nonlADC[mylayer];//inner or outer X array
90  std::vector<double> tempY = m_nonlADC[mylayer + 1];//inner or outer Y array
91 
92  if (tempX.size() != tempY.size()) {
93  B2WARNING("CDCDedxADCNonLinearity:returning uncorrected ADC as parameters range don't match: X=Y in bins");
94  return ADC;
95  }
96 
97  //Find bin for ADC correction
98  unsigned int ibin = TMath::BinarySearch(tempY.size(), tempY.data(), double(ADC));
99 
100  if (ibin >= tempY.size() - 1)ibin = tempY.size() - 2; //overflow to last bin
101  if (ibin >= tempY.size() - 1) {
102  B2WARNING("CDCDedxADCNonLinearity:returning uncorrected ADC as bins are not in range");
103  return ADC;
104  }
105 
106  double slope = (tempY[ibin + 1] - tempY[ibin]) / (tempX[ibin + 1] - tempX[ibin]);
107  return std::round(tempX[ibin] + (ADC - tempY[ibin]) / slope);
108  }
109 
115  double getNonLinearityPar(int layer, int axis, unsigned int par) const
116  {
117 
118  int mylayer = 0;
119  if (layer < 0 || layer > 55) {
120  B2ERROR("CDCDedxADCNonLinearity:CDC layer out of range, choose between 0-55");
121  return -99.0;
122  } else {
123  if (layer >= 8) mylayer = 2;
124  }
125 
126  if (axis < 0 || axis > 1) {
127  B2ERROR("CDCDedxADCNonLinearity:Problem with X/Y axis: choose 0/1 for X/Y");
128  return -99.0;
129  } else {
130  mylayer = mylayer + axis;
131  }
132 
133  if (par >= m_nonlADC[mylayer].size()) {
134  B2ERROR("CDCDedxADCNonLinearity:Problem with par index: choose 0 and " << m_nonlADC[mylayer].size()); //
135  return -99.0;
136  }
137 
138  return m_nonlADC[mylayer][par];
139  };
140 
145  void printNonLinearityPars(int layer, int axis) const
146  {
147 
148  int mylayer = 0;
149  if (layer < 0 || layer > 55) {
150  B2ERROR("CDCDedxADCNonLinearity:CDC layer out of range, choose between 0-55");
151  return;
152  } else {
153  if (layer >= 8) mylayer = 2;
154  }
155 
156  if (axis < 0 || axis > 1) {
157  B2ERROR("CDCDedxADCNonLinearity:Problem with X/Y axis: choose 0/1 for X/Y");
158  return;
159  } else {
160  mylayer = mylayer + axis;
161  }
162 
163  B2INFO("Printing parameters for layer: " << layer << ", axis: " << axis << ", nPars:" << m_nonlADC[mylayer].size());
164  for (unsigned int iPar = 0; iPar < m_nonlADC[mylayer].size(); iPar++)
165  std::cout << "Par # " << iPar << ": " << m_nonlADC[mylayer][iPar] << std::endl;
166 
167  };
168 
175  void setNonLinearityPar(unsigned int layer, unsigned int axis, unsigned int par, double value)
176  {
177  int mylayer = 0;
178  if (layer > 55) {
179  B2ERROR("CDCDedxADCNonLinearity:CDC layer out of range, choose between 0-55");
180  return;
181  } else {
182  if (layer >= 8) mylayer = 2;
183  }
184 
185  if (axis > 1) {
186  B2ERROR("CDCDedxADCNonLinearity:Problem with X/Y axis: choose 0/1 for X/Y");
187  return;
188  } else {
189  mylayer = mylayer + axis;
190  }
191 
192  if (par >= m_nonlADC[mylayer].size()) {
193  B2ERROR("CDCDedxADCNonLinearity:Problem with par index: choose 0 and " << m_nonlADC[mylayer].size()); //
194  }
195 
196  //here set parameter to requested value
197  m_nonlADC[mylayer][par] = value;
198 
199  };
200 
201 
202  private:
203  std::vector<std::vector<double>> m_nonlADC;
205  };
207 } // end namespace Belle2
dE/dx eletronic ADC non-linearity correction for highly ionising particles (used in offline hadron sa...
double getCorrectedADC(const double &ADC, const int layer) const
Return corrected ADC with given parameters.
ClassDef(CDCDedxADCNonLinearity, 1)
ClassDef.
CDCDedxADCNonLinearity(const std::vector< std::vector< double >> &nonlinearity)
Constructor.
std::vector< std::vector< double > > m_nonlADC
ADC vs corrected ADC mapping.
double getNonLinearityPar(int layer, int axis, unsigned int par) const
return specific hadron parameter
void setNonLinearityPar(unsigned int layer, unsigned int axis, unsigned int par, double value)
set specific hadron parameter
void printNonLinearityPars(int layer, int axis) const
print requested hadron parameter array
CDCDedxADCNonLinearity()
Default constructor.
unsigned int getSize(int layer, int axis) const
Get the number of bins for the non-linearity angle correction.
Abstract base class for different kinds of events.