Belle II Software development
CDCDedx2DCell.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 <TH2F.h>
15
16namespace Belle2 {
26 class CDCDedx2DCell: public TObject {
27
28 public:
29
34
38 CDCDedx2DCell(short version, const std::vector<TH2F>& twodgains): m_version(version), m_twodgains(twodgains) {};
39
44
49 {
50 if (m_version != rhs.getVersion()) {
51 B2WARNING("2D cell gain parameters do not match, cannot merge!");
52 return *this;
53 }
54 for (unsigned int layer = 0; layer < getSize(); ++layer) {
55 const TH2F* newhist = rhs.getHist(layer);
56 if (newhist->GetEntries() > 0)m_twodgains[layer].Multiply(newhist);
57 else B2ERROR("ERROR! constant histograms is empty");
58 }
59 return *this;
60 }
61
64 short getVersion() const {return m_version; };
65
68 unsigned int getSize() const { return m_twodgains.size(); };
69
72 const TH2F* getHist(unsigned int layer) const
73 {
74 if (m_twodgains.size() == 0) {
75 B2ERROR("CDCDedx2DCell: vector too short");
76 return nullptr;
77 }
78
79 if (m_twodgains.size() == 2) {
80 if (layer == 0) return &m_twodgains[0];
81 else if (layer == 1) return &m_twodgains[1];
82 else {
83 B2ERROR("CDCDedx2DCell: const histograms NOT found");
84 return nullptr;
85 }
86 } else if (m_twodgains.size() == 56) {
87 if (layer < m_twodgains.size()) return &m_twodgains[layer];
88 } else {
89 B2ERROR("CDCDedx2DCell: Something is wrong # of const histograms");
90 return nullptr;
91 }
92 B2ERROR("CDCDedx2DCell: wrong layer number");
93 return nullptr;
94 }
95
101 double getMean(unsigned int layer, int dbin, int ebin) const
102 {
103 unsigned int mylayer = 0;
104 if (layer >= 8 && m_twodgains.size() == 2) mylayer = 1;
105 else if (m_twodgains.size() == 56) mylayer = layer;
106
107 if (mylayer < m_twodgains.size()) return m_twodgains[mylayer].GetBinContent(dbin, ebin);
108
109 B2ERROR("CDCDedx2DCell: wrong layer number, returning 1");
110 return 1.0;
111 }
112
118 double getMean(unsigned int layer, double doca, double enta) const
119 {
120 if (layer > 56) {
121 B2ERROR("Asking for a CDC layer beyond 56!");
122 return 0;
123 }
124
125 unsigned int mylayer = 0;
126 if (layer >= 8 && m_twodgains.size() == 2) mylayer = 1;
127 else if (m_twodgains.size() == 56) mylayer = layer;
128
129 if (mylayer >= m_twodgains.size()) {
130 B2ERROR("CDCDedx2DCell: wrong layer number, returning 1");
131 return 1.0;
132 }
133
134 // assume rotational symmetry
135 if (enta < -3.1416 / 2.0) enta += 3.1416 / 2.0;
136 if (enta > 3.1416 / 2.0) enta -= 3.1416 / 2.0;
137
138 // iterate bin number by one since TH2F bins start at 1 not 0
139 double dbinsize = m_twodgains[mylayer].GetXaxis()->GetBinCenter(2) - m_twodgains[mylayer].GetXaxis()->GetBinCenter(1);
140 int dbin = std::floor((doca - m_twodgains[mylayer].GetXaxis()->GetBinLowEdge(1)) / dbinsize) + 1;
141
142 double ebinsize = m_twodgains[mylayer].GetYaxis()->GetBinCenter(2) - m_twodgains[mylayer].GetYaxis()->GetBinCenter(1);
143 // int ebin = std::floor((std::sin(enta) - m_twodgains[mylayer].GetYaxis()->GetBinLowEdge(1)) / ebinsize) + 1;
144 int ebin = std::floor((enta - m_twodgains[mylayer].GetYaxis()->GetBinLowEdge(1)) / ebinsize) + 1;
145
146 double mean = 1.0;
147 if (dbin > 0 && dbin <= m_twodgains[mylayer].GetNbinsX() && ebin > 0 && ebin <= m_twodgains[mylayer].GetNbinsY())
148 mean = m_twodgains[mylayer].GetBinContent(dbin, ebin);
149 else if (dbin > m_twodgains[mylayer].GetNbinsX() && ebin > 0 && ebin <= m_twodgains[mylayer].GetNbinsY())
150 mean = m_twodgains[mylayer].GetBinContent(m_twodgains[mylayer].GetNbinsX(), ebin);
151 else
152 // B2WARNING("Problem with 2D CDC dE/dx calibration! " << doca << "\t" << dbin << "\t" << std::sin(enta) << "\t" << ebin);
153 B2WARNING("Problem with 2D CDC dE/dx calibration! " << doca << "\t" << dbin << "\t" << enta << "\t" << ebin);
154
155 return mean;
156 };
157
158 private:
162 short m_version;
163 std::vector<TH2F> m_twodgains;
166 };
168} // end namespace Belle2
dE/dx wire gain calibration constants
Definition: CDCDedx2DCell.h:26
const TH2F * getHist(unsigned int layer) const
Get the 2D histogram for the correction for this layer.
Definition: CDCDedx2DCell.h:72
short m_version
dE/dx gains versus DOCA and entrance angle may be different for different layers, so store as a vecto...
double getMean(unsigned int layer, double doca, double enta) const
Return dE/dx mean value for given DOCA and entrance angle.
ClassDef(CDCDedx2DCell, 5)
ClassDef.
CDCDedx2DCell()
Default constructor.
Definition: CDCDedx2DCell.h:33
~CDCDedx2DCell()
Destructor.
Definition: CDCDedx2DCell.h:43
CDCDedx2DCell & operator*=(CDCDedx2DCell const &rhs)
Combine payloads.
Definition: CDCDedx2DCell.h:48
std::vector< TH2F > m_twodgains
2D histograms of doca/enta gains, layer dependent
CDCDedx2DCell(short version, const std::vector< TH2F > &twodgains)
Constructor.
Definition: CDCDedx2DCell.h:38
double getMean(unsigned int layer, int dbin, int ebin) const
Return dE/dx mean value for the given bin.
short getVersion() const
Get the version for the 2D correction.
Definition: CDCDedx2DCell.h:64
unsigned int getSize() const
Get the number of histograms for the 2D correction.
Definition: CDCDedx2DCell.h:68
Abstract base class for different kinds of events.