Return dE/dx mean value for given DOCA and entrance angle.
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
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
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
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
153 B2WARNING("Problem with 2D CDC dE/dx calibration! " << doca << "\t" << dbin << "\t" << enta << "\t" << ebin);
154
155 return mean;
156 };