Belle II Software  release-05-01-25
CDCDedx2DCell.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Jake Bennett, Jitendra *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #pragma once
12 
13 #include <framework/logging/Logger.h>
14 
15 #include <TObject.h>
16 #include <TH2F.h>
17 
18 namespace Belle2 {
28  class CDCDedx2DCell: public TObject {
29 
30  public:
31 
36 
40  CDCDedx2DCell(short version, const std::vector<TH2F>& twodgains): m_version(version), m_twodgains(twodgains) {};
41 
45  ~CDCDedx2DCell() {};
46 
51  {
52  if (m_version != rhs.getVersion()) {
53  B2WARNING("2D cell gain parameters do not match, cannot merge!");
54  return *this;
55  }
56  for (unsigned int layer = 0; layer < getSize(); ++layer) {
57  const TH2F* newhist = rhs.getHist(layer);
58  if (newhist->GetEntries() > 0)m_twodgains[layer].Multiply(newhist);
59  else B2ERROR("ERROR! constant histograms is empty");
60  }
61  return *this;
62  }
63 
66  short getVersion() const {return m_version; };
67 
70  unsigned int getSize() const { return m_twodgains.size(); };
71 
74  const TH2F* getHist(int layer) const
75  {
76  if (m_twodgains.size() == 0) {
77  B2ERROR("ERROR!");
78  return NULL;
79  }
80 
81  if (m_twodgains.size() == 2) {
82  if (layer == 0) return &m_twodgains[0];
83  else if (layer == 1) return &m_twodgains[1];
84  else {
85  B2ERROR("ERROR! const histograms NOT found");
86  return NULL;
87  }
88  } else if (m_twodgains.size() == 56) {
89  return &m_twodgains[layer];
90  } else {
91  B2ERROR("ERROR! Something is wrong # of const histograms");
92  return NULL;
93  }
94  return NULL;
95  }
96 
102  double getMean(unsigned int layer, int dbin, int ebin) const
103  {
104  int mylayer = 0;
105  if (layer >= 8 && m_twodgains.size() == 2) mylayer = 1;
106  else if (m_twodgains.size() == 56) mylayer = layer;
107 
108  return m_twodgains[mylayer].GetBinContent(dbin, ebin);
109  }
110 
116  double getMean(unsigned int layer, double doca, double enta) const
117  {
118  if (layer > 56) {
119  B2ERROR("Asking for a CDC layer beyond 56!");
120  return 0;
121  }
122 
123  int mylayer = 0;
124  if (layer >= 8 && m_twodgains.size() == 2) mylayer = 1;
125  else if (m_twodgains.size() == 56) mylayer = layer;
126 
127  // assume rotational symmetry
128  if (enta < -3.1416 / 2.0) enta += 3.1416 / 2.0;
129  if (enta > 3.1416 / 2.0) enta -= 3.1416 / 2.0;
130 
131  // iterate bin number by one since TH2F bins start at 1 not 0
132  double dbinsize = m_twodgains[mylayer].GetXaxis()->GetBinCenter(2) - m_twodgains[mylayer].GetXaxis()->GetBinCenter(1);
133  int dbin = std::floor((doca - m_twodgains[mylayer].GetXaxis()->GetBinLowEdge(1)) / dbinsize) + 1;
134 
135  double ebinsize = m_twodgains[mylayer].GetYaxis()->GetBinCenter(2) - m_twodgains[mylayer].GetYaxis()->GetBinCenter(1);
136  // int ebin = std::floor((std::sin(enta) - m_twodgains[mylayer].GetYaxis()->GetBinLowEdge(1)) / ebinsize) + 1;
137  int ebin = std::floor((enta - m_twodgains[mylayer].GetYaxis()->GetBinLowEdge(1)) / ebinsize) + 1;
138 
139  double mean = 1.0;
140  if (dbin > 0 && dbin <= m_twodgains[mylayer].GetNbinsX() && ebin > 0 && ebin <= m_twodgains[mylayer].GetNbinsY())
141  mean = m_twodgains[mylayer].GetBinContent(dbin, ebin);
142  else if (dbin > m_twodgains[mylayer].GetNbinsX() && ebin > 0 && ebin <= m_twodgains[mylayer].GetNbinsY())
143  mean = m_twodgains[mylayer].GetBinContent(m_twodgains[mylayer].GetNbinsX(), ebin);
144  else
145  // B2WARNING("Problem with 2D CDC dE/dx calibration! " << doca << "\t" << dbin << "\t" << std::sin(enta) << "\t" << ebin);
146  B2WARNING("Problem with 2D CDC dE/dx calibration! " << doca << "\t" << dbin << "\t" << enta << "\t" << ebin);
147 
148  return mean;
149  };
150 
151  private:
155  short m_version;
156  std::vector<TH2F> m_twodgains;
158  ClassDef(CDCDedx2DCell, 5);
159  };
161 } // end namespace Belle2
Belle2::CDCDedx2DCell::operator*=
CDCDedx2DCell & operator*=(CDCDedx2DCell const &rhs)
Combine payloads.
Definition: CDCDedx2DCell.h:58
Belle2::CDCDedx2DCell::getSize
unsigned int getSize() const
Get the number of histograms for the 2D correction.
Definition: CDCDedx2DCell.h:78
Belle2::CDCDedx2DCell::CDCDedx2DCell
CDCDedx2DCell()
Default constructor.
Definition: CDCDedx2DCell.h:43
Belle2::CDCDedx2DCell::getMean
double getMean(unsigned int layer, int dbin, int ebin) const
Return dE/dx mean value for the given bin.
Definition: CDCDedx2DCell.h:110
Belle2::CDCDedx2DCell::m_version
short m_version
dE/dx gains versus DOCA and entrance angle may be different for different layers, so store as a vecto...
Definition: CDCDedx2DCell.h:157
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::CDCDedx2DCell::ClassDef
ClassDef(CDCDedx2DCell, 5)
ClassDef.
Belle2::CDCDedx2DCell::~CDCDedx2DCell
~CDCDedx2DCell()
Destructor.
Definition: CDCDedx2DCell.h:53
Belle2::CDCDedx2DCell
dE/dx wire gain calibration constants
Definition: CDCDedx2DCell.h:36
Belle2::CDCDedx2DCell::getVersion
short getVersion() const
Get the version for the 2D correction.
Definition: CDCDedx2DCell.h:74
Belle2::CDCDedx2DCell::getHist
const TH2F * getHist(int layer) const
Get the 2D histogram for the correction for this layer.
Definition: CDCDedx2DCell.h:82
Belle2::CDCDedx2DCell::m_twodgains
std::vector< TH2F > m_twodgains
2D histograms of doca/enta gains, layer dependent
Definition: CDCDedx2DCell.h:164