Bug Summary

File:analysis/OrcaKinFit/src/BaseHardConstraint.cc
Warning:line 170, column 17
Assigned value is uninitialized

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -O3 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name BaseHardConstraint.cc -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/data/b2soft/buildbot/development/build -fcoverage-compilation-dir=/data/b2soft/buildbot/development/build -resource-dir /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/lib/clang/21 -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include/c++ -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include/c++/x86_64-redhat-linux -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include/c++/backward -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/include -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include/python3.12 -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/include/CLHEP -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include/Geant4 -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/include/root -isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/include/belle_legacy -I include/ -D GBL_EIGEN_SUPPORT_ROOT -D _PACKAGE_="analysis" -D G4UI_USE_TCSH -D RaveDllExport= -D HAS_SQLITE -D HAS_CALLGRIND -I include -I /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/include/libxml2 -internal-isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/bin/../lib64/gcc/x86_64-redhat-linux/15.2.0/../../../../include/c++ -internal-isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/bin/../lib64/gcc/x86_64-redhat-linux/15.2.0/../../../../include/c++/x86_64-redhat-linux -internal-isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/bin/../lib64/gcc/x86_64-redhat-linux/15.2.0/../../../../include/c++/backward -internal-isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/lib/clang/21/include -internal-isystem /usr/local/include -internal-isystem /cvmfs/belle.cern.ch/el9/externals/v02-04-01/Linux_x86_64/common/bin/../lib64/gcc/x86_64-redhat-linux/15.2.0/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-missing-braces -Wno-unused-command-line-argument -std=c++20 -fdeprecated-macro -ferror-limit 19 -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fcxx-exceptions -fexceptions -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /scan_build/2026-07-11-002547-1017033-1 -x c++ analysis/OrcaKinFit/src/BaseHardConstraint.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * Forked from https://github.com/iLCSoft/MarlinKinfit *
6 * *
7 * Further information about the fit engine and the user interface *
8 * provided in MarlinKinfit can be found at *
9 * https://www.desy.de/~blist/kinfit/doc/html/ *
10 * and in the LCNotes LC-TOOL-2009-001 and LC-TOOL-2009-004 available *
11 * from http://www-flc.desy.de/lcnotes/ *
12 * *
13 * See git log for contributors and copyright holders. *
14 * This file is licensed under LGPL-3.0, see LICENSE.md. *
15 **************************************************************************/
16
17#include "analysis/OrcaKinFit/BaseHardConstraint.h"
18#include <framework/logging/Logger.h>
19
20#undef NDEBUG
21#include <cassert>
22
23#include <cstring>
24#include <iostream>
25#include <cmath>
26
27namespace Belle2 {
28 namespace OrcaKinFit {
29
30 BaseHardConstraint::~BaseHardConstraint() = default;
31
32
33 void BaseHardConstraint::add1stDerivativesToMatrix(double* M, int idim) const
34 {
35 double dgdpi[BaseDefs::MAXINTERVARS];
36 for (unsigned int i = 0; i < fitobjects.size(); ++i) {
37 const BaseFitObject* foi = fitobjects[i];
38 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 38, __extension__
__PRETTY_FUNCTION__))
;
39 if (firstDerivatives(i, dgdpi)) {
40 foi->addTo1stDerivatives(M, idim, dgdpi, getGlobalNum(), getVarBasis());
41 }
42 }
43 }
44
45
46 /**
47 * Calculates the second derivative of the constraint g w.r.t. the various parameters,
48 * multiplies it by lambda and adds it to the global covariance matrix
49 *
50 * in case of particlefitobject:
51 * We denote with P_i the 4-vector of the i-th ParticleFitObject,
52 * then
53 * \f[
54 * \frac{\partial ^2 g}{\partial a_k \partial a_l}
55 * = \sum_i \sum_j \frac{\partial ^2 g}{\partial P_i \partial P_j} \cdot
56 * \frac{\partial P_i}{\partial a_k} \cdot \frac{\partial P_j}{\partial a_l}
57 * + \sum_i \frac{\partial g}{\partial P_i} \cdot
58 * \frac{\partial^2 P_i}{\partial a_k \partial a_l}
59 * \f]
60 * Here, \f$\frac{\partial P_i}{\partial a_k}\f$ is a \f$4 \times n_i\f$ Matrix, where
61 * \f$n_i\f$ is the number of parameters of FitObject i;
62 * Correspondingly, \f$\frac{\partial^2 P_i}{\partial a_k \partial a_l}\f$ is a
63 * \f$4 \times n_i \times n_i\f$ matrix.
64 * Also, \f$\frac{\partial ^2 g}{\partial P_i \partial P_j}\f$ is a \f$4\times 4\f$ matrix
65 * for a given i and j, and \f$\frac{\partial g}{\partial P_i}\f$ is a 4-vector
66 * (though not a Lorentz-vector!).
67 *
68 * but here it's been generalised
69 */
70
71
72 void BaseHardConstraint::add2ndDerivativesToMatrix(double* M, int idim, double lambda) const
73 {
74
75 /** First, treat the part
76 * \f[
77 * \frac{\partial ^2 g}{\partial P_i \partial P_j} \cdot
78 * \frac{\partial P_i}{\partial a_k} \cdot \frac{\partial P_j}{\partial a_l}
79 * \f]
80 */
81 // Derivatives \f$\frac{\partial ^2 g}{\partial P_i \partial P_j}\f$ at fixed i, j
82 // d2GdPidPj[4*ii+jj] is derivative w.r.t. P_i,ii and P_j,jj, where ii=0,1,2,3 for E,px,py,pz
83 double d2GdPidPj[BaseDefs::MAXINTERVARS * BaseDefs::MAXINTERVARS];
84
85 // Derivatives \f$\frac {\partial P_i}{\partial a_k}\f$ for all i;
86 // k is local parameter number
87 // dPidAk[KMAX*4*i + 4*k + ii] is \f$\frac {\partial P_{i,ii}}{\partial a_k}\f$,
88 // with ii=0, 1, 2, 3 for E, px, py, pz
89 const int n = fitobjects.size();
90 auto* dPidAk = new double[n * BaseDefs::MAXPAR * BaseDefs::MAXINTERVARS];
91 bool* dPidAkval = new bool[n];
92
93 for (int i = 0; i
0.1
'i' is < 'n'
< n
; ++i) dPidAkval[i] = false;
1
Loop condition is true. Entering loop body
2
Assuming 'i' is >= 'n'
3
Loop condition is false. Execution continues on line 97
94
95 // Derivatives \f$\frac{\partial ^2 g}{\partial P_i \partial a_l}\f$ at fixed i
96 // d2GdPdAl[4*l + ii] is \f$\frac{\partial ^2 g}{\partial P_{i,ii} \partial a_l}\f$
97 double d2GdPdAl[static_cast<int>(BaseDefs::MAXINTERVARS) * BaseDefs::MAXPAR];
98 // Derivatives \f$\frac{\partial ^2 g}{\partial a_k \partial a_l}\f$
99 double d2GdAkdAl[BaseDefs::MAXPAR * BaseDefs::MAXPAR] = {0};
100
101 // Global parameter numbers: parglobal[BaseDefs::MAXPAR*i+klocal]
102 // is global parameter number of local parameter klocal of i-th Fit object
103 int* parglobal = new int[BaseDefs::MAXPAR * n];
4
Storing uninitialized value
104
105 for (int i = 0; i < n; ++i) {
5
Loop condition is true. Entering loop body
12
Loop condition is false. Execution continues on line 114
106 const BaseFitObject* foi = fitobjects[i];
107 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 107, __extension__
__PRETTY_FUNCTION__))
;
6
Assuming 'foi' is non-null
7
'?' condition is true
108 for (int klocal = 0; klocal < foi->getNPar(); ++klocal) {
8
Assuming the condition is true
9
Loop condition is true. Entering loop body
10
Assuming the condition is false
11
Loop condition is false. Execution continues on line 105
109 parglobal [BaseDefs::MAXPAR * i + klocal] = foi->getGlobalParNum(klocal);
110 }
111 }
112
113
114 for (int i = 0; i < n; ++i) {
13
Loop condition is true. Entering loop body
115 const BaseFitObject* foi = fitobjects[i];
116 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 116, __extension__
__PRETTY_FUNCTION__))
;
14
Assuming 'foi' is non-null
15
'?' condition is true
117 for (int j = 0; j < n; ++j) {
16
Loop condition is true. Entering loop body
118 const BaseFitObject* foj = fitobjects[j];
119 assert(foj)(static_cast <bool> (foj) ? void (0) : __assert_fail ("foj"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 119, __extension__
__PRETTY_FUNCTION__))
;
17
Assuming 'foj' is non-null
18
'?' condition is true
120 if (secondDerivatives(i, j, d2GdPidPj)) {
19
Assuming the condition is true
20
Taking true branch
121 if (!dPidAkval[i]) {
21
Taking true branch
122 foi->getDerivatives(dPidAk + i * (static_cast<int>(BaseDefs::MAXPAR) * BaseDefs::MAXINTERVARS),
123 static_cast<int>(BaseDefs::MAXPAR) * BaseDefs::MAXINTERVARS);
124 dPidAkval[i] = true;
125 }
126 if (!dPidAkval[j]) {
22
Taking false branch
127 foj->getDerivatives(dPidAk + j * (static_cast<int>(BaseDefs::MAXPAR) * BaseDefs::MAXINTERVARS),
128 static_cast<int>(BaseDefs::MAXPAR) * BaseDefs::MAXINTERVARS);
129 dPidAkval[j] = true;
130 }
131 // Now sum over E/px/Py/Pz for object j:
132 // \f[
133 // \frac{\partial ^2 g}{\partial P_{i,ii} \partial a_l}
134 // = (sum_{j}) sum_{jj} frac{\partial ^2 g}{\partial P_{i,ii} \partial P_{j,jj}}
135 // \cdot \frac{\partial P_{j,jj}}{\partial a_l}
136 // \f]
137 // We're summing over jj here
138 for (int llocal = 0; llocal < foj->getNPar(); ++llocal) {
23
Assuming the condition is false
24
Loop condition is false. Execution continues on line 155
139 for (int ii = 0; ii < BaseDefs::MAXINTERVARS; ++ii) {
140 int ind1 = BaseDefs::MAXINTERVARS * ii;
141 int ind2 = (static_cast<int>(BaseDefs::MAXPAR) * BaseDefs::MAXINTERVARS) * j + BaseDefs::MAXINTERVARS * llocal;
142 double& r = d2GdPdAl[BaseDefs::MAXINTERVARS * llocal + ii];
143 r = d2GdPidPj[ ind1] * dPidAk[ ind2]; // E
144 r += d2GdPidPj[++ind1] * dPidAk[++ind2]; // px
145 r += d2GdPidPj[++ind1] * dPidAk[++ind2]; // py
146 r += d2GdPidPj[++ind1] * dPidAk[++ind2]; // pz
147 }
148 }
149 // Now sum over E/px/Py/Pz for object i, i.e. sum over ii:
150 // \f[
151 // \frac{\partial ^2 g}{\partial a_k \partial a_l}
152 // = \sum_{ii} \frac{\partial ^2 g}{\partial P_{i,ii} \partial a_l} \cdot
153 // \frac{\partial P_{i,ii}}{\partial a_k}
154 // \f]
155 for (int klocal = 0; klocal < foi->getNPar(); ++klocal) {
25
Assuming the condition is false
26
Loop condition is false. Execution continues on line 167
156 for (int llocal = 0; llocal < foj->getNPar(); ++llocal) {
157 int ind1 = BaseDefs::MAXINTERVARS * llocal;
158 int ind2 = (static_cast<int>(BaseDefs::MAXPAR) * BaseDefs::MAXINTERVARS) * i + BaseDefs::MAXINTERVARS * klocal;
159 double& r = d2GdAkdAl[BaseDefs::MAXPAR * klocal + llocal];
160 r = d2GdPdAl[ ind1] * dPidAk[ ind2]; //E
161 r += d2GdPdAl[++ind1] * dPidAk[++ind2]; // px
162 r += d2GdPdAl[++ind1] * dPidAk[++ind2]; // py
163 r += d2GdPdAl[++ind1] * dPidAk[++ind2]; // pz
164 }
165 }
166 // Now expand the local parameter numbers to global ones
167 for (int klocal = 0; klocal < foi->getNPar(); ++klocal) {
27
Assuming the condition is true
28
Loop condition is true. Entering loop body
168 int kglobal = parglobal [BaseDefs::MAXPAR * i + klocal];
169 for (int llocal = 0; llocal < foj->getNPar(); ++llocal) {
29
Assuming the condition is true
30
Loop condition is true. Entering loop body
31
Assuming the condition is true
32
Loop condition is true. Entering loop body
170 int lglobal = parglobal [BaseDefs::MAXPAR * j + llocal];
33
Assigned value is uninitialized
171 M [idim * kglobal + lglobal] += lambda * d2GdAkdAl[BaseDefs::MAXPAR * klocal + llocal];
172 }
173 }
174 }
175 }
176 }
177 /** Second, treat the part
178 * \f[
179 * \sum_i \frac{\partial g}{\partial P_i} \cdot
180 * \frac{\partial^2 P_i}{\partial a_k \partial a_l}
181 * \f]
182 * Here, \f$\frac{\partial g}{\partial P_i}\f$ is a 4-vector, which we pass on to
183 * the FitObject
184 */
185
186 double dgdpi[BaseDefs::MAXINTERVARS];
187 for (int i = 0; i < n; ++i) {
188 const BaseFitObject* foi = fitobjects[i];
189 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 189, __extension__
__PRETTY_FUNCTION__))
;
190 if (firstDerivatives(i, dgdpi)) {
191 foi->addTo2ndDerivatives(M, idim, lambda, dgdpi, getVarBasis());
192 }
193 }
194
195 delete[] dPidAk;
196 delete[] dPidAkval;
197 delete[] parglobal;
198 }
199
200 void BaseHardConstraint::addToGlobalChi2DerVector(double* y, int idim, double lambda) const
201 {
202 double dgdpi[BaseDefs::MAXINTERVARS];
203 for (unsigned int i = 0; i < fitobjects.size(); ++i) {
204 const BaseFitObject* foi = fitobjects[i];
205 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 205, __extension__
__PRETTY_FUNCTION__))
;
206 if (firstDerivatives(i, dgdpi)) {
207 foi->addToGlobalChi2DerVector(y, idim, lambda, dgdpi, getVarBasis());
208 }
209 }
210 }
211
212
213 double BaseHardConstraint::getError() const
214 {
215 double dgdpi[BaseDefs::MAXINTERVARS];
216 double error2 = 0;
217 for (unsigned int i = 0; i < fitobjects.size(); ++i) {
218 const BaseFitObject* foi = fitobjects[i];
219 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 219, __extension__
__PRETTY_FUNCTION__))
;
220 if (firstDerivatives(i, dgdpi)) {
221 error2 += foi->getError2(dgdpi, getVarBasis());
222 }
223 }
224 return std::sqrt(std::abs(error2));
225 }
226
227
228 double BaseHardConstraint::dirDer(double* p, double* w, int idim, double mu)
229 {
230 double* pw;
231 const double* pp;
232 for (pw = w; pw < w + idim; * (pw++) = 0);
233 addToGlobalChi2DerVector(w, idim, mu);
234 double result = 0;
235 for (pw = w, pp = p; pw < w + idim; result += *(pp++) * *(pw++));
236 return mu * result;
237 }
238
239 double BaseHardConstraint::dirDerAbs(double* p, double* w, int idim, double mu)
240 {
241 double val = getValue();
242 if (val == 0) return mu * std::fabs(dirDer(p, w, idim, 1));
243 else if (val > 0) return mu * dirDer(p, w, idim, 1);
244 else return -mu * dirDer(p, w, idim, 1);
245 }
246
247
248 void BaseHardConstraint::test1stDerivatives()
249 {
250 B2INFO("BaseConstraint::test1stDerivatives for " << getName())do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "BaseConstraint::test1stDerivatives for "
<< getName(); Belle2::LogSystem::Instance().sendMessage
(Belle2::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream
), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 250, 0)); }; } } while(false)
;
251 double y[100];
252 for (double& i : y) i = 0;
253 addToGlobalChi2DerVector(y, 100, 1);
254 double eps = 0.00001;
255 for (unsigned int ifo = 0; ifo < fitobjects.size(); ++ifo) {
256 BaseFitObject* fo = fitobjects[ifo];
257 assert(fo)(static_cast <bool> (fo) ? void (0) : __assert_fail ("fo"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 257, __extension__
__PRETTY_FUNCTION__))
;
258 for (int ilocal = 0; ilocal < fo->getNPar(); ++ilocal) {
259 int iglobal = fo->getGlobalParNum(ilocal);
260 double calc = y[iglobal];
261 double num = num1stDerivative(ifo, ilocal, eps);
262 B2INFO("fo: " << fo->getName() << " par " << ilocal << "/"do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo: " << fo->getName() <<
" par " << ilocal << "/" << iglobal <<
" (" << fo->getParamName(ilocal) << ") calc: "
<< calc << " - num: " << num << " = "
<< calc - num; Belle2::LogSystem::Instance().sendMessage
(Belle2::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream
), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 264, 0)); }; } } while(false)
263 << iglobal << " (" << fo->getParamName(ilocal)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo: " << fo->getName() <<
" par " << ilocal << "/" << iglobal <<
" (" << fo->getParamName(ilocal) << ") calc: "
<< calc << " - num: " << num << " = "
<< calc - num; Belle2::LogSystem::Instance().sendMessage
(Belle2::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream
), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 264, 0)); }; } } while(false)
264 << ") calc: " << calc << " - num: " << num << " = " << calc - num)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo: " << fo->getName() <<
" par " << ilocal << "/" << iglobal <<
" (" << fo->getParamName(ilocal) << ") calc: "
<< calc << " - num: " << num << " = "
<< calc - num; Belle2::LogSystem::Instance().sendMessage
(Belle2::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream
), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 264, 0)); }; } } while(false)
;
265 }
266 }
267 }
268
269 void BaseHardConstraint::test2ndDerivatives()
270 {
271 B2INFO("BaseConstraint::test2ndDerivatives for " << getName())do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "BaseConstraint::test2ndDerivatives for "
<< getName(); Belle2::LogSystem::Instance().sendMessage
(Belle2::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream
), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 271, 0)); }; } } while(false)
;
272 const int idim = 100;
273 auto* M = new double[idim * idim];
274 for (int i = 0; i < idim * idim; ++i) M[i] = 0;
275 add2ndDerivativesToMatrix(M, idim, 1);
276 double eps = 0.0001;
277 B2INFO("eps=" << eps)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "eps=" << eps; Belle2::LogSystem::
Instance().sendMessage(Belle2::LogMessage(Belle2::LogConfig::
c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 277, 0)); }
; } } while(false)
;
278
279 for (unsigned int ifo1 = 0; ifo1 < fitobjects.size(); ++ifo1) {
280 BaseFitObject* fo1 = fitobjects[ifo1];
281 assert(fo1)(static_cast <bool> (fo1) ? void (0) : __assert_fail ("fo1"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 281, __extension__
__PRETTY_FUNCTION__))
;
282 for (unsigned int ifo2 = ifo1; ifo2 < fitobjects.size(); ++ifo2) {
283 BaseFitObject* fo2 = fitobjects[ifo2];
284 assert(fo2)(static_cast <bool> (fo2) ? void (0) : __assert_fail ("fo2"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 284, __extension__
__PRETTY_FUNCTION__))
;
285 for (int ilocal1 = 0; ilocal1 < fo1->getNPar(); ++ilocal1) {
286 int iglobal1 = fo1->getGlobalParNum(ilocal1);
287 for (int ilocal2 = (ifo1 == ifo2 ? ilocal1 : 0); ilocal2 < fo2->getNPar(); ++ilocal2) {
288 int iglobal2 = fo2->getGlobalParNum(ilocal2);
289 double calc = M[idim * iglobal1 + iglobal2];
290 double num = num2ndDerivative(ifo1, ilocal1, eps, ifo2, ilocal2, eps);
291 B2INFO("fo1: " << fo1->getName() << " par " << ilocal1 << "/"do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo1: " << fo1->getName() <<
" par " << ilocal1 << "/" << iglobal1 <<
" (" << fo1->getParamName(ilocal1) << "), fo2: "
<< fo2->getName() << " par " << ilocal2
<< "/" << iglobal2 << " (" << fo2->
getParamName(ilocal2) << ") calc: " << calc <<
" - num: " << num << " = " << calc - num; Belle2
::LogSystem::Instance().sendMessage(Belle2::LogMessage(Belle2
::LogConfig::c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 295, 0)); }
; } } while(false)
292 << iglobal1 << " (" << fo1->getParamName(ilocal1)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo1: " << fo1->getName() <<
" par " << ilocal1 << "/" << iglobal1 <<
" (" << fo1->getParamName(ilocal1) << "), fo2: "
<< fo2->getName() << " par " << ilocal2
<< "/" << iglobal2 << " (" << fo2->
getParamName(ilocal2) << ") calc: " << calc <<
" - num: " << num << " = " << calc - num; Belle2
::LogSystem::Instance().sendMessage(Belle2::LogMessage(Belle2
::LogConfig::c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 295, 0)); }
; } } while(false)
293 << "), fo2: " << fo2->getName() << " par " << ilocal2 << "/"do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo1: " << fo1->getName() <<
" par " << ilocal1 << "/" << iglobal1 <<
" (" << fo1->getParamName(ilocal1) << "), fo2: "
<< fo2->getName() << " par " << ilocal2
<< "/" << iglobal2 << " (" << fo2->
getParamName(ilocal2) << ") calc: " << calc <<
" - num: " << num << " = " << calc - num; Belle2
::LogSystem::Instance().sendMessage(Belle2::LogMessage(Belle2
::LogConfig::c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 295, 0)); }
; } } while(false)
294 << iglobal2 << " (" << fo2->getParamName(ilocal2)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo1: " << fo1->getName() <<
" par " << ilocal1 << "/" << iglobal1 <<
" (" << fo1->getParamName(ilocal1) << "), fo2: "
<< fo2->getName() << " par " << ilocal2
<< "/" << iglobal2 << " (" << fo2->
getParamName(ilocal2) << ") calc: " << calc <<
" - num: " << num << " = " << calc - num; Belle2
::LogSystem::Instance().sendMessage(Belle2::LogMessage(Belle2
::LogConfig::c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 295, 0)); }
; } } while(false)
295 << ") calc: " << calc << " - num: " << num << " = " << calc - num)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "fo1: " << fo1->getName() <<
" par " << ilocal1 << "/" << iglobal1 <<
" (" << fo1->getParamName(ilocal1) << "), fo2: "
<< fo2->getName() << " par " << ilocal2
<< "/" << iglobal2 << " (" << fo2->
getParamName(ilocal2) << ") calc: " << calc <<
" - num: " << num << " = " << calc - num; Belle2
::LogSystem::Instance().sendMessage(Belle2::LogMessage(Belle2
::LogConfig::c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 295, 0)); }
; } } while(false)
;
296 }
297 }
298 }
299 }
300 delete[] M;
301 }
302
303
304 double BaseHardConstraint::num1stDerivative(int ifo, int ilocal, double eps)
305 {
306 BaseFitObject* fo = fitobjects[ifo];
307 assert(fo)(static_cast <bool> (fo) ? void (0) : __assert_fail ("fo"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 307, __extension__
__PRETTY_FUNCTION__))
;
308 double save = fo->getParam(ilocal);
309 fo->setParam(ilocal, save + eps);
310 double v1 = getValue();
311 fo->setParam(ilocal, save - eps);
312 double v2 = getValue();
313 double result = (v1 - v2) / (2 * eps);
314 fo->setParam(ilocal, save);
315 return result;
316 }
317
318 double BaseHardConstraint::num2ndDerivative(int ifo1, int ilocal1, double eps1,
319 int ifo2, int ilocal2, double eps2)
320 {
321 double result;
322
323 if (ifo1 == ifo2 && ilocal1 == ilocal2) {
324 BaseFitObject* fo = fitobjects[ifo1];
325 assert(fo)(static_cast <bool> (fo) ? void (0) : __assert_fail ("fo"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 325, __extension__
__PRETTY_FUNCTION__))
;
326 double save = fo->getParam(ilocal1);
327 double v0 = getValue();
328 fo->setParam(ilocal1, save + eps1);
329 double v1 = getValue();
330 fo->setParam(ilocal1, save - eps1);
331 double v2 = getValue();
332 result = (v1 + v2 - 2 * v0) / (eps1 * eps1);
333 fo->setParam(ilocal1, save);
334 } else {
335 BaseFitObject* fo1 = fitobjects[ifo1];
336 assert(fo1)(static_cast <bool> (fo1) ? void (0) : __assert_fail ("fo1"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 336, __extension__
__PRETTY_FUNCTION__))
;
337 BaseFitObject* fo2 = fitobjects[ifo2];
338 assert(fo2)(static_cast <bool> (fo2) ? void (0) : __assert_fail ("fo2"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 338, __extension__
__PRETTY_FUNCTION__))
;
339 double save1 = fo1->getParam(ilocal1);
340 double save2 = fo2->getParam(ilocal2);
341 fo1->setParam(ilocal1, save1 + eps1);
342 fo2->setParam(ilocal2, save2 + eps2);
343 double v11 = getValue();
344 fo2->setParam(ilocal2, save2 - eps2);
345 double v12 = getValue();
346 fo1->setParam(ilocal1, save1 - eps1);
347 double v22 = getValue();
348 fo2->setParam(ilocal2, save2 + eps2);
349 double v21 = getValue();
350 result = (v11 + v22 - v12 - v21) / (4 * eps1 * eps2);
351 fo1->setParam(ilocal1, save1);
352 fo2->setParam(ilocal2, save2);
353 }
354 return result;
355 }
356
357 void BaseHardConstraint::printFirstDerivatives() const
358 {
359
360 B2INFO("BaseHardConstraint::printFirstDerivatives " << fitobjects.size())do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "BaseHardConstraint::printFirstDerivatives "
<< fitobjects.size(); Belle2::LogSystem::Instance().sendMessage
(Belle2::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream
), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 360, 0)); }; } } while(false)
;
361
362 double dgdpi[BaseDefs::MAXINTERVARS];
363 for (unsigned int i = 0; i < fitobjects.size(); ++i) {
364 const BaseFitObject* foi = fitobjects[i];
365 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 365, __extension__
__PRETTY_FUNCTION__))
;
366 if (firstDerivatives(i, dgdpi)) {
367 B2INFO("first derivs for obj " << i << " : ")do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "first derivs for obj " << i <<
" : "; Belle2::LogSystem::Instance().sendMessage(Belle2::LogMessage
(Belle2::LogConfig::c_Info, std::move(varStream), "analysis",
__PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 367, 0)); }; } } while(false)
;
368 for (double j : dgdpi)
369 B2INFO(j << " ")do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << j << " "; Belle2::LogSystem::Instance
().sendMessage(Belle2::LogMessage(Belle2::LogConfig::c_Info, std
::move(varStream), "analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 369, 0)); }; } } while(false)
;
370 }
371 }
372
373 return;
374 }
375
376 void BaseHardConstraint::printSecondDerivatives() const
377 {
378
379 double d2GdPidPj[BaseDefs::MAXINTERVARS * BaseDefs::MAXINTERVARS];
380
381 int n = fitobjects.size();
382
383 for (int i = 0; i < n; ++i) {
384 const BaseFitObject* foi = fitobjects[i];
385 assert(foi)(static_cast <bool> (foi) ? void (0) : __assert_fail ("foi"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 385, __extension__
__PRETTY_FUNCTION__))
;
386 for (int j = 0; j < n; ++j) {
387 const BaseFitObject* foj = fitobjects[j];
388 assert(foj)(static_cast <bool> (foj) ? void (0) : __assert_fail ("foj"
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 388, __extension__
__PRETTY_FUNCTION__))
;
389 if (secondDerivatives(i, j, d2GdPidPj)) {
390
391 B2INFO("second derivs for objs " << i << " " << j)do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << "second derivs for objs " << i <<
" " << j; Belle2::LogSystem::Instance().sendMessage(Belle2
::LogMessage(Belle2::LogConfig::c_Info, std::move(varStream),
"analysis", __PRETTY_FUNCTION__, "analysis/OrcaKinFit/src/BaseHardConstraint.cc"
, 391, 0)); }; } } while(false)
;
392
393 int k(0);
394 for (int k1 = 0; k1 < BaseDefs::MAXINTERVARS; k1++) {
395 for (int k2 = 0; k2 < BaseDefs::MAXINTERVARS; k2++) {
396 B2INFO(d2GdPidPj[k++] << " ")do { if (Belle2::LogSystem::Instance().isLevelEnabled(Belle2::
LogConfig::c_Info, 0, "analysis")) { { LogVariableStream varStream
; varStream << d2GdPidPj[k++] << " "; Belle2::LogSystem
::Instance().sendMessage(Belle2::LogMessage(Belle2::LogConfig
::c_Info, std::move(varStream), "analysis", __PRETTY_FUNCTION__
, "analysis/OrcaKinFit/src/BaseHardConstraint.cc", 396, 0)); }
; } } while(false)
;
397 }
398 }
399 }
400 }
401 }
402
403 return;
404 }
405
406 }// end OrcaKinFit namespace
407} // end Belle2 namespace