Rivet analyses referenceBELLE_2022_I2138841Decay asymmetries in $\Lambda_c^+ \to \Lambda^0 (\pi,K)^+$ and $\Lambda_c^+ \to \Sigma^0 (\pi,K)^+$Experiment: BELLE (KEKB) Inspire ID: 2138841 Status: VALIDATED NOHEPDATA SINGLEWEIGHT Authors:
Beam energies: ANY Run details:
Decay asymmetries in $\Lambda_c^+ \to \Lambda^0 (\pi,K)^+$ and $\Lambda_c^+ \to \Sigma^0 (\pi,K)^+$ Source code: BELLE_2022_I2138841.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief Lambda_c -> Lambda0 or Sigma0 + (pi,K)+ decay asymmetries
9 class BELLE_2022_I2138841 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2022_I2138841);
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(UnstableParticles(), "UFS" );
23 for(unsigned int imode=0;imode<4;++imode) {
24 if(imode<2) {
25 book(_h[imode][0],3,1,1+imode);
26 for(unsigned int iy=0;iy<2;++iy)
27 book(_h[imode][1+iy],4,1,1+iy+2*imode);
28 }
29 for(unsigned int iy=0;iy<3;++iy)
30 for(unsigned int iz=0;iz<2;++iz)
31 book(_c[imode][iy][iz],"TMP/C_"+toString(imode+1)+"_"+toString(iy+1)+"_"+toString(iz+1));
32 }
33 }
34
35
36 /// Perform the per-event analysis
37 void analyze(const Event& event) {
38 // loop over Lambda_c baryons
39 for( const Particle& Lambdac : apply<UnstableParticles>(event, "UFS").particles(Cuts::abspid==4122)) {
40 int sign = Lambdac.pid()/4122;
41 if(Lambdac.children().size()!=2) continue;
42 Particle baryon1;
43 int imeson=-1;
44 if((Lambdac.children()[0].pid()==sign*3122 ||
45 Lambdac.children()[0].pid()==sign*3212) &&
46 Lambdac.children()[1].pid()==sign*321) {
47 baryon1 = Lambdac.children()[0];
48 imeson=0;
49 }
50 else if((Lambdac.children()[1].pid()==sign*3122 ||
51 Lambdac.children()[0].pid()==sign*3212) &&
52 Lambdac.children()[0].pid()==sign*321) {
53 baryon1 = Lambdac.children()[1];
54 imeson=0;
55 }
56 else if((Lambdac.children()[0].pid()==sign*3122 ||
57 Lambdac.children()[0].pid()==sign*3212) &&
58 Lambdac.children()[1].pid()==sign*211) {
59 baryon1 = Lambdac.children()[0];
60 imeson=1;
61 }
62 else if((Lambdac.children()[1].pid()==sign*3122 ||
63 Lambdac.children()[0].pid()==sign*3212) &&
64 Lambdac.children()[0].pid()==sign*211) {
65 baryon1 = Lambdac.children()[1];
66 imeson=1;
67 }
68 else
69 continue;
70 // Lambda0 case
71 if(baryon1.abspid()==3122) {
72 Particle baryon2;
73 if(baryon1.children()[0].pid()== sign*2212 &&
74 baryon1.children()[1].pid()==-sign*211) {
75 baryon2 = baryon1.children()[0];
76 }
77 else if(baryon1.children()[1].pid()== sign*2212 &&
78 baryon1.children()[0].pid()==-sign*211) {
79 baryon2 = baryon1.children()[1];
80 }
81 else
82 continue;
83 // first boost to the Lambdac rest frame
84 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(Lambdac.momentum().betaVec());
85 FourMomentum pbaryon1 = boost1.transform(baryon1.momentum());
86 FourMomentum pbaryon2 = boost1.transform(baryon2.momentum());
87 // to lambda rest frame
88 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pbaryon1.betaVec());
89 Vector3 axis = pbaryon1.p3().unit();
90 FourMomentum pp = boost2.transform(pbaryon2);
91 // calculate angle
92 double cTheta = pp.p3().unit().dot(axis);
93 _h[imeson][0]->fill(cTheta);
94 _c[imeson][0][0]->fill();
95 _c[imeson][0][1]->fill(3.*cTheta);
96 if(baryon1.pid()>0) {
97 _h[imeson][1]->fill(cTheta);
98 _c[imeson][1][0]->fill();
99 _c[imeson][1][1]->fill(3.*cTheta);
100 }
101 else {
102 _h[imeson][2]->fill(cTheta);
103 _c[imeson][2][0]->fill();
104 _c[imeson][2][1]->fill(3.*cTheta);
105 }
106 }
107 // sigma0 case
108 else {
109 Particle baryon2;
110 if(baryon1.children()[0].pid()== sign*3122 &&
111 baryon1.children()[1].pid()== 22) {
112 baryon2 = baryon1.children()[0];
113 }
114 else if(baryon1.children()[1].pid()== sign*3122 &&
115 baryon1.children()[0].pid()== 22) {
116 baryon2 = baryon1.children()[1];
117 }
118 else
119 continue;
120 Particle baryon3;
121 if(baryon2.children()[0].pid()== sign*2212 &&
122 baryon2.children()[1].pid()==-sign*211) {
123 baryon3 = baryon2.children()[0];
124 }
125 else if(baryon2.children()[1].pid()== sign*2212 &&
126 baryon2.children()[0].pid()==-sign*211) {
127 baryon3 = baryon2.children()[1];
128 }
129 else
130 continue;
131 // first boost to the Lambdac rest frame
132 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(Lambdac.momentum().betaVec());
133 FourMomentum pbaryon1 = boost1.transform(baryon1.momentum());
134 FourMomentum pbaryon2 = boost1.transform(baryon2.momentum());
135 FourMomentum pbaryon3 = boost1.transform(baryon3.momentum());
136 // to sigma rest frame
137 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pbaryon1.betaVec());
138 Vector3 axis = pbaryon1.p3().unit();
139 FourMomentum pp = boost2.transform(pbaryon2);
140 FourMomentum pp3 = boost2.transform(pbaryon3);
141 // calculate angle
142 double cTheta2 = pp.p3().unit().dot(axis);
143 // to lambda rest frame
144 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pp.betaVec());
145 Vector3 axis2 = pp.p3().unit();
146 FourMomentum pp4 = boost3.transform(pp3);
147 // calculate angle
148 double cTheta3 = pp4.p3().unit().dot(axis2);
149 double cTheta = cTheta2*cTheta3;
150 _c[imeson+2][0][0]->fill();
151 _c[imeson+2][0][1]->fill(-9.*cTheta);
152 if(baryon1.pid()>0) {
153 _c[imeson+2][1][0]->fill();
154 _c[imeson+2][1][1]->fill(-9.*cTheta);
155 }
156 else {
157 _c[imeson+2][2][0]->fill();
158 _c[imeson+2][2][1]->fill(-9.*cTheta);
159 }
160 }
161 }
162 }
163
164 /// Normalise histograms etc., after the run
165 void finalize() {
166 pair<double,double> aLambda(0.7542,0.0022);
167 for(int imeson=0;imeson<4;++imeson) {
168 for(int iy=0;iy<3;++iy) {
169 if(imeson<2) normalize(_h[imeson][iy]);
170 Estimate0DPtr _h_alpha1,_h_alpha2;
171 if(iy==0) {
172 book(_h_alpha1,1,1+imeson,1);
173 book(_h_alpha2,1,1+imeson,2);
174 }
175 else {
176 book(_h_alpha1,2,1+imeson,iy);
177 book(_h_alpha2,2,1+imeson,2+iy);
178 }
179 divide(_c[imeson][iy][1], _c[imeson][iy][0], _h_alpha1);
180 // divide out aLambda
181 double rval = _h_alpha1->val() / aLambda.first;
182 pair<double,double> rerr = _h_alpha1->err();
183 rerr.first = sqrt(sqr(rerr.first /rval) + sqr(aLambda.second/aLambda.first));
184 rerr.second = sqrt(sqr(rerr.second/rval) + sqr(aLambda.second/aLambda.first));
185 rerr.first *= rval;
186 rerr.second *= rval;
187 if(iy==2) {
188 rval *=-1;
189 swap(rerr.first,rerr.second);
190 }
191 _h_alpha2->set(rval, rerr);
192 }
193 }
194 }
195
196 /// @}
197
198
199 /// @name Histograms
200 /// @{
201 Histo1DPtr _h[2][3];
202 CounterPtr _c[4][3][2];
203 /// @}
204
205
206 };
207
208
209 RIVET_DECLARE_PLUGIN(BELLE_2022_I2138841);
210
211}
|