Rivet analyses


title: BELLE_2011_I916712

$X(3872)$ mass and angular distributions using $B\to KX(3872)$

Experiment: BELLE (KEKB)

Inspire ID: 916712

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.D 84 (2011) 052004

Beams: * *

Beam energies: ANY

Run details: - Any process producting B+ and V0 mesons, origniallyu Upsilon(4S) decay

Measurement of mass and angular distribution for the production of $X(3872)$ in the decay $B\to KX(3872)$. There is no consensus as to the nature of the $X(3872)$ $c\bar{c}$ state and therefore we taken its PDG code to be 9030443, i.e. the first unused code for an undetermined spin one $c\bar{c}$ state. This can be changed using the PID option if a different code is used by the event generator performing the simulation.

Source code:BELLE_2011_I916712.cc

```c++ // -- C++ --

include "Rivet/Analysis.hh"

include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {

/// @brief B -> K X(3872) class BELLE_2011_I916712 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2011_I916712);


/// @name Analysis methods
/// @{

/// Book histograms and initialise projections before the run
void init() {
  // set the PDG code
  _pid = getOption<double>("PID", 9030443);
  // projections
  declare(UnstableParticles(Cuts::abspid == 511 || Cuts::abspid == 521), "UFS");
  // histograms
  for (unsigned int ix = 0; ix < 4; ++ix) book(_h[ix], 1 + ix, 1, 1);
}

void findChildren(const Particle& p,
                  Particles& pim,
                  Particles& pip,
                  Particles& Jpsi,
                  unsigned int& ncount) {
  for (const Particle& child : p.children()) {
    if (child.pid() == PID::PIPLUS) {
      pip.push_back(child);
      ncount += 1;
    }
    else if (child.pid() == PID::PIMINUS) {
      pim.push_back(child);
      ncount += 1;
    }
    else if (child.pid() == PID::JPSI) {
      Jpsi.push_back(child);
      ncount += 1;
    }
    else if (child.children().empty()) {
      ncount += 1;
    }
    else
      findChildren(child, pim, pip, Jpsi, ncount);
  }
}

/// Perform the per-event analysis
void analyze(const Event& event) {
  for (const Particle& p : apply<UnstableParticles>(event, "UFS").particles()) {
    if (p.children().empty()) continue;
    if (p.children().size() == 1) continue;
    if (p.children().size() != 2) continue;
    Particle K, X;
    if (p.children()[0].pid() == _pid) {
      X = p.children()[0];
      K = p.children()[1];
    }
    else if (p.children()[1].pid() == _pid) {
      X = p.children()[1];
      K = p.children()[0];
    }
    else
      continue;
    if (K.abspid() != 311 && K.abspid() != 321 && K.abspid() != 310 && K.abspid() != 130) continue;
    // X(3872) decay
    unsigned int ncount = 0;
    Particles pip, pim, Jpsi;
    findChildren(X, pim, pip, Jpsi, ncount);
    if (ncount != 3 || !(pim.size() == 1 && pip.size() == 1 && Jpsi.size() == 1)) continue;
    _h[3]->fill((pip[0].momentum() + pim[0].momentum()).mass());
    LorentzTransform boostB = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
    Vector3 axisX = -boostB.transform(K.momentum()).p3().unit();
    FourMomentum pX = boostB.transform(X.momentum());
    LorentzTransform boostX = LorentzTransform::mkFrameTransformFromBeta(pX.betaVec());
    FourMomentum pPsi = boostX.transform(boostB.transform(Jpsi[0].momentum()));
    double cTheta = axisX.dot(pPsi.p3().unit());
    _h[0]->fill(cTheta);
    // finally the leptons from J/psi decay
    if (Jpsi[0].children().size() != 2) vetoEvent;
    if (Jpsi[0].children()[0].pid() != -Jpsi[0].children()[1].pid()) vetoEvent;
    if (Jpsi[0].children()[0].abspid() != PID::EMINUS && Jpsi[0].children()[0].abspid() != PID::MUON)
      vetoEvent;
    Particle lm = Jpsi[0].children()[0];
    Particle lp = Jpsi[0].children()[1];
    Vector3 axispi = boostX.transform(boostB(pip[0].momentum())).p3().unit();
    Vector3 axisZ = axispi.cross(axisX).unit();
    Vector3 axisL = boostX.transform(boostB(lp.momentum())).p3().unit();
    _h[2]->fill(abs(axisZ.dot(axisL)));
    _h[1]->fill(abs(axisX.dot(axisL)));
  }
}


/// Normalise histograms etc., after the run
void finalize() {
  for (unsigned int ix = 0; ix < 4; ++ix) normalize(_h[ix], 1., false);
}

/// @}


/// @name Histograms
/// @{
Histo1DPtr _h[4];
int _pid;
/// @}

};

RIVET_DECLARE_PLUGIN(BELLE_2011_I916712);

} ```