Rivet analyses referenceARGUS_1989_I267759$\gamma\gamma\to p \bar{p}$ for centre-of-mass energies between 2 and 2.9 GeVExperiment: ARGUS (DORIS) Inspire ID: 267759 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 < 2.9\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. There are other measurements in the original paper but the final-state cuts are not clear for these and therefore they are not implemented. Source code: ARGUS_1989_I267759.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 ARGUS_1989_I267759 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(ARGUS_1989_I267759);
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.,2.9)) {
25 book(_h_cTheta, 1, 1, 1);
26 book(_cProton,"TMP/nProton");
27 }
28 else {
29 throw Error("Invalid CMS energy for ARGUS_1989_I267759");
30 }
31 _axis = YODA::Axis<double>({0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6});
32 }
33
34
35 /// Perform the per-event analysis
36 void analyze(const Event& event) {
37 if (_edges.empty()) _edges = _h_cTheta->xEdges();
38 Particles part = apply<FinalState>(event,"FS").particles();
39 if (part.size()!=2) vetoEvent;
40 double cTheta(0.);
41 bool foundP(false),foundM(false);
42 for (const Particle& p : part) {
43 if (p.pid() == PID::PROTON) {
44 foundP=true;
45 cTheta = abs(p.momentum().z()/p.momentum().p3().mod());
46 }
47 else if(p.pid()==PID::ANTIPROTON) {
48 foundM=true;
49 }
50 }
51 if (!foundP || !foundM) vetoEvent;
52 if (cTheta<=0.6) _cProton->fill();
53 if (_h_cTheta) _h_cTheta->fill(disc(cTheta));
54 }
55
56
57 string disc(const double value) const {
58 size_t idx = _axis.index(value);
59 if (0 < idx && idx <= _axis.numBins()) return _edges[idx-1];
60 return "OTHER"s;
61 }
62
63
64 /// Normalise histograms etc., after the run
65 void finalize() {
66 const double fact = crossSection()/nanobarn/sumOfWeights();
67 if (_h_cTheta) {
68 scale(_h_cTheta,fact);
69 for(auto & b : _h_cTheta->bins()) {
70 const size_t idx = b.index();
71 b.scaleW(1./_axis.width(idx));
72 }
73 }
74 scale(_cProton, fact);
75 Estimate1DPtr mult;
76 book(mult, 2, 1, 1);
77 for (auto& b : mult->bins()) {
78 if (inRange(sqrtS(), b.xMin(), b.xMax())) {
79 b.setVal(_cProton->val());
80 b.setErr(_cProton->err());
81 }
82 }
83 }
84
85 /// @}
86
87
88 /// @name Histograms
89 /// @{
90 BinnedHistoPtr<string> _h_cTheta;
91 CounterPtr _cProton;
92 YODA::Axis<double> _axis;
93 vector<string> _edges;
94 /// @}
95
96
97 };
98
99
100 RIVET_DECLARE_PLUGIN(ARGUS_1989_I267759);
101
102}
|