Rivet analyses referenceARGUS_1989_I266416$\gamma\gamma\to \rho^+\rho^-$ between 0.8 and 3.4 GeVExperiment: ARGUS (DORIS) Inspire ID: 266416 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the differential cross section for $\gamma\gamma\to \rho^+\rho^-$ for $0.8 \text{GeV} < W < 3.4 \text{GeV}$. The cross section is measured as a function of the centre-of-mass energy of the photonic collision using the $\pi^+\pi^-\pi^0\pi^0$ final state. Source code: ARGUS_1989_I266416.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_1989_I266416 : public Analysis {
11 public:
12
13 /// Constructor
14 RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1989_I266416);
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,3.4)) {
27 for (unsigned int ix=0; ix<4; ++ix) {
28 book(_nMeson[ix],"TMP/nMeson_"+toString(ix+1));
29 }
30 }
31 else {
32 throw Error("Invalid CMS energy for ARGUS_1989_I266416");
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 _nMeson[1]->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 _nMeson[2]->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 _nMeson[0]->fill();
118 if (!foundRes) _nMeson[3]->fill();
119 }
120 }
121 }
122
123
124 /// Normalise histograms etc., after the run
125 void finalize() {
126 scale(_nMeson, crossSection()/nanobarn/sumOfWeights());
127 // loop over tables in paper
128 for (unsigned int ix=0; ix<4; ++ix) {
129 BinnedEstimatePtr<string> mult;
130 book(mult, ix+1, 1, 1);
131 for (auto& b : mult->bins()) {
132 if (isCompatibleWithSqrtS(std::stod(b.xEdge())/GeV)) {
133 b.setVal(_nMeson[ix]->val());
134 b.setErr(_nMeson[ix]->err());
135 }
136 }
137 }
138 }
139
140 /// @}
141
142
143 /// @name Histograms
144 /// @{
145 CounterPtr _nMeson[4];
146 /// @}
147
148
149 };
150
151
152 RIVET_DECLARE_PLUGIN(ARGUS_1989_I266416);
153
154}
|