Rivet analyses referenceNA48_2010_I868871Decay asymmetries in $\Xi^0\to\Lambda^0\gamma$, $\Lambda^0\pi^0$ and $\Sigma^0\gamma$Experiment: NA48 () Inspire ID: 868871 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the decay asymmetries in $\Xi^0\to\Lambda^0\gamma$, $\Lambda^0\pi^0$ and $\Sigma^0\gamma$ 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 _nSigma=0.;
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 += 1.;
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 Estimate1DPtr _h_alpha_pi0;
190 book(_h_alpha_pi0,1,1,1);
191 pair<double,double> alpha = calcAlpha(_h_ctheta_pi0);
192 _h_alpha_pi0->bin(1).set(alpha.first, alpha.second);
193 // Xi0 -> Lambda gamma (N.B. sign due defns)
194 normalize(_h_ctheta_gamma);
195 Estimate1DPtr _h_alpha_gamma;
196 book(_h_alpha_gamma,2,1,1);
197 alpha = calcAlpha(_h_ctheta_gamma);
198 _h_alpha_gamma->bin(1).set(-alpha.first, alpha.second);
199 // Xi0 -> Sigma gamma
200 scale(_h_ctheta_Sigma, 1./_nSigma);
201 Estimate1DPtr _h_alpha_Sigma;
202 book(_h_alpha_Sigma,3,1,1);
203 alpha = calcAlpha(_h_ctheta_Sigma);
204 _h_alpha_Sigma->bin(1).set(alpha.first, alpha.second);
205 }
206
207 /// @}
208
209
210 /// @name Histograms
211 /// @{
212 Histo1DPtr _h_ctheta_pi0,_h_ctheta_gamma;
213 Histo1DGroupPtr _h_ctheta_Sigma;
214 double _nSigma;
215 /// @}
216
217 };
218
219
220 RIVET_DECLARE_PLUGIN(NA48_2010_I868871);
221
222
223}
|