Rivet analyses referenceBELLE_2019_I1687566Transverse polarization of $\Lambda^0$ baryons in the continuum at 10.58 GeVExperiment: BELLE (KEKB) Inspire ID: 1687566 Status: VALIDATED Authors:
Beam energies: (5.3, 5.3) GeV Run details:
Measurement of the transverse polarization of $\Lambda^0$ ($\bar\Lambda^0$) in the $e^+e^-$ continuum at centre-of-mass energies near 10.58 GeV. The polarization is measured as a function of the momentum fraction and transverse momentum. The polarization is also measured for events with a $\pi^\pm$ or $K^\pm$ in the opposite hemisphere as a function of the momentum fractions of the $\Lambda^0$ and charged meson.The polarization as a function of the momentum fraction for $\Lambda^0$ baryons produced in $(uds)$ events, and for prompt $\Lambda^0$ and those from the decay of $\Sigma^0$ mesons is also measured. Source code: BELLE_2019_I1687566.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/Beam.hh"
4#include "Rivet/Projections/FinalState.hh"
5#include "Rivet/Projections/UnstableParticles.hh"
6#include "Rivet/Projections/Thrust.hh"
7
8#define I_KNOW_THE_INITIAL_QUARKS_PROJECTION_IS_DODGY_BUT_NEED_TO_USE_IT
9#include "Rivet/Projections/InitialQuarks.hh"
10
11namespace Rivet {
12
13
14 /// @brief Transverse Lambda polarization
15 class BELLE_2019_I1687566 : public Analysis {
16 public:
17
18 /// Constructor
19 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2019_I1687566);
20
21
22 /// @name Analysis methods
23 /// @{
24
25 /// Book histograms and initialise projections before the run
26 void init() {
27
28 // Initialise and register projections
29 declare(Beam(), "Beams");
30 const FinalState fs;
31 declare(fs, "FS");
32 declare(Thrust(fs),"Thrust");
33 declare(UnstableParticles(),"UFS");
34 declare(InitialQuarks(), "IQF");
35
36 // Book histograms
37 for(unsigned int ix=0;ix<4;++ix) {
38 book(_p_lam[ix] ,1,ix+1,1);
39 book(_p_bar[ix] ,1,ix+1,2);
40 book(_p_lam_pip[ix],2,ix+1,1);
41 book(_p_lam_pim[ix],2,ix+1,2);
42 book(_p_lam_Kp [ix],2,ix+1,3);
43 book(_p_lam_Km [ix],2,ix+1,4);
44 book(_p_bar_pip[ix],2,ix+1,5);
45 book(_p_bar_pim[ix],2,ix+1,6);
46 book(_p_bar_Kp [ix],2,ix+1,7);
47 book(_p_bar_Km [ix],2,ix+1,8);
48 }
49 book(_p_lam_inc ,3,1,1);
50 book(_p_lam_prompt,3,1,3);
51 book(_p_lam_sigma ,3,1,5);
52 book(_p_bar_inc ,3,1,2);
53 book(_p_bar_prompt,3,1,4);
54 book(_p_bar_sigma ,3,1,6);
55 }
56
57
58 /// Perform the per-event analysis
59 void analyze(const Event& event) {
60 static const double alpha=0.642;
61 static const double norm=3./alpha*100.;
62 // Get beams and average beam momentum
63 const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
64 const double meanBeamMom = ( beams.first.p3().mod() +
65 beams.second.p3().mod() ) / 2.0;
66
67 int flavour = 0;
68 const InitialQuarks& iqf = apply<InitialQuarks>(event, "IQF");
69
70 // If we only have two quarks (qqbar), just take the flavour.
71 // If we have more than two quarks, look for the highest energetic q-qbar pair.
72 if (iqf.particles().size() == 2) {
73 flavour = iqf.particles().front().abspid();
74 }
75 else {
76 map<int, double> quarkmap;
77 for (const Particle& p : iqf.particles()) {
78 if (quarkmap[p.pid()] < p.E()) {
79 quarkmap[p.pid()] = p.E();
80 }
81 }
82 double maxenergy = 0.;
83 for (int i = 1; i <= 5; ++i) {
84 if (quarkmap[i]+quarkmap[-i] > maxenergy) {
85 flavour = i;
86 }
87 }
88 }
89 // thrust, to define an axis
90 const Thrust& thrust = apply<Thrust>(event, "Thrust");
91 const UnstableParticles& ufs = apply<UnstableParticles>(event, "UFS");
92 const FinalState & fs = apply<FinalState>(event, "FS");
93
94 if(thrust.thrust()<0.8)
95 vetoEvent;
96 for(const Particle & lambda : ufs.particles(Cuts::abspid==3122)) {
97 int sign = lambda.pid()/3122;
98 if(lambda.children().size()!=2) continue;
99 // look at the decay products
100 Particle proton,pion;
101 if(lambda.children()[0].pid()==sign*2212 &&
102 lambda.children()[1].pid()==-sign*211) {
103 proton = lambda.children()[0];
104 pion = lambda.children()[1];
105 }
106 else if(lambda.children()[1].pid()==sign*2212 &&
107 lambda.children()[0].pid()==-sign*211) {
108 proton = lambda.children()[1];
109 pion = lambda.children()[0];
110 }
111 else
112 continue;
113 double xE = lambda.momentum().t()/meanBeamMom;
114 if(xE<0.2 || xE>0.9) continue;
115 Vector3 axis1 = lambda.momentum().p3().unit();
116 // transverse polarization
117 Vector3 axis2;
118 if(lambda.momentum().p3().dot(thrust.thrustAxis())>=0.) {
119 axis2 = thrust.thrustAxis();
120 }
121 else {
122 axis2 =-thrust.thrustAxis();
123 }
124 Vector3 axis3 = axis2.cross(axis1).unit();
125 // boost to the lambda rest frame
126 LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(lambda.momentum().betaVec());
127 FourMomentum pproton = boost.transform(proton.momentum());
128 int ibin=-1;
129 if(xE<=0.3)
130 ibin=0;
131 else if(xE<=0.4)
132 ibin=1;
133 else if(xE<=0.5)
134 ibin=2;
135 else if(xE<=0.9)
136 ibin=3;
137 double cTheta = axis3.dot(pproton.p3().unit())*norm;
138 double pT = sqrt(sqr(thrust.thrustMajorAxis().dot(lambda.momentum().p3()))+
139 sqr(thrust.thrustMinorAxis().dot(lambda.momentum().p3())));
140 bool prompt=true;
141 for(const Particle & parent : lambda.parents()) {
142 if(parent.abspid()==3212) {
143 prompt=false;
144 break;
145 }
146 }
147 // using thrust axis
148 if(sign>0) {
149 _p_lam_inc->fill(xE,cTheta);
150 _p_lam[ibin]->fill(pT,cTheta);
151 if(flavour<=3) {
152 if(prompt) _p_lam_prompt->fill(xE,cTheta);
153 else _p_lam_sigma ->fill(xE,cTheta);
154 }
155 }
156 else if(sign<0) {
157 _p_bar_inc->fill(xE,cTheta);
158 _p_bar[ibin]->fill(pT,cTheta);
159 if(flavour<=3) {
160 if(prompt) _p_bar_prompt->fill(xE,cTheta);
161 else _p_bar_sigma ->fill(xE,cTheta);
162 }
163 }
164 for(const Particle & p2 : fs.particles(Cuts::abspid==211 || Cuts::abspid==321) ) {
165 if(axis2.dot(p2.p3())>0.) continue;
166 double xH = p2.momentum().t()/meanBeamMom;
167 Vector3 axisH = p2.momentum().p3();
168 Vector3 axis4 = axisH.cross(axis1).unit();
169 double cTheta2 = axis3.dot(pproton.p3().unit())*norm;
170 if(sign>0) {
171 if(p2.pid()==211) _p_lam_pip[ibin]->fill(xH,cTheta2);
172 else if(p2.pid()==-211) _p_lam_pim[ibin]->fill(xH,cTheta2);
173 else if(p2.pid()== 321) _p_lam_Kp [ibin]->fill(xH,cTheta2);
174 else if(p2.pid()==-321) _p_lam_Km [ibin]->fill(xH,cTheta2);
175 }
176 else {
177 if(p2.pid()==211) _p_bar_pip[ibin]->fill(xH,cTheta2);
178 else if(p2.pid()==-211) _p_bar_pim[ibin]->fill(xH,cTheta2);
179 else if(p2.pid()== 321) _p_bar_Kp [ibin]->fill(xH,cTheta2);
180 else if(p2.pid()==-321) _p_bar_Km [ibin]->fill(xH,cTheta2);
181 }
182 }
183 }
184 }
185
186
187 /// Normalise histograms etc., after the run
188 void finalize() {
189 }
190
191 /// @}
192
193
194 /// @name Histograms
195 /// @{
196 Profile1DPtr _p_lam[4],_p_bar[4];
197 Profile1DPtr _p_lam_pip[4],_p_lam_pim[4],_p_lam_Kp[4],_p_lam_Km[4];
198 Profile1DPtr _p_bar_pip[4],_p_bar_pim[4],_p_bar_Kp[4],_p_bar_Km[4];
199 Profile1DPtr _p_lam_inc,_p_lam_prompt,_p_lam_sigma;
200 Profile1DPtr _p_bar_inc,_p_bar_prompt,_p_bar_sigma;
201 /// @}
202
203
204 };
205
206
207 RIVET_DECLARE_PLUGIN(BELLE_2019_I1687566);
208
209
210}
|