Rivet analyses referenceCLEOII_1997_I446031$e^+e^-\to e^+e^-\pi^0, \eta, \eta^\prime$ via intermediate photons at 10.58 GeVExperiment: CLEOII (CESR) Inspire ID: 446031 Status: VALIDATED Authors:
Beam energies: (5.3, 5.3) GeV Run details:
Measurement of the cross sections for the production of $\pi^0, \eta, \eta^\prime$ in photon-photon collisions, i.e. $e^+e^-\to \gamma\gamma e^+e^-$ followed by $\gamma\gamma\to\pi^0, \eta, \eta^\prime$, by the CLEO II experiment at 10.58 GeV Source code: CLEOII_1997_I446031.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4#include "Rivet/Projections/UnstableParticles.hh"
5#include "Rivet/Projections/Beam.hh"
6
7namespace Rivet {
8
9
10 /// @brief CLEO e+e- > e+e- pi0,eta,eta'
11 class CLEOII_1997_I446031 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(CLEOII_1997_I446031);
16
17
18 /// @name Analysis methods
19 /// @{
20
21 /// Book histograms and initialise projections before the run
22 void init() {
23
24 // Initialise and register projections
25 declare(Beam(), "Beams");
26 declare(FinalState(),"FS");
27 declare(UnstableParticles(), "UFS");
28
29 // book the histograms
30 book(_h_pi0,1,1,1);
31 for (unsigned int ix=0; ix<3; ++ix) book(_h_eta [ix],ix+2,1,1);
32 for (unsigned int ix=0; ix<6; ++ix) book(_h_etap[ix],ix+5,1,1);
33 }
34
35
36 /// Perform the per-event analysis
37 void analyze(const Event& event) {
38 // find scattered leptons and calc Q2
39 const Beam& beams = apply<Beam>(event, "Beams");
40 double q12 = -1, q22 = -1;
41 if (!findScattered(beams.beams().first, q12)) vetoEvent;
42 if (!findScattered(beams.beams().second, q22)) vetoEvent;
43 double scale = max(q12,q22);
44 // check the final state
45 const FinalState & fs = apply<FinalState>(event, "FS");
46 map<long,int> nCount;
47 int ntotal(0);
48 for (const Particle& p : fs.particles()) {
49 nCount[p.pid()] += 1;
50 ++ntotal;
51 }
52 // find the meson
53 const FinalState& ufs = apply<FinalState>(event, "UFS");
54 for (const Particle& p : ufs.particles(Cuts::pid==111 or
55 Cuts::pid==221 or
56 Cuts::pid==331)) {
57 if(p.children().empty()) continue;
58 map<long,int> nRes = nCount;
59 int ncount = ntotal;
60 findChildren(p,nRes,ncount);
61 bool matched = true;
62 for(auto const & val : nRes) {
63 if(abs(val.first)==11) {
64 if(val.second!=1) {
65 matched = false;
66 break;
67 }
68 }
69 else if(val.second!=0) {
70 matched = false;
71 break;
72 }
73 }
74 if (matched) {
75 if (p.pid()==111) {
76 _h_pi0->fill(scale);
77 } else if (p.pid()==221) {
78 for (unsigned int ix=0; ix<3; ++ix)
79 _h_eta[ix]->fill(scale);
80 } else if(p.pid()==331) {
81 for (unsigned int ix=0; ix<6; ++ix)
82 _h_etap[ix]->fill(scale);
83 }
84 break;
85 }
86 }
87 }
88
89
90 /// Normalise histograms etc., after the run
91 void finalize() {
92 // normalize the cross sections
93 scale(_h_pi0, crossSection()/femtobarn/sumW());
94 for(unsigned int ix=0;ix<3;++ix)
95 scale(_h_eta[ix], crossSection()/femtobarn/sumW());
96 for(unsigned int ix=0;ix<6;++ix)
97 scale(_h_etap[ix], crossSection()/femtobarn/sumW());
98 }
99
100 /// @}
101
102
103 /// @name Helpers
104 /// @{
105
106 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
107 for (const Particle &child : p.children()) {
108 if (child.children().empty()) {
109 --nRes[child.pid()];
110 --ncount;
111 } else {
112 findChildren(child,nRes,ncount);
113 }
114 }
115 }
116
117
118 bool findScattered(Particle beam, double& q2) {
119 bool found = false;
120 Particle scat = beam;
121 while (!scat.children().empty()) {
122 found = false;
123 for (const Particle & p : scat.children()) {
124 if (p.pid()==scat.pid()) {
125 scat=p;
126 found=true;
127 break;
128 }
129 }
130 if (!found) break;
131 }
132 if (!found) return false;
133 q2 = -(beam.momentum() - scat.momentum()).mass2();
134 return true;
135 }
136
137 /// @}
138
139
140 /// @name Histograms
141 /// @{
142 Histo1DPtr _h_pi0,_h_eta[3],_h_etap[6];
143 /// @}
144
145 };
146
147
148 RIVET_DECLARE_PLUGIN(CLEOII_1997_I446031);
149
150}
|