Rivet analyses


title: BESIII_2011_I894356

Helicity angle distributions in $\chi_{c1}\to \gamma +(\phi,\rho,\omega)$

Experiment: BESIII (BEPC)

Inspire ID: 894356

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.D 83 (2011) 112005

Beams: * *

Beam energies: ANY

Run details: - Any process producing chi_c1, originally e+e- -> psi(2S)

Measurement of the helicity angles in the decays $\chi_{c1}\to \gamma +(\phi,\rho,\omega)$. The data were read from the plots in the paper amnd may not be corrected for efficiency/acceptance, however the backgrounds given in the paper have been subtracted.

Source code:BESIII_2011_I894356.cc

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

include "Rivet/Analysis.hh"

include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {

/// @brief chi_c1 -> gamma +V class BESIII_2011_I894356 : public Analysis { public:

/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2011_I894356);


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

/// Book histograms and initialise projections before the run
void init() {
  // projections
  declare(UnstableParticles(Cuts::pid == 20443), "UFS");
  // histograms
  for (unsigned int ix = 0; ix < 3; ++ix) book(_h[ix], 1, 1, 1 + ix);
}

void findChildren(const Particle& p,
                  Particles& pim,
                  Particles& pip,
                  Particles& pi0,
                  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::PI0) {
      pi0.push_back(child);
      ncount += 1;
    }
    else if (child.children().empty()) {
      ncount += 1;
    }
    else
      findChildren(child, pim, pip, pi0, ncount);
  }
}

/// Perform the per-event analysis
void analyze(const Event& event) {
  for (const Particle& p : apply<UnstableParticles>(event, "UFS").particles()) {
    if (p.children().size() != 2) continue;
    Particle gamma, meson;
    // get the photon and the meson
    if (p.children()[0].pid() == PID::PHOTON) {
      gamma = p.children()[0];
      meson = p.children()[1];
    }
    else if (p.children()[1].pid() == PID::PHOTON) {
      gamma = p.children()[1];
      meson = p.children()[0];
    }
    else
      continue;
    // check the meson
    int imode = -1;
    if (meson.pid() == 333)
      imode = 0;
    else if (meson.pid() == 113)
      imode = 1;
    else if (meson.pid() == 223)
      imode = 2;
    else
      continue;
    Particle d1, d2, d3;
    if (imode == 0) {
      if (meson.children().size() != 2) continue;
      if (meson.children()[0].pid() == -meson.children()[1].pid()
          && meson.children()[0].abspid() == 321) {
        d1 = meson.children()[0];
        d2 = meson.children()[0];
      }
      else
        continue;
    }
    else if (imode == 1) {
      if (meson.children().size() != 2) continue;
      if (meson.children()[0].pid() == -meson.children()[1].pid()
          && meson.children()[0].abspid() == 211) {
        d1 = meson.children()[0];
        d2 = meson.children()[0];
      }
      else
        continue;
    }
    else if (imode == 2) {
      unsigned int ncount = 0;
      Particles pip, pim, pi0;
      findChildren(meson, pim, pip, pi0, ncount);
      if (ncount == 3 && pim.size() == 1 && pip.size() == 1 && pi0.size() == 1) {
        d1 = pip[0];
        d2 = pim[0];
        d3 = pi0[0];
      }
      else
        continue;
    }
    if (d1.pid() < 0) swap(d1, d2);
    // boost in chi_c1 frame
    LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
    FourMomentum pMeson = boost1.transform(meson.momentum());
    FourMomentum p1 = boost1.transform(d1.momentum());
    FourMomentum p2 = boost1.transform(d2.momentum());
    Vector3 axis1 = pMeson.p3().unit();
    LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pMeson.betaVec());
    p1 = boost2.transform(p1);
    p2 = boost2.transform(p2);
    // axis in meson rest frame
    Vector3 axis2;
    if (imode < 2) {
      axis2 = p1.p3().unit();
    }
    else {
      FourMomentum p3 = boost1.transform(d3.momentum());
      p3 = boost2.transform(p3);
      axis2 = p1.p3().cross(p2.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
/// @{
Histo1DPtr _h[3];
/// @}

};

RIVET_DECLARE_PLUGIN(BESIII_2011_I894356);

} ```