Rivet analyses referenceBESIII_2015_I1393996$e^+e^-\to (DD^*)^0\pi^0$ for $\sqrt{s}=4.226$ and 4.257 GeVExperiment: BESIII (BEPC) Inspire ID: 1393996 Status: VALIDATED NOHEPDATA SINGLEWEIGHT Authors:
Beam energies: (2.1, 2.1); (2.1, 2.1) GeV Run details:
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}
|