9 #include "analysis/OrcaKinFit/RecoilMassConstraint.h"
10 #include "analysis/OrcaKinFit/ParticleFitObject.h"
23 namespace OrcaKinFit {
27 : m_recoilMass(recoilmass), m_beamPx(beampx), m_beamPy(beampy), m_beamPz(beampz), m_beamE(beampe)
48 totpx += pfo->getPx();
49 totpy += pfo->getPy();
50 totpz += pfo->getPz();
53 const double recoilE = (m_beamE - totE);
54 const double recoilE2 = recoilE * recoilE;
55 const double recoilpx = (m_beamPx - totpx);
56 const double recoilpx2 = recoilpx * recoilpx;
57 const double recoilpy = (m_beamPy - totpy);
58 const double recoilpy2 = recoilpy * recoilpy;
59 const double recoilpz = (m_beamPz - totpz);
60 const double recoilpz2 = recoilpz * recoilpz;
61 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
62 const double recoil = std::sqrt(std::fabs(recoil2));
63 const double result = recoil - m_recoilMass;
85 totpx += pfo->getPx();
86 totpy += pfo->getPy();
87 totpz += pfo->getPz();
90 const double recoilE = (m_beamE - totE);
91 const double recoilE2 = recoilE * recoilE;
92 const double recoilpx = (m_beamPx - totpx);
93 const double recoilpx2 = recoilpx * recoilpx;
94 const double recoilpy = (m_beamPy - totpy);
95 const double recoilpy2 = recoilpy * recoilpy;
96 const double recoilpz = (m_beamPz - totpz);
97 const double recoilpz2 = recoilpz * recoilpz;
98 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
99 const double recoil = std::sqrt(std::fabs(recoil2));
101 double recoilmass_inv = 0.;
102 if (recoil > 1e-9) recoilmass_inv = 1. / recoil;
105 for (
int ilocal = 0; ilocal < fitobject->getNPar(); ilocal++) {
106 if (!fitobject->isParamFixed(ilocal)) {
107 int iglobal = fitobject->getGlobalParNum(ilocal);
108 assert(iglobal >= 0 && iglobal < idim);
112 der[iglobal] = - recoilE * pfo->getDE(ilocal)
113 + recoilpx * pfo->getDPx(ilocal)
114 + recoilpy * pfo->getDPy(ilocal)
115 + recoilpz * pfo->getDPz(ilocal);
116 der[iglobal] *= recoilmass_inv;
134 totpx += pfo->getPx();
135 totpy += pfo->getPy();
136 totpz += pfo->getPz();
139 const double recoilE = (m_beamE - totE);
140 const double recoilE2 = recoilE * recoilE;
141 const double recoilpx = (m_beamPx - totpx);
142 const double recoilpx2 = recoilpx * recoilpx;
143 const double recoilpy = (m_beamPy - totpy);
144 const double recoilpy2 = recoilpy * recoilpy;
145 const double recoilpz = (m_beamPz - totpz);
146 const double recoilpz2 = recoilpz * recoilpz;
147 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
148 const double recoil = std::sqrt(std::fabs(recoil2));
155 m_recoilMass = recoilmass_;
171 totpx += pfo->getPx();
172 totpy += pfo->getPy();
173 totpz += pfo->getPz();
176 const double recoilE = (m_beamE - totE);
177 const double recoilE2 = recoilE * recoilE;
178 const double recoilpx = (m_beamPx - totpx);
179 const double recoilpx2 = recoilpx * recoilpx;
180 const double recoilpy = (m_beamPy - totpy);
181 const double recoilpy2 = recoilpy * recoilpy;
182 const double recoilpz = (m_beamPz - totpz);
183 const double recoilpz2 = recoilpz * recoilpz;
184 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
185 const double recoil = sqrt(recoil2);
187 assert(dderivatives);
188 for (
int k = 0; k < 16; ++k) dderivatives[k] = 0;
190 if (recoil > 1e-12) {
191 double recoilmass_inv3 = 1. / (recoil * recoil * recoil);
193 dderivatives[4 * 0 + 0] = (recoil2 - recoilE2) * recoilmass_inv3;
194 dderivatives[4 * 0 + 1] = dderivatives[4 * 1 + 0] = recoilE * recoilpx * recoilmass_inv3;
195 dderivatives[4 * 0 + 2] = dderivatives[4 * 2 + 0] = recoilE * recoilpy * recoilmass_inv3;
196 dderivatives[4 * 0 + 3] = dderivatives[4 * 3 + 0] = recoilE * recoilpz * recoilmass_inv3;
197 dderivatives[4 * 1 + 1] = -(recoil2 + recoilpx2) * recoilmass_inv3;
198 dderivatives[4 * 1 + 2] = dderivatives[4 * 2 + 1] = -recoilpx * recoilpy * recoilmass_inv3;
199 dderivatives[4 * 1 + 3] = dderivatives[4 * 3 + 1] = -recoilpx * recoilpz * recoilmass_inv3;
200 dderivatives[4 * 2 + 2] = -(recoil2 + recoilpy2) * recoilmass_inv3;
201 dderivatives[4 * 2 + 3] = dderivatives[4 * 3 + 2] = -recoilpy * recoilpz * recoilmass_inv3;
202 dderivatives[4 * 3 + 3] = -(recoil2 + recoilpz2) * recoilmass_inv3;
222 totpx += pfo->getPx();
223 totpy += pfo->getPy();
224 totpz += pfo->getPz();
227 const double recoilE = (m_beamE - totE);
228 const double recoilE2 = recoilE * recoilE;
229 const double recoilpx = (m_beamPx - totpx);
230 const double recoilpx2 = recoilpx * recoilpx;
231 const double recoilpy = (m_beamPy - totpy);
232 const double recoilpy2 = recoilpy * recoilpy;
233 const double recoilpz = (m_beamPz - totpz);
234 const double recoilpz2 = recoilpz * recoilpz;
235 const double recoil2 = recoilE2 - recoilpx2 - recoilpy2 - recoilpz2;
236 const double recoil = sqrt(recoil2);
239 dderivatives[0] = -recoilE / recoil;
240 dderivatives[1] = recoilpx / recoil;
241 dderivatives[2] = recoilpy / recoil;
242 dderivatives[3] = recoilpz / recoil;
247 int RecoilMassConstraint::getVarBasis()
const
FitObjectContainer fitobjects
The FitObjectContainer.
virtual void setRecoilMass(double recoilmass)
Sets the target recoil mass of the constraint.
virtual void getDerivatives(int idim, double der[]) const override
Get first order derivatives.
virtual double getRecoilMass()
Get the actual recoil mass of the fit objects.
virtual double getValue() const override
Returns the value of the constraint.
virtual bool secondDerivatives(int i, int j, double *derivatives) const override
Second derivatives with respect to the 4-vectors of Fit objects i and j; result false if all derivati...
RecoilMassConstraint(double recoilmass=0., double beampx=0., double beampy=0., double beampz=0, double beampe=0.)
Constructor.
virtual bool firstDerivatives(int i, double *derivatives) const override
First derivatives with respect to the 4-vector of Fit objects i; result false if all derivatives are ...
virtual ~RecoilMassConstraint()
Virtual destructor.
Abstract base class for different kinds of events.