Rivet analyses referenceARGUS_1997_I420421$\gamma\gamma\to\pi^+\pi^-\pi^0$ between 0.8 and 2.1 GeVExperiment: ARGUS (DORIS) Inspire ID: 420421 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the differential cross section for $\gamma\gamma\to\pi^+\pi^-\pi^0$for $0.8 \text{GeV} < W < 2.1 \text{GeV}$. The cross section is measured as a function of the centre-of-mass energy of the photonic collision for the final, and a range of intermediate states. Source code: ARGUS_1997_I420421.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 gamma gamma -> pi+pi-pi0
10 class ARGUS_1997_I420421 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1997_I420421);
15
16
17 /// @name Analysis methods
18 /// @{
19
20 /// Book histograms and initialise projections before the run
21 void init() {
22 // Initialise and register projections
23 declare(FinalState(), "FS");
24 declare(UnstableParticles(), "UFS");
25 // book histos
26 if (inRange(sqrtS()/GeV, 0.8, 2.1)) {
27 for (unsigned int ix=0; ix<5; ++ix) {
28 book(_nMeson[ix], "TMP/nMeson_"+toString(ix+1));
29 }
30 }
31 else {
32 throw Error("Invalid CMS energy for ARGUS_1997_I420421");
33 }
34 }
35
36 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
37 for (const Particle &child : p.children()) {
38 if (child.children().empty()) {
39 nRes[child.pid()]-=1;
40 --ncount;
41 }
42 else {
43 findChildren(child,nRes,ncount);
44 }
45 }
46 }
47
48 /// Perform the per-event analysis
49 void analyze(const Event& event) {
50 const FinalState& fs = apply<FinalState>(event, "FS");
51 // find the final-state particles
52 map<long,int> nCount;
53 int ntotal(0);
54 for (const Particle& p : fs.particles()) {
55 nCount[p.pid()] += 1;
56 ++ntotal;
57 }
58 // check the 3 meson final state
59 if (ntotal!=3) vetoEvent;
60 if ( nCount[PID::PI0]==1 && nCount[PID::PIPLUS]==1 && nCount[PID::PIMINUS]==1 ) {
61 _nMeson[0]->fill();
62 }
63 else vetoEvent;
64 // now the intermediate states
65 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
66 // f0 and f2 mesons and rho
67 bool nonRes=true;
68 for (const Particle & p : ufs.particles(Cuts::pid==225 ||
69 Cuts::pid==9010221 ||
70 Cuts::abspid==213)) {
71 map<long,int> nRes=nCount;
72 int ncount = ntotal;
73 findChildren(p,nRes,ncount);
74 int sign = p.pid()/p.abspid();
75 // id of the pion not from the resonance decay
76 int idother = p.abspid()==213 ? -sign*211 : 111;
77 bool matched=true;
78 for (const auto& val : nRes) {
79 if (val.first==idother) {
80 if (val.second!=1) {
81 matched = false;
82 break;
83 }
84 }
85 else {
86 if (val.second!=0) {
87 matched = false;
88 break;
89 }
90 }
91 }
92 if (matched) {
93 nonRes=false;
94 if (p.abspid()==213) {
95 _nMeson[2]->fill();
96 }
97 else if (p.pid()==225) {
98 _nMeson[3]->fill();
99 }
100 else {
101 _nMeson[4]->fill();
102 }
103 break;
104 }
105 }
106 if (nonRes) _nMeson[1]->fill();
107 }
108
109
110 /// Normalise histograms etc., after the run
111 void finalize() {
112 scale(_nMeson, crossSection()/nanobarn/sumOfWeights());
113 // loop over tables in paper
114 for (unsigned int ix=0; ix<5; ++ix) {
115 unsigned int iy=1;
116 if (ix==2) iy=5;
117 else if (ix==3) iy=3;
118 Estimate1DPtr mult;
119 book(mult, ix+1, 1, iy);
120 for (auto& b : mult->bins()) {
121 if (inRange(sqrtS()/MeV, b.xMin(), b.xMax())) {
122 b.setVal(_nMeson[ix]->val());
123 b.setErr(_nMeson[ix]->err());
124 }
125 }
126 }
127 }
128
129 /// @}
130
131
132 /// @name Histograms
133 /// @{
134 CounterPtr _nMeson[5];
135 /// @}
136
137
138 };
139
140
141 RIVET_DECLARE_PLUGIN(ARGUS_1997_I420421);
142
143}
|