13 #include "analysis/OrcaKinFit/PxPyPzMFitObject.h"
14 #include <framework/logging/Logger.h>
28 namespace OrcaKinFit {
31 PxPyPzMFitObject::PxPyPzMFitObject(CLHEP::HepLorentzVector& particle,
const CLHEP::HepSymMatrix& covmatrix)
32 : cachevalid(false), chi2(0), dEdpx(0), dEdpy(0), dEdpz(0),
33 dE2dpxdpx(0), dE2dpxdpy(0), dE2dpxdpz(0), dE2dpydpy(0), dE2dpydpz(0), dE2dpzdpz(0)
36 assert(
int(NPAR) <=
int(BaseDefs::MAXPAR));
41 setParam(0, particle.px(),
true);
42 setParam(1, particle.py(),
true);
43 setParam(2, particle.pz(),
true);
45 setMParam(0, particle.px());
46 setMParam(1, particle.py());
47 setMParam(2, particle.pz());
50 for (
int i = 0; i < int(NPAR); i++) {
51 for (
int j = 0; j < int(NPAR); j++) {
52 setCov(i, j, covmatrix[i][j]);
60 PxPyPzMFitObject::~PxPyPzMFitObject() =
default;
63 :
ParticleFitObject(rhs), cachevalid(false), chi2(0), dEdpx(0), dEdpy(0), dEdpz(0),
64 dE2dpxdpx(0), dE2dpxdpy(0), dE2dpxdpz(0), dE2dpydpy(0), dE2dpydpz(0), dE2dpzdpz(0)
86 if (psource !=
this) {
111 int ipx = getGlobalParNum(0);
112 int ipy = getGlobalParNum(1);
113 int ipz = getGlobalParNum(2);
114 assert(ipx >= 0 && ipx < idim);
115 assert(ipy >= 0 && ipy < idim);
116 assert(ipz >= 0 && ipz < idim);
122 bool result = ((px - par[0]) * (px - par[0]) > eps2 * cov[0][0]) ||
123 ((py - par[1]) * (py - par[1]) > eps2 * cov[1][1]) ||
124 ((pz - par[2]) * (pz - par[2]) > eps2 * cov[2][2]);
139 assert(ilocal >= 0 && ilocal < NPAR);
140 if (!cachevalid) updateCache();
151 assert(ilocal >= 0 && ilocal < NPAR);
152 if (!cachevalid) updateCache();
164 assert(ilocal >= 0 && ilocal < NPAR);
165 if (!cachevalid) updateCache();
176 assert(ilocal >= 0 && ilocal < NPAR);
177 if (!cachevalid) updateCache();
179 case 0:
return dEdpx;
180 case 1:
return dEdpy;
181 case 2:
return dEdpz;
186 double PxPyPzMFitObject::getFirstDerivative_Meta_Local(
int iMeta,
int ilocal ,
int metaSet)
const
192 assert(metaSet == 0);
196 return getDE(ilocal);
212 double PxPyPzMFitObject::getSecondDerivative_Meta_Local(
int iMeta,
int ilocal ,
int jlocal ,
int metaSet)
const
214 assert(metaSet == 0);
215 if (!cachevalid) updateCache();
216 if (jlocal < ilocal) {
224 if (ilocal == 0 && jlocal == 0)
return dE2dpxdpx;
225 else if (ilocal == 0 && jlocal == 1)
return dE2dpxdpy;
226 else if (ilocal == 0 && jlocal == 2)
return dE2dpxdpz;
227 else if (ilocal == 1 && jlocal == 1)
return dE2dpydpy;
228 else if (ilocal == 1 && jlocal == 2)
return dE2dpydpz;
229 else if (ilocal == 2 && jlocal == 2)
return dE2dpzdpz;
246 void PxPyPzMFitObject::updateCache()
const
253 double px2 = px * px;
254 double py2 = py * py;
255 double pz2 = pz * pz;
256 double p = std::sqrt(px2 + py2 + pz2);
260 double e2 = px2 + py2 + pz2 + mass2;
261 double e = std::sqrt(e2);
269 double e32 = std::pow(e, 1.5);
270 dE2dpxdpx = (py2 + pz2 + mass2) / (e32);
271 dE2dpxdpy = -(px * py) / (e32);
272 dE2dpxdpz = -(px * pz) / (e32);
273 dE2dpydpy = (px2 + pz2 + mass2) / (e32);
274 dE2dpydpz = -(py * pz) / (e32);
275 dE2dpzdpz = (px2 + py2 + mass2) / (e32);
277 fourMomentum.setValues(e, px, py, pz);