rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

NA48_2010_I868871

Decay asymmetries in $\Xi^0\to\Lambda^0\gamma$, $\Lambda^0\pi^0$ and $\Sigma^0\gamma$
Experiment: NA48 ()
Inspire ID: 868871
Status: VALIDATED
Authors:
  • Peter Richardson
References:
  • Phys.Lett. B693 (2010) 241-248
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing Xi0 baryons

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}