14 #include "analysis/OrcaKinFit/RecoilMassConstraint.h"
15 #include "analysis/OrcaKinFit/ParticleFitObject.h"
28 namespace OrcaKinFit {
32 : m_recoilMass(recoilmass), m_beamPx(beampx), m_beamPy(beampy), m_beamPz(beampz), m_beamE(beampe)
53 totpx += pfo->getPx();
54 totpy += pfo->getPy();
55 totpz += pfo->getPz();
58 const double recoilE = (m_beamE - totE);
59 const double recoilE2 = recoilE * recoilE;
60 const double recoilpx = (m_beamPx - totpx);
61 const double recoilpx2 = recoilpx * recoilpx;
62 const double recoilpy = (m_beamPy - totpy);
63 const double recoilpy2 = recoilpy * recoilpy;
64 const double recoilpz = (m_beamPz - totpz);
65 const double recoilpz2 = recoilpz * recoilpz;
66 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
67 const double recoil = std::sqrt(std::fabs(recoil2));
68 const double result = recoil - m_recoilMass;
87 auto* pfo =
dynamic_cast < ParticleFitObject*
>(fitobject);
90 totpx += pfo->getPx();
91 totpy += pfo->getPy();
92 totpz += pfo->getPz();
95 const double recoilE = (m_beamE - totE);
96 const double recoilE2 = recoilE * recoilE;
97 const double recoilpx = (m_beamPx - totpx);
98 const double recoilpx2 = recoilpx * recoilpx;
99 const double recoilpy = (m_beamPy - totpy);
100 const double recoilpy2 = recoilpy * recoilpy;
101 const double recoilpz = (m_beamPz - totpz);
102 const double recoilpz2 = recoilpz * recoilpz;
103 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
104 const double recoil = std::sqrt(std::fabs(recoil2));
106 double recoilmass_inv = 0.;
107 if (recoil > 1e-9) recoilmass_inv = 1. / recoil;
110 for (
int ilocal = 0; ilocal < fitobject->getNPar(); ilocal++) {
111 if (!fitobject->isParamFixed(ilocal)) {
112 int iglobal = fitobject->getGlobalParNum(ilocal);
113 assert(iglobal >= 0 && iglobal < idim);
117 der[iglobal] = - recoilE * pfo->getDE(ilocal)
118 + recoilpx * pfo->getDPx(ilocal)
119 + recoilpy * pfo->getDPy(ilocal)
120 + recoilpz * pfo->getDPz(ilocal);
121 der[iglobal] *= recoilmass_inv;
136 auto* pfo =
dynamic_cast < ParticleFitObject*
>(fitobject);
139 totpx += pfo->getPx();
140 totpy += pfo->getPy();
141 totpz += pfo->getPz();
144 const double recoilE = (m_beamE - totE);
145 const double recoilE2 = recoilE * recoilE;
146 const double recoilpx = (m_beamPx - totpx);
147 const double recoilpx2 = recoilpx * recoilpx;
148 const double recoilpy = (m_beamPy - totpy);
149 const double recoilpy2 = recoilpy * recoilpy;
150 const double recoilpz = (m_beamPz - totpz);
151 const double recoilpz2 = recoilpz * recoilpz;
152 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
153 const double recoil = std::sqrt(std::fabs(recoil2));
160 m_recoilMass = recoilmass_;
176 totpx += pfo->getPx();
177 totpy += pfo->getPy();
178 totpz += pfo->getPz();
181 const double recoilE = (m_beamE - totE);
182 const double recoilE2 = recoilE * recoilE;
183 const double recoilpx = (m_beamPx - totpx);
184 const double recoilpx2 = recoilpx * recoilpx;
185 const double recoilpy = (m_beamPy - totpy);
186 const double recoilpy2 = recoilpy * recoilpy;
187 const double recoilpz = (m_beamPz - totpz);
188 const double recoilpz2 = recoilpz * recoilpz;
189 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
190 const double recoil = sqrt(recoil2);
192 assert(dderivatives);
193 for (
int k = 0; k < 16; ++k) dderivatives[k] = 0;
195 if (recoil > 1e-12) {
196 double recoilmass_inv3 = 1. / (recoil * recoil * recoil);
198 dderivatives[4 * 0 + 0] = (recoil2 - recoilE2) * recoilmass_inv3;
199 dderivatives[4 * 0 + 1] = dderivatives[4 * 1 + 0] = recoilE * recoilpx * recoilmass_inv3;
200 dderivatives[4 * 0 + 2] = dderivatives[4 * 2 + 0] = recoilE * recoilpy * recoilmass_inv3;
201 dderivatives[4 * 0 + 3] = dderivatives[4 * 3 + 0] = recoilE * recoilpz * recoilmass_inv3;
202 dderivatives[4 * 1 + 1] = -(recoil2 + recoilpx2) * recoilmass_inv3;
203 dderivatives[4 * 1 + 2] = dderivatives[4 * 2 + 1] = -recoilpx * recoilpy * recoilmass_inv3;
204 dderivatives[4 * 1 + 3] = dderivatives[4 * 3 + 1] = -recoilpx * recoilpz * recoilmass_inv3;
205 dderivatives[4 * 2 + 2] = -(recoil2 + recoilpy2) * recoilmass_inv3;
206 dderivatives[4 * 2 + 3] = dderivatives[4 * 3 + 2] = -recoilpy * recoilpz * recoilmass_inv3;
207 dderivatives[4 * 3 + 3] = -(recoil2 + recoilpz2) * recoilmass_inv3;
224 auto* pfo =
dynamic_cast < ParticleFitObject*
>(fitobject);
227 totpx += pfo->getPx();
228 totpy += pfo->getPy();
229 totpz += pfo->getPz();
232 const double recoilE = (m_beamE - totE);
233 const double recoilE2 = recoilE * recoilE;
234 const double recoilpx = (m_beamPx - totpx);
235 const double recoilpx2 = recoilpx * recoilpx;
236 const double recoilpy = (m_beamPy - totpy);
237 const double recoilpy2 = recoilpy * recoilpy;
238 const double recoilpz = (m_beamPz - totpz);
239 const double recoilpz2 = recoilpz * recoilpz;
240 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
241 const double recoil = sqrt(recoil2);
244 dderivatives[0] = -recoilE / recoil;
245 dderivatives[1] = recoilpx / recoil;
246 dderivatives[2] = recoilpy / recoil;
247 dderivatives[3] = recoilpz / recoil;
252 int RecoilMassConstraint::getVarBasis()
const