Belle II Software  release-08-01-10
CDCDedx1DCell.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 
11 #include <framework/logging/Logger.h>
12 
13 #include <TObject.h>
14 #include <cmath>
15 #include <TMath.h>
16 
17 namespace Belle2 {
27  class CDCDedx1DCell: public TObject {
28 
29  public:
30 
35 
39  CDCDedx1DCell(short version, const std::vector<std::vector<double>>& onedgains): m_version(version), m_onedgains(onedgains) {};
40 
45 
50  {
51  if (m_version != rhs.getVersion()) {
52  B2WARNING("1D cell gain parameters do not match, cannot merge!");
53  return *this;
54  }
55  for (unsigned int layer = 0; layer < getSize(); ++layer) {
56  double tempLayer = -1; //out of bound layer
57  if (getSize() == 2)tempLayer = layer * 20; // 20 to make <8 and >=8 difference
58  else if (getSize() == 56)tempLayer = layer;
59  else B2ERROR("ERROR! Wrong # of constants vector array");
60  for (unsigned int bin = 0; bin < getNBins(layer); ++bin) {
61  m_onedgains[layer][bin] *= rhs.getMean(tempLayer, bin);
62  }
63  }
64  return *this;
65  }
66 
69  short getVersion() const { return m_version; };
70 
73  unsigned int getSize() const { return m_onedgains.size(); };
74 
77  unsigned int getNBins(unsigned int layer) const
78  {
79  if (m_onedgains.size() == 0) {
80  B2ERROR("ERROR!");
81  return 0;
82  }
83 
84  if (m_onedgains.size() == 2) {
85  if (layer == 0) return m_onedgains[0].size();
86  else if (layer == 1) return m_onedgains[1].size();
87  else {
88  B2ERROR("ERROR! const vector not found");
89  return 0;
90  }
91  } else if (m_onedgains.size() == 56) {
92  return m_onedgains[layer].size();
93  } else {
94  B2ERROR("ERROR! Wrong # of constants vector array: getNBins()");
95  return 0;
96  }
97  return 0;
98  };
99 
104  double getMean(unsigned int layer, unsigned int bin) const
105  {
106  int mylayer = 0;
107  if (layer >= 8 && m_onedgains.size() == 2) mylayer = 1;
108  else if (m_onedgains.size() == 56) mylayer = layer;
109 
110  if (bin < m_onedgains[mylayer].size())
111  return m_onedgains[mylayer][bin];
112  else return 1.0;
113  };
114 
120  void setMean(unsigned int layer, unsigned int bin, double value)
121  {
122  int mylayer = 0;
123  if (layer >= 8 && m_onedgains.size() == 2) mylayer = 1;
124  else if (m_onedgains.size() == 56) mylayer = layer;
125 
126  if (bin < m_onedgains[mylayer].size()) m_onedgains[mylayer][bin] = value;
127  else m_onedgains[mylayer][bin] = 1.0;
128  };
129 
134  double getMean(unsigned int layer, double enta) const
135  {
136  if (layer > 56) {
137  B2ERROR("No such layer!");
138  return 0;
139  }
140 
141  int mylayer = 0;
142  if (layer >= 8 && m_onedgains.size() == 2) mylayer = 1;
143  else if (m_onedgains.size() == 56) mylayer = layer;
144 
145  double piby2 = TMath::Pi() / 2.0;
146  // assume rotational symmetry
147  if (enta < -piby2) enta += piby2;
148  if (enta > piby2) enta -= piby2;
149 
150  double binsize = (m_onedgains[mylayer].size() != 0) ? 2.0 * piby2 / m_onedgains[mylayer].size() : 0.0;
151  int bin = (binsize != 0.0) ? std::floor((enta + piby2) / binsize) : -1;
152  if (bin < 0 || (unsigned)bin >= m_onedgains[mylayer].size()) {
153  B2WARNING("Problem with CDC dE/dx 1D binning!");
154  return 1.0;
155  }
156 
157  return m_onedgains[mylayer][bin];
158  };
159 
160  private:
164  short m_version;
165  std::vector<std::vector<double>> m_onedgains;
168  };
170 } // end namespace Belle2
dE/dx wire gain calibration constants
Definition: CDCDedx1DCell.h:27
ClassDef(CDCDedx1DCell, 5)
ClassDef.
short m_version
dE/dx cleanup correction versus entrance angle may be different for different layers,...
double getMean(unsigned int layer, unsigned int bin) const
Return dE/dx mean value for the given bin.
double getMean(unsigned int layer, double enta) const
Return dE/dx mean value for given entrance angle.
~CDCDedx1DCell()
Destructor.
Definition: CDCDedx1DCell.h:44
std::vector< std::vector< double > > m_onedgains
dE/dx means in entrance angle bins
void setMean(unsigned int layer, unsigned int bin, double value)
Reset dE/dx mean value for the given bin.
CDCDedx1DCell & operator*=(CDCDedx1DCell const &rhs)
Combine payloads.
Definition: CDCDedx1DCell.h:49
CDCDedx1DCell()
Default constructor.
Definition: CDCDedx1DCell.h:34
unsigned int getNBins(unsigned int layer) const
Get the number of bins for the entrance angle correction.
Definition: CDCDedx1DCell.h:77
CDCDedx1DCell(short version, const std::vector< std::vector< double >> &onedgains)
Constructor.
Definition: CDCDedx1DCell.h:39
short getVersion() const
Get the version for the 1D cleanup.
Definition: CDCDedx1DCell.h:69
unsigned int getSize() const
Get the number of bins for the entrance angle correction.
Definition: CDCDedx1DCell.h:73
Abstract base class for different kinds of events.