rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2022_I2138841

Decay 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:
  • Peter Richardson
References: Beams: * *
Beam energies: ANY
Run details:
  • Any process producing Lambda_c baryons

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}