17#include "analysis/OrcaKinFit/MassConstraint.h" 
   18#include "analysis/OrcaKinFit/ParticleFitObject.h" 
   19#include <framework/logging/Logger.h> 
   32  namespace OrcaKinFit {
 
   46      double totE[2] = {0, 0};
 
   47      double totpx[2] = {0, 0};
 
   48      double totpy[2] = {0, 0};
 
   49      double totpz[2] = {0, 0};
 
   50      for (
unsigned int i = 0; i < 
fitobjects.size(); i++) {
 
   51        int index = (
flags[i] == 1) ? 0 : 1; 
 
   54        totE[index]  += pfo->getE();
 
   55        totpx[index] += pfo->getPx();
 
   56        totpy[index] += pfo->getPy();
 
   57        totpz[index] += pfo->getPz();
 
   59      double result = -
mass;
 
   60      result += std::sqrt(std::abs(totE[0] * totE[0] - totpx[0] * totpx[0] - totpy[0] * totpy[0] - totpz[0] * totpz[0]));
 
   61      result -= std::sqrt(std::abs(totE[1] * totE[1] - totpx[1] * totpx[1] - totpy[1] * totpy[1] - totpz[1] * totpz[1]));
 
 
   72      double totE[2] = {0, 0};
 
   73      double totpx[2] = {0, 0};
 
   74      double totpy[2] = {0, 0};
 
   75      double totpz[2] = {0, 0};
 
   76      bool valid[2] = {
false, 
false};
 
   77      for (
unsigned int i = 0; i < 
fitobjects.size(); i++) {
 
   78        int index = (
flags[i] == 1) ? 0 : 1; 
 
   82        totE[index]  += pfo->getE();
 
   83        totpx[index] += pfo->getPx();
 
   84        totpy[index] += pfo->getPy();
 
   85        totpz[index] += pfo->getPz();
 
   88      double m_inv[2] = {0, 0};
 
   89      for (
int index = 0; index < 2; ++index) {
 
   90        m2[index] = totE[index] * totE[index] - totpx[index] * totpx[index]
 
   91                    - totpy[index] * totpy[index] - totpz[index] * totpz[index];
 
   92        if (m2[index] < 0 && m2[index] > -1E-9) m2[index] = 0;
 
   93        if (m2[index] < 0 && valid[index]) {
 
   94          B2ERROR(
"MassConstraint::getDerivatives: m2<0!");
 
   95          for (
unsigned int j = 0; j < 
fitobjects.size(); j++) {
 
   96            int jndex = (
flags[j] == 1) ? 0 : 1;
 
  101              B2ERROR(pfo->getName() <<
 
  102                      ": E =" << pfo->getE() <<
 
  103                      ", px=" << pfo->getPx() <<
 
  104                      ", py=" << pfo->getPy() <<
 
  105                      ", pz=" << pfo->getPz());
 
  108          B2ERROR(
"sum: E=" << totE[index] << 
", px=" << totpx[index]
 
  109                  << 
", py=" << totpy[index] << 
", pz=" << totpz[index] << 
", m2=" << m2[index]);
 
  111        if (m2[index] != 0) m_inv[index] = 1 / std::sqrt(std::abs(m2[index]));
 
  114      for (
unsigned int i = 0; i < 
fitobjects.size(); i++) {
 
  115        int index = (
flags[i] == 1) ? 0 : 1; 
 
  116        for (
int ilocal = 0; ilocal < 
fitobjects[i]->getNPar(); ilocal++) {
 
  118            int iglobal = 
fitobjects[i]->getGlobalParNum(ilocal);
 
  119            assert(iglobal >= 0 && iglobal < idim);
 
  120            if (m2[index] != 0) {
 
  125              der[iglobal] =   totE[index]  * pfo->getDE(ilocal)
 
  126                               - totpx[index] * pfo->getDPx(ilocal)
 
  127                               - totpy[index] * pfo->getDPy(ilocal)
 
  128                               - totpz[index] * pfo->getDPz(ilocal);
 
  129              der[iglobal] *= m_inv[index];
 
  130            } 
else der[iglobal] = 1;
 
  131            if (index == 1) der[iglobal] *= -1.;
 
 
  143      for (
unsigned int i = 0; i < 
fitobjects.size(); i++) {
 
  144        if (
flags[i] == flag) {
 
  149          totpx += fok->
getPx();
 
  150          totpy += fok->
getPy();
 
  151          totpz += fok->
getPz();
 
  154      return std::sqrt(std::abs(totE * totE - totpx * totpx - totpy * totpy - totpz * totpz));
 
 
  164      B2DEBUG(14, 
"MassConstraint::secondDerivatives: i=" << i << 
", j=" << j);
 
  165      int index = (
flags[i] == 1) ? 0 : 1; 
 
  166      int jndex = (
flags[j] == 1) ? 0 : 1; 
 
  167      if (index != jndex) 
return false;
 
  172      for (
unsigned int k = 0; k < 
fitobjects.size(); ++k) {
 
  173        int kndex = (
flags[k] == 1) ? 0 : 1; 
 
  176        if (index == kndex) {
 
  178          totpx += fok->
getPx();
 
  179          totpy += fok->
getPy();
 
  180          totpz += fok->
getPz();
 
  185        B2ERROR(
"MassConstraint::secondDerivatives: totE = " << totE);
 
  188      double m2 = std::abs(totE * totE - totpx * totpx - totpy * totpy - totpz * totpz);
 
  189      double m = std::sqrt(m2);
 
  191      double minv3 = 1 / (m * m * m);
 
  193      assert(dderivatives);
 
  194      for (
int k = 0; k < 16; ++k) dderivatives[k] = 0;
 
  195      dderivatives[4 * 0 + 0] = (m2 - totE * totE) * minv3;
 
  196      dderivatives[4 * 0 + 1] = dderivatives[4 * 1 + 0] =     totE * totpx * minv3;
 
  197      dderivatives[4 * 0 + 2] = dderivatives[4 * 2 + 0] =     totE * totpy * minv3;
 
  198      dderivatives[4 * 0 + 3] = dderivatives[4 * 3 + 0] =     totE * totpz * minv3;
 
  199      dderivatives[4 * 1 + 1] =                     -(m2 + totpx * totpx) * minv3;
 
  200      dderivatives[4 * 1 + 2] = dderivatives[4 * 2 + 1] =    -totpx * totpy * minv3;
 
  201      dderivatives[4 * 1 + 3] = dderivatives[4 * 3 + 1] =    -totpx * totpz * minv3;
 
  202      dderivatives[4 * 2 + 2] =                     -(m2 + totpy * totpy) * minv3;
 
  203      dderivatives[4 * 2 + 3] = dderivatives[4 * 3 + 2] =    -totpy * totpz * minv3;
 
  204      dderivatives[4 * 3 + 3] =                     -(m2 + totpz * totpz) * minv3;
 
 
  214      int index = (
flags[i] == 1) ? 0 : 1; 
 
  215      for (
unsigned int j = 0; j < 
fitobjects.size(); ++j) {
 
  216        int jndex = (
flags[j] == 1) ? 0 : 1; 
 
  219        if (index == jndex) {
 
  221          totpx += foj->
getPx();
 
  222          totpy += foj->
getPy();
 
  223          totpz += foj->
getPz();
 
  228        B2ERROR(
"MassConstraint::firstDerivatives: totE = " << totE);
 
  231      double m = std::sqrt(std::abs(totE * totE - totpx * totpx - totpy * totpy - totpz * totpz));
 
  234      dderivatives[0] = totE / m;
 
  235      dderivatives[1] = -totpx / m;
 
  236      dderivatives[2] = -totpy / m;
 
  237      dderivatives[3] = -totpz / m;
 
 
  241    int MassConstraint::getVarBasis()
 const 
FitObjectContainer fitobjects
The FitObjectContainer.
std::vector< int > flags
The flags can be used to divide the FitObjectContainer into several subsets used for example to imple...
virtual ~MassConstraint()
Virtual destructor.
virtual void getDerivatives(int idim, double der[]) const override
Get first order derivatives.
double mass
The mass difference between object sets 1 and 2.
MassConstraint(double mass_=0.)
Constructor.
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...
virtual void setMass(double mass_)
Sets the target mass of the constraint.
virtual double getMass(int flag=1)
Get the actual invariant mass of the fit objects with a given flag.
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 double getPx() const
Return px.
virtual double getPz() const
Return pz.
virtual double getPy() const
Return py.
virtual double getE() const
Return E.
Abstract base class for different kinds of events.