Rivet analyses referenceARGUS_1991_I315058$\gamma\gamma\to \rho^+\rho^-$ between 1.2 and 2.2 GeVExperiment: ARGUS (DORIS) Inspire ID: 315058 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the cross section for $\gamma\gamma\to \rho^+\rho^-$ between 1.2 and 2.2 GeV Source code: ARGUS_1991_I315058.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 -> rho+ rho-
10 class ARGUS_1991_I315058 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1991_I315058);
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,1.2,2.2)) {
27 for (unsigned int ix=0; ix<3; ++ix) {
28 book(_c[ix],"TMP/nMeson_"+toString(ix+1));
29 }
30 }
31 else {
32 throw Error("Invalid CMS energy for ARGUS_1991_I315058");
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 bool foundRes=false;
59 // find any rho mesons
60 Particles rho=apply<UnstableParticles>(event, "UFS").particles(Cuts::abspid==213);
61 for (unsigned int ix=0;ix<rho.size();++ix) {
62 if (rho[ix].children().empty()) continue;
63 map<long,int> nRes=nCount;
64 int ncount = ntotal;
65 findChildren(rho[ix],nRes,ncount);
66 bool matched = false;
67 for (unsigned int iy=ix+1;iy<rho.size();++iy) {
68 if (rho[iy].children().empty()) continue;
69 if (rho[ix].pid()!=-rho[iy].pid()) continue;
70 map<long,int> nRes2=nRes;
71 int ncount2 = ncount;
72 findChildren(rho[iy],nRes2,ncount2);
73 if (ncount2 !=0 ) continue;
74 matched=true;
75 for (auto const & val : nRes2) {
76 if (val.second!=0) {
77 matched = false;
78 break;
79 }
80 }
81 if (matched) {
82 break;
83 }
84 }
85 if (matched) {
86 _c[0]->fill();
87 foundRes=true;
88 break;
89 }
90 else {
91 int sign = rho[ix].pid()/rho[ix].abspid();
92 bool matched2=true;
93 for (const auto& val : nRes) {
94 if (val.first==-sign*211 || val.first==111) {
95 if (val.second!=1) {
96 matched2 = false;
97 break;
98 }
99 }
100 else {
101 if (val.second!=0) {
102 matched2 = false;
103 break;
104 }
105 }
106 }
107 if (matched2) {
108 _c[1]->fill();
109 foundRes=true;
110 break;
111 }
112 }
113 }
114 // 4 pion final-state
115 if (ntotal==4) {
116 if (nCount[PID::PIPLUS]==1 && nCount[PID::PIMINUS]==1 && nCount[PID::PI0]==2) {
117 if (!foundRes) _c[2]->fill();
118 }
119 }
120 }
121
122
123 /// Normalise histograms etc., after the run
124 void finalize() {
125 scale(_c, crossSection()/nanobarn/sumOfWeights());
126 // loop over tables in paper
127 for (unsigned int ix=0; ix<3; ++ix) {
128 Estimate1DPtr mult;
129 book(mult, 1, 1, 1+ix);
130 for (auto& b : mult->bins()) {
131 if (inRange(sqrtS(), b.xMin(), b.xMax())) {
132 b.set(_c[ix]->val(), _c[ix]->err());
133 }
134 }
135 }
136 }
137
138 /// @}
139
140
141 /// @name Histograms
142 /// @{
143 CounterPtr _c[3];
144 /// @}
145
146
147 };
148
149
150 RIVET_DECLARE_PLUGIN(ARGUS_1991_I315058);
151
152}
|