rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2015_I1393996

$e^+e^-\to (DD^*)^0\pi^0$ for $\sqrt{s}=4.226$ and 4.257 GeV
Experiment: BESIII (BEPC)
Inspire ID: 1393996
Status: VALIDATED NOHEPDATA SINGLEWEIGHT
Authors:
  • Peter Richardson
References:
  • Phys.Rev.Lett. 115 (2015) 22, 222002
Beams: e+ e-
Beam energies: (2.1, 2.1); (2.1, 2.1) GeV
Run details:
  • e+ e- to hadrons, pi0 set stable

Measurement of mass distributions for $e^+e^-\to (DD^*)^0\pi^0$ for $\sqrt{s}=4.226$ and 4.257 GeV by BES. The cross section for $e^+e^-\to Z_c(3885)^0\pi^0\to (DD^*)^0\pi^0$ is also measured. As there is no PDG code for the $Z_c(3885)^0$ we take it to be the first unused exotic $c\bar{c}$ value 9030443, although this can be changed using the PID option.

Source code: BESIII_2015_I1393996.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/FinalState.hh"
  4#include "Rivet/Projections/UnstableParticles.hh"
  5
  6namespace Rivet {
  7
  8
  9  /// @brief e+ e- > Z0 pi0
 10  class BESIII_2015_I1393996 : public Analysis {
 11  public:
 12
 13    /// Constructor
 14    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2015_I1393996);
 15
 16
 17    /// @name Analysis methods
 18    /// @{
 19
 20    /// Book histograms and initialise projections before the run
 21    void init() {
 22      // set the PDG code
 23      _pid = getOption<double>("PID", 9030443);
 24      // projections
 25      declare(FinalState(), "FS");
 26      // histograms
 27      if (isCompatibleWithSqrtS(4.226)) {
 28        for (unsigned int ix=0; ix<2; ++ix) {
 29          book(_h[ix], 2, ix+1, 2);
 30        }
 31        _ecms = "4.226";
 32      }
 33      else if (isCompatibleWithSqrtS(4.257)) {
 34        for (unsigned int ix=0; ix<2; ++ix) {
 35          book(_h[ix], 2, ix+1, 1);
 36        }
 37        _ecms = "4.257";
 38      }
 39      book(_h[2],3,1,1);
 40      book(_sigma,1,1,1);
 41    }
 42
 43
 44    /// Perform the per-event analysis
 45    void analyze(const Event& event) {
 46      Particles fs = apply<FinalState>(event, "FS").particles();
 47      Particles DD, other;
 48      for (const Particle& p : fs) {
 49        Particle parent=p;
 50        while (!parent.parents().empty()) {
 51          parent=parent.parents()[0];
 52          if (parent.abspid()==411 || parent.abspid()==413 ||
 53              parent.abspid()==421 || parent.abspid()==423) break;
 54        }
 55        if ((parent.abspid()==411 || parent.abspid()==421)
 56         && !parent.parents().empty()) {
 57          Particle Dstar = parent.parents()[0];
 58          if (Dstar.abspid()==413 || Dstar.abspid()==423)  parent=Dstar;
 59        }
 60        if (parent.abspid()==411 || parent.abspid()==413 ||
 61            parent.abspid()==421 || parent.abspid()==423) {
 62          bool found=false;
 63          for (const auto& D : DD) {
 64            // D already in list
 65            if (fuzzyEquals(D.mom(), parent.mom())) {
 66              found=true;
 67              break;
 68            }
 69          }
 70          if (!found) DD.push_back(parent);
 71        }
 72        else {
 73          other.push_back(p);
 74        }
 75      }
 76      // D Dbar + neutral pion
 77      if (DD.size()!=2 || other.size()!=1) vetoEvent;
 78      if (DD[0].pid()*DD[1].pid()>0) vetoEvent;
 79      if (other[0].pid()!=111) vetoEvent;
 80      // D pi mass greater than 2.1
 81      for (unsigned int ix=0;ix<2;++ix) {
 82        if (DD[ix].abspid()%10==1 && (DD[ix].momentum()+other[0].momentum()).mass()<2.1) vetoEvent;
 83      }
 84      double mass = (DD[0].momentum()+DD[1].momentum()).mass();
 85      unsigned int iloc=0;
 86      // D+ D*+
 87      if ((DD[0].abspid()==413 && DD[1].abspid()==411) ||
 88          (DD[1].abspid()==413 && DD[0].abspid()==411)) {
 89        iloc=0;
 90      }
 91      // D0 D*0
 92      else if((DD[0].abspid()==423 && DD[1].abspid()==421) ||
 93	      (DD[1].abspid()==423 && DD[0].abspid()==421)) {
 94        iloc=1;
 95      }
 96      // otherwise veto event
 97      else vetoEvent;
 98      _h[iloc]->fill(mass);
 99      _h[2]->fill(mass);
100      // parent Z0
101      if (DD[0].parents()[0].pid()==_pid && DD[1].parents()[0].pid()==_pid &&
102	        fuzzyEquals(DD[0].parents()[0].momentum(),DD[1].parents()[0].momentum()) ) _sigma->fill(_ecms);
103    }
104
105
106    /// Normalise histograms etc., after the run
107    void finalize() {
108      // distributions
109      normalize(_h, 1.0, false);
110      // cross section
111      scale(_sigma,crossSection()/ sumOfWeights() /picobarn);
112    }
113
114    /// @}
115
116
117    /// @name Histograms
118    /// @{
119    BinnedHistoPtr<string> _sigma;
120    Histo1DPtr _h[3];
121    int _pid;
122    string _ecms;
123    /// @}
124
125
126  };
127
128
129  RIVET_DECLARE_PLUGIN(BESIII_2015_I1393996);
130
131}