12 #include <klm/muid/MuidBuilder.h>
15 #include <klm/dataobjects/KLMMuidLikelihood.h>
18 #include <framework/logging/Logger.h>
30 for (
unsigned int layer = 0;
55 if (hypothesis == MuidElementNumbers::c_NotValid)
56 B2FATAL(
"The particle associated to the PDG code " << pdg <<
" is not supported.");
60 B2FATAL(
"Invalid PDFs for PDG code " << pdg);
74 for (
unsigned int layer = 0; layer < layerPDF.size(); ++layer) {
75 m_LayerPDF[outcome][lastLayer][layer] = layerPDF[layer];
88 std::vector<double> reducedChiSquaredPDF =
m_LikelihoodParameters->getTransversePDF(hypothesis, detector, halfNdof * 2);
90 B2ERROR(
"TransversePDF vector for hypothesis " << hypothesis <<
" detector " << detector
115 C[1] = (Y[1] - Y[0]) / dx;
116 for (
int i = 1; i < n - 1; i++) {
119 C[i + 1] = (Y[i + 1] - Y[i]) / dx;
120 C[i] = C[i + 1] - C[i];
124 C[0] = (C[2] - C[1]) / 6.0;
125 C[n - 1] = -(C[n - 2] - C[n - 3]) / 6.0;
126 for (
int i = 1; i < n; i++) {
127 double temp = dx / B[i - 1];
129 C[i] -= temp * C[i - 1];
131 C[n - 1] /= B[n - 1];
132 for (
int i = n - 2; i >= 0; i--) {
133 C[i] = (C[i] - D[i] * C[i + 1]) / B[i];
135 B[n - 1] = (Y[n - 1] - Y[n - 2]) / dx + (C[n - 2] + C[n - 1] * 2.0) * dx;
136 for (
int i = 0; i < n - 1; i++) {
137 B[i] = (Y[i + 1] - Y[i]) / dx - (C[i + 1] + C[i] * 2.0) * dx;
138 D[i] = (C[i + 1] - C[i]) / dx;
141 C[n - 1] = C[n - 1] * 3.0;
153 unsigned int outcome = muid->getOutcome();
156 int barrelExtLayer = muid->getBarrelExtLayer();
159 int endcapExtLayer = muid->getEndcapExtLayer();
162 unsigned int extLayerPattern = muid->getExtLayerPattern();
163 unsigned int hitLayerPattern = muid->getHitLayerPattern();
164 int lastLayer = (endcapExtLayer < 0) ? barrelExtLayer : endcapExtLayer;
168 unsigned int testBit = 1;
169 for (
int layer = 0; layer <= barrelExtLayer; ++layer) {
170 if ((testBit & extLayerPattern) != 0) {
171 if ((testBit & hitLayerPattern) != 0) {
174 if (((layer == 0) && (outcome < MuidElementNumbers::c_CrossBarrelStopInForwardMin))
176 pdf *= 1 -
m_LayerPDF[outcome][lastLayer][layer] * muid->getExtBKLMEfficiencyValue(layer);
186 for (
int layer = 0; layer <= endcapExtLayer; ++layer) {
187 if ((testBit & extLayerPattern) != 0) {
188 if ((testBit & hitLayerPattern) != 0) {
191 if ((layer == 0) || (layer == maxLayer) || (layer < endcapExtLayer)) {
193 muid->getExtEKLMEfficiencyValue(layer);
205 int ndof = muid->getDegreesOfFreedom();
208 double chiSquared = muid->getChiSquared();
209 if (chiSquared < 0.0)
211 int halfNdof = (ndof >> 1);
212 double x = chiSquared / ndof;
215 int detector = MuidElementNumbers::c_Both;
216 if (muid->getEndcapExtLayer() < 0) {
217 detector = MuidElementNumbers::c_OnlyBarrel;
218 }
else if (muid->getBarrelExtLayer() < 0) {
219 detector = MuidElementNumbers::c_OnlyEndcap;
233 }
else if (halfNdof == 2) {
235 }
else if (halfNdof == 3) {
248 pdf = std::exp(logPdf);