Rivet analyses referenceCLEO_1994_I358510$\gamma\gamma\to p \bar{p}$ for centre-of-mass energies between 2 and 3.25 GeVExperiment: CLEO (CESR) Inspire ID: 358510 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the differential cross section for $\gamma\gamma\to p \bar{p}$ for $2 \text{GeV} < W < 3.25 \text{GeV}$. Both the cross section as a function of the centre-of-mass energy of the photonic collision, and the differential cross section with respect to the proton scattering angle are measured. Source code: CLEO_1994_I358510.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/FinalState.hh"
4
5namespace Rivet {
6
7
8 /// @brief gamma gamma -> p pbar
9 class CLEO_1994_I358510 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(CLEO_1994_I358510);
14
15
16 /// @name Analysis methods
17 /// @{
18
19 /// Book histograms and initialise projections before the run
20 void init() {
21 // Initialise and register projections
22 declare(FinalState(), "FS");
23 // book histos
24 if(inRange(sqrtS()/GeV,2.,3.25)) {
25 if (sqrtS()<=2.5) {
26 book(_h_cTheta,2,1,1);
27 }
28 else if (sqrtS()<=3.) {
29 book(_h_cTheta,3,1,1);
30 }
31 book(_cProton, "TMP/sigma", refData(1, 1, 1));
32 }
33 else {
34 throw Error("Invalid CMS energy for CLEO_1994_I358510");
35 }
36 _axis = YODA::Axis<double>({0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6});
37 }
38
39
40 /// Perform the per-event analysis
41 void analyze(const Event& event) {
42 if (_h_cTheta && _edges.empty()) _edges = _h_cTheta->xEdges();
43 Particles part = apply<FinalState>(event,"FS").particles();
44 if(part.size()!=2) vetoEvent;
45 double cTheta(0.);
46 bool foundP(false),foundM(false);
47 for (const Particle& p : part) {
48 if (p.pid()==PID::PROTON) {
49 foundP=true;
50 cTheta = abs(p.momentum().z()/p.momentum().p3().mod());
51 }
52 else if (p.pid()==PID::ANTIPROTON) {
53 foundM=true;
54 }
55 }
56 if (!foundP || !foundM) vetoEvent;
57 if (cTheta<=0.6) _cProton->fill(sqrtS()/GeV);
58 if (_h_cTheta) _h_cTheta->fill(disc(cTheta));
59 }
60
61
62 string disc(const double value) const {
63 size_t idx = _axis.index(value);
64 if (0 < idx && idx <= _axis.numBins()) return _edges[idx-1];
65 return "OTHER"s;
66 }
67
68
69 /// Normalise histograms etc., after the run
70 void finalize() {
71 const double fact = crossSection()/nanobarn/sumOfWeights();
72 if (_h_cTheta) {
73 scale(_h_cTheta,fact);
74 for(auto & b : _h_cTheta->bins()) {
75 const size_t idx = b.index();
76 b.scaleW(1./_axis.width(idx));
77 }
78 }
79 scale(_cProton, fact);
80 Estimate1DPtr tmp;
81 book(tmp,1,1,1);
82 barchart(_cProton,tmp);
83 }
84
85 /// @}
86
87
88 /// @name Histograms
89 /// @{
90 BinnedHistoPtr<string> _h_cTheta;
91 Histo1DPtr _cProton;
92 YODA::Axis<double> _axis;
93 vector<string> _edges;
94 /// @}
95
96
97 };
98
99
100 RIVET_DECLARE_PLUGIN(CLEO_1994_I358510);
101
102}
|