Belle II Software development
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
17namespace 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,...
CDCDedx1DCell(short version, const std::vector< std::vector< double > > &onedgains)
Constructor.
Definition: CDCDedx1DCell.h:39
double getMean(unsigned int layer, unsigned int bin) const
Return dE/dx mean value for the given bin.
CDCDedx1DCell & operator*=(CDCDedx1DCell const &rhs)
Combine payloads.
Definition: CDCDedx1DCell.h:49
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()
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
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.