Rivet analyses

Helicity angles in B → Ds1+(2536), B → ψ(3770)K and B → X(3872)K

Experiment: BABAR (PEP-II)

Inspire ID: 758167

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.D 77 (2008) 011102

Beams: * *

Beam energies: ANY

Run details: - Any process producing B mesons, originally Upsilon(4S)

Measurement of helicity angles in B → Ds1+(2536), B → ψ(3770)K and B → X(3872)K decays using B → (*)D(*)K modes. The background subtracted, efficiency corrected distributions were read from Figure 1 in the paper. 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:BABAR_2008_I758167.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {


  /// @brief B -> D(*) D(*) K
  class BABAR_2008_I758167 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2008_I758167);


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

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

    bool isK(int id) {
      return id == 321 || id == 311 || id == 310 || id == 130;
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      UnstableParticles ufs = apply<UnstableParticles>(event, "UFS");
      for (const Particle& B : ufs.particles()) {
        if (B.children().size() != 2) continue;
        int sign = B.pid() / B.abspid(), iD = B.abspid() - 100;
        unsigned int imode = 0;
        // boost to B rest frame
        LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(B.momentum().betaVec());
        Particle resonance;
        if (B.children()[0].pid() == sign * 10433 && B.children()[1].pid() == -sign * iD) {
          imode = 0;
          resonance = B.children()[0];
        }
        else if (B.children()[1].pid() == sign * 10433 && B.children()[0].pid() == -sign * iD) {
          imode = 0;
          resonance = B.children()[1];
        }
        else if (B.children()[0].pid() == 30443 && isK(B.children()[1].pid())) {
          imode = 1;
          resonance = B.children()[0];
        }
        else if (B.children()[1].pid() == 30443 && isK(B.children()[0].pid())) {
          imode = 1;
          resonance = B.children()[1];
        }
        else if (B.children()[0].pid() == _pid && isK(B.children()[1].pid())) {
          imode = 2;
          resonance = B.children()[0];
        }
        else if (B.children()[1].pid() == _pid && isK(B.children()[0].pid())) {
          imode = 2;
          resonance = B.children()[1];
        }
        else
          continue;
        if (resonance.children().size() != 2) continue;
        FourMomentum pRes = boost1.transform(resonance.momentum());
        LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pRes.betaVec());
        Vector3 axis1 = -pRes.p3().unit();
        Particle child;
        if (imode == 0) {
          Particle Dstar;
          if (isK(resonance.children()[1].pid())
              && (resonance.children()[0].pid() == sign * 413 || resonance.children()[0].pid() == sign * 423))
            child = resonance.children()[0];
          else if (isK(resonance.children()[0].pid())
                   && (resonance.children()[1].pid() == sign * 413
                       || resonance.children()[1].pid() == sign * 423))
            child = resonance.children()[1];
          else
            continue;
        }
        // B -> D psi(3770)
        else if (imode == 1) {
          if (resonance.children()[0].pid() != -resonance.children()[1].pid()) continue;
          if (resonance.children()[0].abspid() != 411 && resonance.children()[0].abspid() != 421) continue;
          child = resonance.children()[0].pid() > 0 ? resonance.children()[0] : resonance.children()[1];
        }
        else if (imode == 2) {
          if ((resonance.children()[0].abspid() == 423 && resonance.children()[1].abspid() == 421)
              || (resonance.children()[1].abspid() == 423 && resonance.children()[0].abspid() == 421)) {
            child = resonance.children()[0].pid() > 0 ? resonance.children()[0] : resonance.children()[1];
          }
          else
            continue;
        }
        Vector3 axis2 = boost2.transform(boost1.transform(child.momentum())).p3().unit();
        _h[imode]->fill(axis1.dot(axis2));
      }
    }


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

    /// @}


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


  RIVET_DECLARE_PLUGIN(BABAR_2008_I758167);

}