Rivet analyses referenceNA48_2010_I868871Decay asymmetries in Ξ0→Λ0γ, Λ0π0 and Σ0γExperiment: NA48 () Inspire ID: 868871 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the decay asymmetries in Ξ0→Λ0γ, Λ0π0 and Σ0γ by the NA48 experiment. The asymmetry parameter is extracted by fitting to normalised angular distribution. This analysis is useful for testing spin correlations in hadron decays. Source code: NA48_2010_I868871.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4#include <sstream>
5namespace Rivet {
6
7
8 /// @brief asymmetrics in Xi0 decays
9 class NA48_2010_I868871 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(NA48_2010_I868871);
14
15
16 /// @name Analysis methods
17 /// @{
18
19 /// Book histograms and initialise projections before the run
20 void init() {
21
22 // Initialise and register projections
23 declare(UnstableParticles(), "UFS" );
24 // Book histograms
25 book(_h_ctheta_pi0 , "ctheta_pi0" , 20,-1,1);
26 book(_h_ctheta_gamma, "ctheta_gamma", 20,-1,1);
27
28 book(_h_ctheta_Sigma, {-1., -0.9, -0.8, -0.7, -0.6, -0.5, -0.4, -0.3, -0.2, -0.1,
29 0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.});
30 for (auto& b : _h_ctheta_Sigma->bins()) {
31 const string name = "ctheta_Sigma_"+std::to_string(b.index()-1);
32 book(b, name, 20, -1.0, 1.0);
33 }
34 book(_nSigma,"TMP/nSigma");
35 }
36
37
38 /// Perform the per-event analysis
39 void analyze(const Event& event) {
40 // loop over Omega baryons
41 for (const Particle& Xi : apply<UnstableParticles>(event, "UFS").particles(Cuts::abspid==3322)) {
42 int sign = Xi.pid()/3322;
43 if(Xi.children().size()!=2) continue;
44 Particle baryon1,meson1;
45 unsigned int mode(0);
46 if(Xi.children()[0].pid()==sign*3122 &&
47 Xi.children()[1].pid()==111) {
48 baryon1 = Xi.children()[0];
49 meson1 = Xi.children()[1];
50 mode=1;
51 }
52 else if(Xi.children()[1].pid()==sign*3122 &&
53 Xi.children()[0].pid()==111) {
54 baryon1 = Xi.children()[1];
55 meson1 = Xi.children()[0];
56 mode=1;
57 }
58 else if(Xi.children()[0].pid()==sign*3122 &&
59 Xi.children()[1].pid()==22) {
60 baryon1 = Xi.children()[0];
61 meson1 = Xi.children()[1];
62 mode=2;
63 }
64 else if(Xi.children()[1].pid()==sign*3122 &&
65 Xi.children()[0].pid()==22) {
66 baryon1 = Xi.children()[1];
67 meson1 = Xi.children()[0];
68 mode=2;
69 }
70 else if(Xi.children()[0].pid()==sign*3212 &&
71 Xi.children()[1].pid()==22) {
72 baryon1 = Xi.children()[0];
73 meson1 = Xi.children()[1];
74 mode=3;
75 }
76 else if(Xi.children()[1].pid()==sign*3212 &&
77 Xi.children()[0].pid()==22) {
78 baryon1 = Xi.children()[1];
79 meson1 = Xi.children()[0];
80 mode=3;
81 }
82 else
83 continue;
84 if(baryon1.children().size()!=2) continue;
85 Particle baryon2,meson2,baryon3,meson3;
86 if(mode==1 || mode ==2) {
87 if(baryon1.children()[0].pid()== sign*2212 &&
88 baryon1.children()[1].pid()==-sign*211) {
89 baryon2 = baryon1.children()[0];
90 meson2 = baryon1.children()[1];
91 }
92 else if(baryon1.children()[1].pid()== sign*2212 &&
93 baryon1.children()[0].pid()==-sign*211) {
94 baryon2 = baryon1.children()[1];
95 meson2 = baryon1.children()[0];
96 }
97 else
98 continue;
99 }
100 else if(mode==3) {
101 if(baryon1.children()[0].pid()== sign*3122 &&
102 baryon1.children()[1].pid()== 22) {
103 baryon2 = baryon1.children()[0];
104 meson2 = baryon1.children()[1];
105 }
106 else if(baryon1.children()[1].pid()== sign*3122 &&
107 baryon1.children()[0].pid()== 22) {
108 baryon2 = baryon1.children()[1];
109 meson2 = baryon1.children()[0];
110 }
111 else
112 continue;
113 if(baryon2.children()[0].pid()== sign*2212 &&
114 baryon2.children()[1].pid()==-sign*211) {
115 baryon3 = baryon2.children()[0];
116 meson3 = baryon2.children()[1];
117 }
118 else if(baryon2.children()[1].pid()== sign*2212 &&
119 baryon2.children()[0].pid()==-sign*211) {
120 baryon3 = baryon2.children()[1];
121 meson3 = baryon2.children()[0];
122 }
123 else
124 continue;
125 }
126 // first boost to the Xi rest frame
127 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(Xi.momentum().betaVec());
128 FourMomentum pbaryon1 = boost1.transform(baryon1.momentum());
129 FourMomentum pbaryon2 = boost1.transform(baryon2.momentum());
130 // to lambda rest frame
131 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pbaryon1.betaVec());
132 Vector3 axis = pbaryon1.p3().unit();
133 FourMomentum pp = boost2.transform(pbaryon2);
134 // calculate angle
135 double cTheta = pp.p3().unit().dot(axis);
136 if(mode==1) {
137 _h_ctheta_pi0->fill(cTheta,1.);
138 }
139 else if(mode==2) {
140 _h_ctheta_gamma->fill(cTheta,1.);
141 }
142 else if(mode==3) {
143 FourMomentum pbaryon3 = boost1.transform(baryon3.momentum());
144 FourMomentum pp2 = boost2.transform(pbaryon3);
145 Vector3 axis2 = pp.p3().unit();
146 double cTheta2 = pp2.p3().unit().dot(axis2);
147 _h_ctheta_Sigma->fill(cTheta,cTheta2);
148 _nSigma->fill();
149 }
150 }
151 }
152
153 pair<double,double> calcAlpha(Histo1DPtr& hist) {
154 if (hist->numEntries()==0.) return make_pair(0.,0.);
155 double sum1(0.),sum2(0.);
156 for (const auto& bin : hist->bins() ) {
157 double Oi = bin.sumW();
158 if(Oi==0.) continue;
159 double ai = 0.5*(bin.xMax()-bin.xMin());
160 double bi = 0.5*ai*(bin.xMax()+bin.xMin());
161 double Ei = bin.errW();
162 sum1 += sqr(bi/Ei);
163 sum2 += bi/sqr(Ei)*(Oi-ai);
164 }
165 return make_pair(sum2/sum1,sqrt(1./sum1));
166 }
167
168 pair<double,double> calcAlpha(Histo1DGroupPtr& hist) {
169 double sum1(0.),sum2(0.);
170 for (auto& h2 : hist->bins()) {
171 double xsum=2.*h2.xMin() + h2.xWidth();
172 for (const auto& bin : h2->bins() ) {
173 double Oi = bin.sumW();
174 if(Oi==0.) continue;
175 double ai = 0.25*(bin.xMax()-bin.xMin())*h2.xWidth();
176 double bi = 0.25*ai*(bin.xMax()+bin.xMin())*xsum;
177 double Ei = bin.errW();
178 sum1 += sqr(bi/Ei);
179 sum2 += bi/sqr(Ei)*(Oi-ai);
180 }
181 }
182 return make_pair(sum2/sum1,sqrt(1./sum1));
183 }
184
185 /// Normalise histograms etc., after the run
186 void finalize() {
187 // Xi0 -> Lambda0 pi0
188 normalize(_h_ctheta_pi0);
189 Estimate0DPtr _h_alpha_pi0;
190 book(_h_alpha_pi0,1,1,1);
191 pair<double,double> alpha = calcAlpha(_h_ctheta_pi0);
192 _h_alpha_pi0->set(alpha.first, alpha.second);
193 // Xi0 -> Lambda gamma (N.B. sign due defns)
194 normalize(_h_ctheta_gamma);
195 Estimate0DPtr _h_alpha_gamma;
196 book(_h_alpha_gamma,1,1,2);
197 alpha = calcAlpha(_h_ctheta_gamma);
198 _h_alpha_gamma->set(-alpha.first, alpha.second);
199 // Xi0 -> Sigma gamma
200 scale(_h_ctheta_Sigma, 1./ *_nSigma);
201 divByGroupWidth(_h_ctheta_Sigma);
202 Estimate0DPtr _h_alpha_Sigma;
203 book(_h_alpha_Sigma,1,1,3);
204 alpha = calcAlpha(_h_ctheta_Sigma);
205 _h_alpha_Sigma->set(alpha.first, alpha.second);
206 }
207
208 /// @}
209
210
211 /// @name Histograms
212 /// @{
213 Histo1DPtr _h_ctheta_pi0,_h_ctheta_gamma;
214 Histo1DGroupPtr _h_ctheta_Sigma;
215 CounterPtr _nSigma;
216 /// @}
217
218 };
219
220
221 RIVET_DECLARE_PLUGIN(NA48_2010_I868871);
222
223
224}
|