Rivet analyses referenceCLEOII_1997_I439745Measurement of the cross section for $\gamma\gamma\to\Lambda^0\bar{\Lambda^0}$Experiment: CLEOII (CESR) Inspire ID: 439745 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (5.3, 5.3); (1.2, 1.2); (1.2, 1.2); (1.3, 1.3); (1.4, 1.4); (1.6, 1.6) GeV Run details:
Measurement of the cross section for $\gamma\gamma\to\Lambda^0\bar{\Lambda^0}$. The cross section for $\gamma\gamma$ collisions as a funmction of the $gamma\gamma$ centre-of-mass energy is provided, together with the total cross section for the production in $e^+e^-$ via the $\gamma\gamma$ process. Source code: CLEOII_1997_I439745.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 gamma gamma -> Lambda0 Lambdabar0
11 class CLEOII_1997_I439745 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(CLEOII_1997_I439745);
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(Cuts::abspid==3122 || Cuts::abspid==3212), "UFS");
27 // gamma gamma collision
28 if (beamIDs().first==22 && beamIDs().second==22) book(_c,"TMP/nLam",refData(1,1,1));
29 else {
30 for (unsigned int ix=0; ix<2; ++ix) {
31 book(_h_sigma[ix], 2+ix, 1, 1);
32 }
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()];
40 --ncount;
41 } else {
42 findChildren(child,nRes,ncount);
43 }
44 }
45 }
46
47 bool findScattered(const Particle& beam, double& q2) {
48 bool found = false;
49 Particle scat = beam;
50 while (!scat.children().empty()) {
51 found = false;
52 for (const Particle & p : scat.children()) {
53 if (p.pid()==scat.pid()) {
54 scat=p;
55 found=true;
56 break;
57 }
58 }
59 if (!found) break;
60 }
61 if (!found) return false;
62 q2 = -(beam.mom() - scat.mom()).mass2();
63 return true;
64 }
65
66
67 /// Perform the per-event analysis
68 void analyze(const Event& event) {
69 // e+e- collision
70 int ne=0;
71 const Beam& beams = apply<Beam>(event, "Beams");
72 if (_h_sigma[0]) {
73 // find scattered leptons and calc Q2
74 double q12 = -1, q22 = -1;
75 if (!findScattered(beams.beams().first, q12)) vetoEvent;
76 if (!findScattered(beams.beams().second, q22)) vetoEvent;
77 ne=1;
78 }
79 // check the final state
80 const FinalState& fs = apply<FinalState>(event, "FS");
81 map<long,int> nCount;
82 int ntotal(0);
83 for (const Particle& p : fs.particles()) {
84 nCount[p.pid()] += 1;
85 ++ntotal;
86 }
87 const FinalState& ufs = apply<FinalState>(event, "UFS");
88 Particle Lambda,Lambar;
89 // loop over baryon
90 bool matched = false;
91 for (const Particle& p : ufs.particles()) {
92 if (p.children().empty() || p.pid()<0) continue;
93 map<long,int> nRes = nCount;
94 int ncount = ntotal;
95 findChildren(p,nRes,ncount);
96 // and antibaryons
97 for (const Particle& p2 : ufs.particles()) {
98 if (p2.children().empty() || p2.pid()>0) continue;
99 map<long,int> nRes2 = nRes;
100 int ncount2 = ncount;
101 findChildren(p2,nRes2,ncount2);
102 if(ncount2!=2*ne) continue;
103 matched=2;
104 for (const auto& val : nRes2) {
105 if(abs(val.first)==11) {
106 if(val.second!=ne) {
107 matched = false;
108 break;
109 }
110 }
111 else if (val.second!=0) {
112 matched = false;
113 break;
114 }
115 }
116 if (matched) {
117 Lambda=p;
118 Lambar=p2;
119 break;
120 }
121 }
122 }
123 if (!matched) vetoEvent;
124 if (_h_sigma[0]) {
125 FourMomentum pCMS = Lambda.mom()+Lambar.mom();
126 Vector3 axis = pCMS.p3().unit();
127 LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(pCMS.betaVec());
128 if (abs(boost.transform(Lambda.mom()).p3().unit().dot(axis))>0.6) vetoEvent;
129 if (abs(boost.transform(Lambar.mom()).p3().unit().dot(axis))>0.6) vetoEvent;
130 _h_sigma[0]->fill("10.6"s);
131 if (Lambda.pid()==3122 && Lambar.pid()==-3122) _h_sigma[1]->fill("10.6"s);
132 }
133 else {
134 Vector3 axis = beams.beams().first.mom().p3().unit();
135 if (abs(axis.dot(Lambda.mom().p3().unit()))>0.6) vetoEvent;
136 if (abs(axis.dot(Lambar.mom().p3().unit()))>0.6) vetoEvent;
137 if (Lambda.pid()==3122 && Lambar.pid()==-3122) _c->fill(sqrtS()/GeV);
138 }
139 }
140
141
142 /// Normalise histograms etc., after the run
143 void finalize() {
144 if (_h_sigma[0]) {
145 scale(_h_sigma, crossSection()/picobarn/sumOfWeights());
146 }
147 else {
148 scale(_c, crossSection()/nanobarn/sumOfWeights());
149 Estimate1DPtr tmp;
150 book(tmp,1,1,1);
151 barchart(_c,tmp);
152 }
153 }
154
155 /// @}
156
157
158 /// @name Histograms
159 /// @{
160 Histo1DPtr _c;
161 BinnedHistoPtr<string> _h_sigma[2];
162 /// @}
163
164
165 };
166
167
168 RIVET_DECLARE_PLUGIN(CLEOII_1997_I439745);
169
170}
|