Rivet analyses referenceFOCUS_2006_I693639Decay asymmetries in $\Lambda^+_c\to\Lambda^0\pi^+$Experiment: FOCUS () Inspire ID: 693639 Status: VALIDATED Authors:
Beam energies: ANY Run details:
Measurement of the decay asymmetries in $\Lambda^+_c\to\Lambda^0\pi^+$ by the FOCUS experiment. The asymmetry parameter is extracted by fitting to normalised angular distribution. N.B. the product of the asymmetry parameters for the $\Lambda_c$ and daughter baryon is implemented as this is what is measured, rather than the extracted parameter for the $\Lambda_c$ which relies on other measurements of the parameter for the daughter baryon. This analysis is useful for testing spin correlations in hadron decays. Source code: FOCUS_2006_I693639.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/UnstableParticles.hh"
4
5namespace Rivet {
6
7
8 /// @brief Lambda_c -> Lambda pi asymmetry
9 class FOCUS_2006_I693639 : public Analysis {
10 public:
11
12 /// Constructor
13 RIVET_DEFAULT_ANALYSIS_CTOR(FOCUS_2006_I693639);
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 // Book histograms
24 book(_h_ctheta1,2,1,1);
25 book(_h_ctheta2,3,1,1);
26 }
27
28
29 /// Perform the per-event analysis
30 void analyze(const Event& event) {
31 // loop over Lambda_c baryons
32 for( const Particle& Lambdac : apply<UnstableParticles>(event, "UFS").particles(Cuts::abspid==4122)) {
33 int sign = Lambdac.pid()/4122;
34 if(Lambdac.children().size()!=2) continue;
35 Particle baryon1,meson1;
36 if(Lambdac.children()[0].pid()==sign*3122 &&
37 Lambdac.children()[1].pid()==sign*211) {
38 baryon1 = Lambdac.children()[0];
39 meson1 = Lambdac.children()[1];
40 }
41 else if(Lambdac.children()[1].pid()==sign*3122 &&
42 Lambdac.children()[0].pid()==sign*211) {
43 baryon1 = Lambdac.children()[1];
44 meson1 = Lambdac.children()[0];
45 }
46 else
47 continue;
48 Particle baryon2,meson2;
49 if(baryon1.children()[0].pid()== sign*2212 &&
50 baryon1.children()[1].pid()==-sign*211) {
51 baryon2 = baryon1.children()[0];
52 meson2 = baryon1.children()[1];
53 }
54 else if(baryon1.children()[1].pid()== sign*2212 &&
55 baryon1.children()[0].pid()==-sign*211) {
56 baryon2 = baryon1.children()[1];
57 meson2 = baryon1.children()[0];
58 }
59 else
60 continue;
61 // first boost to the Lambdac rest frame
62 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(Lambdac.momentum().betaVec());
63 FourMomentum pbaryon1 = boost1.transform(baryon1.momentum());
64 FourMomentum pbaryon2 = boost1.transform(baryon2.momentum());
65 // to lambda rest frame
66 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pbaryon1.betaVec());
67 Vector3 axis = pbaryon1.p3().unit();
68 FourMomentum pp = boost2.transform(pbaryon2);
69 // calculate angle
70 double cTheta = pp.p3().unit().dot(axis);
71 if(sign>0)
72 _h_ctheta1->fill(cTheta);
73 else
74 _h_ctheta2->fill(cTheta);
75 }
76 }
77
78 pair<double,double> calcAlpha(Histo1DPtr hist) {
79 if(hist->numEntries()==0.) return make_pair(0.,0.);
80 double sum1(0.),sum2(0.);
81 for (const auto& bin : hist->bins() ) {
82 double Oi = bin.sumW();
83 if(Oi==0.) continue;
84 double ai = 0.5*(bin.xMax()-bin.xMin());
85 double bi = 0.5*ai*(bin.xMax()+bin.xMin());
86 double Ei = bin.errW();
87 sum1 += sqr(bi/Ei);
88 sum2 += bi/sqr(Ei)*(Oi-ai);
89 }
90 return make_pair(sum2/sum1,sqrt(1./sum1));
91 }
92
93 /// Normalise histograms etc., after the run
94 void finalize() {
95 normalize(_h_ctheta1);
96 normalize(_h_ctheta2);
97 Estimate0DPtr _h_alpha;
98 book(_h_alpha,1,1,1);
99 pair<double,double> alpha = calcAlpha(_h_ctheta1);
100 _h_alpha->set(alpha.first, alpha.second);
101 }
102
103 /// @}
104
105
106 /// @name Histograms
107 /// @{
108 Histo1DPtr _h_ctheta1, _h_ctheta2;
109 /// @}
110
111
112 };
113
114
115 RIVET_DECLARE_PLUGIN(FOCUS_2006_I693639);
116
117
118}
|