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