Rivet analyses

X(3872) mass and angular distributions using B → 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 → KX(3872). There is no consensus as to the nature of the X(3872) c state and therefore we taken its PDG code to be 9030443, i.e. the first unused code for an undetermined spin one 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++ -*-
#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);

}