Belle II Software development
CDCDedxHadronCor.cc
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#include <cdc/dbobjects/CDCDedxHadronCor.h>
10#include <framework/logging/Logger.h>
11#include <cmath>
12
13namespace Belle2 {
19 double CDCDedxHadronCor::D2I(double cosTheta, double D) const
20 {
21 const auto& params = m_hadronpars;
22 if (params.size() < 5) {
23 B2WARNING("Vector of dE/dx hadron constants too short!");
24 return D;
25 }
26
27 double projection = std::pow(std::abs(cosTheta), params[3]) + params[2];
28 if (projection == 0) {
29 B2WARNING("Something wrong with dE/dx hadron constants!");
30 return D;
31 }
32
33 double chargeDensity = D / projection;
34 double numerator = 1 + params[0] * chargeDensity;
35 double denominator = 1 + params[1] * chargeDensity;
36
37 if (denominator == 0) {
38 B2WARNING("Something wrong with dE/dx hadron constants!");
39 return D;
40 }
41
42 double I = D * params[4] * numerator / denominator;
43 return I;
44 }
45
46
47 double CDCDedxHadronCor::I2D(double cosTheta, double I) const
48 {
49 const auto& params = m_hadronpars;
50 if (params.size() < 5) {
51 B2WARNING("Vector of dE/dx hadron constants too short!");
52 return I;
53 }
54
55 double projection = std::pow(std::abs(cosTheta), params[3]) + params[2];
56 if (projection == 0 or params[4] == 0) {
57 B2WARNING("Something wrong with dE/dx hadron constants!");
58 return I;
59 }
60
61 double a = params[0] / projection;
62 double b = 1 - params[1] / projection * (I / params[4]);
63 double c = -1.0 * I / params[4];
64
65 if (b == 0 and a == 0) {
66 B2WARNING("both a and b coefficiants for hadron correction are 0");
67 return I;
68 }
69
70 double discr = b * b - 4.0 * a * c;
71 if (discr < 0) {
72 B2WARNING("negative discriminant; return uncorrectecd value");
73 return I;
74 }
75
76 double D = (a != 0) ? (-b + std::sqrt(discr)) / (2.0 * a) : -c / b;
77 if (D < 0) {
78 D = (a != 0) ? (-b - std::sqrt(discr)) / (2.0 * a) : -c / b;
79 if (D < 0) {
80 B2WARNING("D is less than 0; return uncorrectecd value");
81 return I;
82 }
83 }
84
85 return D;
86 }
87
89}
std::vector< double > m_hadronpars
dE/dx hadron correction parameters
double I2D(double cosTheta, double I) const
hadron saturation parameterization part 1
double D2I(double cosTheta, double D) const
hadron saturation parameterization part 2
Abstract base class for different kinds of events.