rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

LHCB_2024_I2824757

Decay parameters in $\Lambda^0_b\to\Lambda_c^+(\pi^-,K^-)$ with $\Lambda_c^+\to \Lambda^0(\pi^+,K^+)$ or $\Lambda_c^+\to p K^0_S$
Experiment: LHCB (LHC)
Inspire ID: 2824757
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References: Beams: * *
Beam energies: ANY
Run details:
  • Any source of unpolarized Lambda_b0 baryons, originally pp

Measurement of the decay parameters in in $\Lambda^0_b\to\Lambda_c^+(\pi^-,K^-)$ with $\Lambda_c^+\to \Lambda^0(\pi^+,K^+)$ or $\Lambda_c^+\to p K^0_S$, with $\Lambda^0\to p\pi^-$. The data was read from Tables 1 and 2 in the paper.

Source code: LHCB_2024_I2824757.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief Lambda_b0 -> Lambda_c+ pi-,K-
  9  class LHCB_2024_I2824757 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(LHCB_2024_I2824757);
 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(Cuts::abspid==5122), "UFS" );
 23      for(unsigned int ip=0;ip<2;++ip) {
 24        for(unsigned int ix=0;ix<2;++ix) {
 25          for(unsigned int iy=0;iy<3;++iy) {
 26            string base = toString(ip)+"_"+toString(ix)+"_"+toString(iy);
 27            book(_h_cos1 [ip][ix][iy],"h_cos_1_" +base,20,-1,1);
 28            if(iy==2) continue;
 29            book(_h_cos2 [ip][ix][iy],"h_cos_2_" +base,20,-1,1);
 30            book(_p_cos12[ip][ix][iy],"p_cos_12_"+base,1,-1,1);
 31            book(_h_phi2 [ip][ix][iy],"h_phi_2_" +base,20,-M_PI,M_PI);
 32          }
 33        }
 34      }
 35    }
 36
 37
 38    /// Perform the per-event analysis
 39    void analyze(const Event& event) {
 40      // loop over Lambda_b0 baryons
 41      for (const Particle& Lamb : apply<UnstableParticles>(event, "UFS").particles()) {
 42        int sign = Lamb.pid()/5122;
 43        if(Lamb.children().size()!=2) continue;
 44        Particle baryon1,meson1;
 45        if ( Lamb.children()[0].pid()==sign*4122 &&
 46            (Lamb.children()[1].pid()==-sign*211 ||
 47             Lamb.children()[1].pid()==-sign*321)) {
 48          baryon1 = Lamb.children()[0];
 49          meson1  = Lamb.children()[1];
 50        }
 51        else if ( Lamb.children()[1].pid()==sign*4122 &&
 52                 (Lamb.children()[0].pid()==-sign*211 ||
 53                  Lamb.children()[0].pid()==-sign*321)) {
 54          baryon1 = Lamb.children()[1];
 55          meson1  = Lamb.children()[0];
 56        }
 57        else  continue;
 58        if(baryon1.children().size()!=2) continue;
 59        unsigned int ib = meson1.abspid()==211 ? 0 : 1;
 60        Particle baryon2,meson2;
 61        unsigned int ic=0;
 62        if (baryon1.children()[0].pid()== sign*3122 && baryon1.children()[1].pid()== sign*211) {
 63          baryon2 = baryon1.children()[0];
 64          meson2  = baryon1.children()[1];
 65                ic=0;
 66        }
 67        else if (baryon1.children()[1].pid()== sign*3122 && baryon1.children()[0].pid()== sign*211) {
 68          baryon2 = baryon1.children()[1];
 69          meson2  = baryon1.children()[0];
 70                ic=0;
 71        }
 72        else if (baryon1.children()[0].pid()== sign*3122 && baryon1.children()[1].pid()== sign*321) {
 73          baryon2 = baryon1.children()[0];
 74          meson2  = baryon1.children()[1];
 75                ic=1;
 76        }
 77        else if (baryon1.children()[1].pid()== sign*3122 && baryon1.children()[0].pid()== sign*321) {
 78          baryon2 = baryon1.children()[1];
 79          meson2  = baryon1.children()[0];
 80          ic=1;
 81        }
 82        else if( baryon1.children()[0].pid()== sign*2212 &&
 83                (baryon1.children()[1].pid()==-sign*311 ||
 84                 baryon1.children()[1].pid()== 310 )) {
 85          baryon2 = baryon1.children()[0];
 86          meson2  = baryon1.children()[1];
 87          ic=2;
 88        }
 89        else if( baryon1.children()[1].pid()== sign*2212 &&
 90                (baryon1.children()[1].pid()==-sign*311 ||
 91                 baryon1.children()[1].pid()== 310 )) {
 92          baryon2 = baryon1.children()[1];
 93          meson2  = baryon1.children()[0];
 94          ic=2;
 95        }
 96        else   continue;
 97        // deal with Kbar0 in Lambda_c+ -> Kbar0 p
 98        if (ic==2 && meson2.pid()!=310) {
 99          if (meson2.children().size()==1) {
100            meson2=meson2.children()[0];
101          }
102          if (meson2.pid()!=310) continue;
103        }
104        // first boost to the Lambdab0 rest frame
105        LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(Lamb.mom().betaVec());
106        FourMomentum pbaryon1 = boost1.transform(baryon1.mom());
107        FourMomentum pbaryon2 = boost1.transform(baryon2.mom());
108        FourMomentum pmeson2  = boost1.transform(meson2.mom());
109        // boost to lambda_c rest frame
110        LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pbaryon1.betaVec());
111        Vector3 axis1 = pbaryon1.p3().unit();
112        FourMomentum pp = boost2.transform(pbaryon2);
113        double cTheta1 = pp.p3().unit().dot(axis1);
114        _h_cos1[(1-sign)/2][ib][ic]->fill(cTheta1);
115        // that's it for Lambda_c+ -> p+ K_S0
116        if (ic==2) continue;
117        if (baryon2.children().size()!=2) continue;
118        Particle baryon3,meson3;
119        if (baryon2.children()[0].pid()== sign*2212 &&
120            baryon2.children()[1].pid()==-sign*211) {
121          baryon3 = baryon2.children()[0];
122          meson3  = baryon2.children()[1];
123        }
124        else if (baryon2.children()[1].pid()== sign*2212 &&
125          baryon2.children()[0].pid()==-sign*211) {
126          baryon3 = baryon2.children()[1];
127          meson3  = baryon2.children()[0];
128        }
129        else  continue;
130        Vector3 axis2=pp.p3().unit();
131        LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pp.betaVec());
132        FourMomentum pbaryon3 = boost3.transform(boost2.transform(boost1.transform(baryon3.mom())));
133        double cTheta2 = pbaryon3.p3().unit().dot(axis2);
134        _h_cos2 [(1-sign)/2][ib][ic]->fill(cTheta2);
135        _p_cos12[(1-sign)/2][ib][ic]->fill(cTheta1*cTheta2,cTheta1*cTheta2);
136        Vector3 trans1 = axis1 - axis1.dot(axis2)*axis2;
137        Vector3 trans2 = pbaryon3.p3()-pbaryon3.p3().dot(axis2)*pbaryon3.p3();
138        double phi2 = atan2(trans1.cross(trans2).dot(axis2), trans1.dot(trans2));
139        _h_phi2[(1-sign)/2][ib][ic]->fill(phi2);
140      }
141    }
142
143    pair<double,double> calcAlpha(Histo1DPtr hist) const {
144      if (hist->numEntries()==0.) return make_pair(0.,0.);
145      double sum1(0.),sum2(0.);
146      for (const auto& bin : hist->bins()) {
147        double Oi = bin.sumW();
148        if (Oi==0.) continue;
149        double ai = 0.5*(bin.xMax()-bin.xMin());
150        double bi = 0.5*ai*(bin.xMax()+bin.xMin());
151        double Ei = bin.errW();
152        sum1 += sqr(bi/Ei);
153        sum2 += bi/sqr(Ei)*(Oi-ai);
154      }
155      return make_pair(sum2/sum1,sqrt(1./sum1));
156    }
157
158    vector<pair<double,double>> calcBetaGamma(Histo1DPtr hist) const {
159      if(hist->numEntries()==0.) return vector<pair<double,double>>(2,make_pair(0.,0.));;
160      double sum[7]={0.,0.,0.,0.,0.,0.,0.,};
161      for (const auto& bin : hist->bins()) {
162        double Oi = bin.sumW();
163        if(Oi==0.) continue;
164        double ai = (bin.xMax()-bin.xMin())/2./M_PI;
165        double bi = M_PI/32.*(cos(bin.xMin())-cos(bin.xMax()));
166        double ci =-M_PI/32.*(sin(bin.xMin())-sin(bin.xMax()));
167        double Ei = bin.errW();
168        sum[0] +=   bi*Oi/sqr(Ei);
169        sum[1] +=   ci*Oi/sqr(Ei);
170        sum[2] +=   ai*bi/sqr(Ei);
171        sum[3] +=   ai*ci/sqr(Ei);
172        sum[4] += sqr(bi)/sqr(Ei);
173        sum[5] += sqr(ci)/sqr(Ei);
174        sum[6] +=   bi*ci/sqr(Ei);
175      }
176      double gamma = (sum[0]/sum[4]-sum[2]/sum[4]-sum[1]/sum[6]+sum[3]/sum[6])/(sum[6]/sum[4]-sum[5]/sum[6]);
177      double beta  = (sum[0]/sum[6]-sum[2]/sum[6]-sum[1]/sum[5]+sum[3]/sum[5])/(sum[4]/sum[6]-sum[6]/sum[5]);
178      return {make_pair(beta ,1./sqrt(sum[4])),make_pair(gamma,1./sqrt(sum[5]))};
179    }
180
181
182    /// Normalise histograms etc., after the run
183    void finalize() {
184      normalize(_h_cos1);
185      normalize(_h_cos2);
186      normalize(_h_phi2);
187      // compute values for specific modes
188      pair<double,double> a_b[2][2][2], a_c[2][2][2], a_s[2][2][2],beta[2][2][2],gamma[2][2][2];
189      for (unsigned int ip=0;ip<2;++ip) {
190        for (unsigned int ib=0;ib<2;++ib) {
191          for (unsigned int ic=0;ic<2;++ic) {
192            pair<double,double> p1 = calcAlpha(_h_cos1[ip][ib][ic]);
193            pair<double,double> p2 = calcAlpha(_h_cos2[ip][ib][ic]);
194            pair<double,double> p3 = make_pair(9.*_p_cos12[ip][ib][ic]->bin(1).mean(2),
195                                               9.*_p_cos12[ip][ib][ic]->bin(1).stdErr(2));
196            double ferr = sqrt(sqr(p1.second/p1.first)+sqr(p2.second/p2.first)+sqr(p3.second/p3.first));
197            // lamda decay first as sign well known
198            double l3 = p2.first*p3.first/p1.first;
199            double e3 = l3*ferr;
200            l3 = sqrt(max(l3,0.));
201            e3 = 0.5*e3;
202            // sign ambiguity so fix alpha for lambda0 -> p pi to known sign
203            if(ip==1) l3*=-1.;
204            a_s[ip][ib][ic] = make_pair(l3,e3);
205            // lambda_b decay
206            double l1 = p1.first*p3.first/p2.first;
207            double e1 = l1*ferr;
208            l1 = sqrt(max(l1,0.));
209            e1 = 0.5*e1;
210            if(p3.first*l3<0.) l1 *= -1.;
211            a_b[ip][ib][ic] = make_pair(l1,e1);
212            // lambda_c decay
213            double l2 = p1.first*p2.first/p3.first;
214            double e2 = l2*ferr;
215            l2 = sqrt(max(l2,0.));
216            e2 = 0.5*e2;
217            if(p2.first*l3<0.) l2 *= -1.;
218            a_c[ip][ib][ic] = make_pair(l2,e2);
219            vector<pair<double,double>> temp = calcBetaGamma(_h_phi2[ip][ib][ic]);
220            for(auto & val : temp) {
221              double error = sqrt(sqr(val.second/val.first)+sqr(p3.second/p3.first));
222              val.first /=p3.first;
223              val.second = val.first*error;
224            }
225            beta [ip][ib][ic] = temp[0];
226            gamma[ip][ib][ic] = temp[1];
227          }
228        }
229      }
230      // perform averages
231      // Lambda^0 -> p pi
232      pair<double,double> alam[2];
233      for(unsigned int ip=0;ip<2;++ip) {
234        double sum1(0.),sum2(0.);
235        for(unsigned int ib=0;ib<2;++ib) {
236          for(unsigned int ic=0;ic<2;++ic) {
237            sum1 += a_s[ip][ib][ic].first/sqr(a_s[ip][ib][ic].second);
238            sum2 += 1./sqr(a_s[ip][ib][ic].second);
239          }
240        }
241        alam[ip] = make_pair(sum1/sum2,sqrt(1./sum2));
242        Estimate0DPtr tmp;
243        book(tmp,1,6,1+ip);
244        tmp->set(alam[ip].first,alam[ip].second);
245      }
246      Estimate0DPtr tmp;
247      book(tmp,1,6,3);
248      tmp->set(0.5*(alam[0].first-alam[1].first),
249               0.5*sqrt(sqr(alam[0].second)+sqr(alam[1].second)));
250      book(tmp,1,6,4);
251      tmp->set((alam[0].first+alam[1].first)/(alam[0].first-alam[1].first),
252               4.*(sqr(alam[0].first*alam[1].second)+sqr(alam[1].first*alam[0].second))/pow(alam[0].first-alam[1].first,4));
253      // Lambda_b decays
254      pair<double,double> ab[2][2];
255      for(unsigned int ib=0;ib<2;++ib) {
256        for(unsigned int ip=0;ip<2;++ip) {
257          double sum1(0.),sum2(0.);
258          for(unsigned int ic=0;ic<2;++ic) {
259            sum1 += a_b[ip][ib][ic].first/sqr(a_b[ip][ib][ic].second);
260            sum2 += 1./sqr(a_b[ip][ib][ic].second);
261          }
262          ab[ip][ib] = make_pair(sum1/sum2,sqrt(1./sum2));
263          Estimate0DPtr tmp;
264          book(tmp,1,1+ib,1+ip);
265          tmp->set(ab[ip][ib].first,ab[ip][ib].second);
266        }
267        Estimate0DPtr tmp;
268        book(tmp,1,1+ib,3);
269        tmp->set(0.5*(ab[0][ib].first-ab[1][ib].first),
270                 0.5*sqrt(sqr(ab[0][ib].second)+sqr(ab[1][ib].second)));
271        book(tmp,1,1+ib,4);
272        tmp->set((ab[0][ib].first+ab[1][ib].first)/(ab[0][ib].first-ab[1][ib].first),
273                 4.*(sqr(ab[0][ib].first*ab[1][ib].second)+sqr(ab[1][ib].first*ab[0][ib].second))/pow(ab[0][ib].first-ab[1][ib].first,4));
274      }
275      // Lambda_c decays
276      for(unsigned int ic=0;ic<2;++ic) {
277        pair<double,double> ac[2],bc[2],gc[2];
278        for(unsigned int ip=0;ip<2;++ip) {
279          double sum1(0.),sum2(0.);
280          for(unsigned int ib=0;ib<2;++ib) {
281            sum1 += a_c[ip][ib][ic].first/sqr(a_c[ip][ib][ic].second);
282            sum2 += 1./sqr(a_c[ip][ib][ic].second);
283          }
284          ac[ip] = make_pair(sum1/sum2,sqrt(1./sum2));
285          Estimate0DPtr tmp;
286          book(tmp,1,3+ic,1+ip);
287          tmp->set(ac[ip].first,ac[ip].second);
288          sum1=sum2=0.;
289          for(unsigned int ib=0;ib<2;++ib) {
290            sum1 += beta[ip][ib][ic].first/sqr(beta[ip][ib][ic].second);
291            sum2 += 1./sqr(beta[ip][ib][ic].second);
292          }
293          bc[ip] = make_pair(sum1/sum2,sqrt(1./sum2));
294          book(tmp,2,1+ip,1+ic);
295          tmp->set(bc[ip].first,bc[ip].second);
296          sum1=sum2=0.;
297          for(unsigned int ib=0;ib<2;++ib) {
298            sum1 += gamma[ip][ib][ic].first/sqr(gamma[ip][ib][ic].second);
299            sum2 += 1./sqr(gamma[ip][ib][ic].second);
300          }
301          gc[ip] = make_pair(sum1/sum2,sqrt(1./sum2));
302          book(tmp,2,3+ip,1+ic);
303          tmp->set(gc[ip].first,gc[ip].second);
304
305
306
307
308
309        }
310        Estimate0DPtr tmp;
311        book(tmp,1,3+ic,3);
312        tmp->set(0.5*(ac[0].first-ac[1].first),
313                 0.5*sqrt(sqr(ac[0].second)+sqr(ac[1].second)));
314        book(tmp,1,3+ic,4);
315        tmp->set((ac[0].first+ac[1].first)/(ac[0].first-ac[1].first),
316                 4.*(sqr(ac[0].first*ac[1].second)+sqr(ac[1].first*ac[0].second))/pow(ac[0].first-ac[1].first,4));
317      }
318      // finally lambda_c -> p KS0
319      pair<double,double> ap[2];
320      for(unsigned int ip=0;ip<2;++ip) {
321        double sum1(0.),sum2(0.);
322        for(unsigned int ib=0;ib<2;++ib) {
323          pair<double,double> p1 = calcAlpha(_h_cos1[ip][ib][2]);
324          double val = p1.first/ab[ip][ib].first;
325          double err = sqr(val)*(sqr(p1.second/p1.first) + sqr(ab[ip][ib].second/ab[ip][ib].first));
326          sum1 += val/err;
327          sum2 += 1./err;
328        }
329        ap[ip] = make_pair(sum1/sum2,sqrt(1./sum2));
330        Estimate0DPtr tmp;
331        book(tmp,1,5,1+ip);
332        tmp->set(ap[ip].first,ap[ip].second);
333      }
334      book(tmp,1,5,3);
335      tmp->set(0.5*(ap[0].first-ap[1].first),
336               0.5*sqrt(sqr(ap[0].second)+sqr(ap[1].second)));
337      book(tmp,1,5,4);
338      tmp->set((ap[0].first+ap[1].first)/(ap[0].first-ap[1].first),
339               4.*(sqr(ap[0].first*ap[1].second)+sqr(ap[1].first*ap[0].second))/pow(ap[0].first-ap[1].first,4));
340    }
341    /// @}
342
343
344    /// @name Histograms
345    /// @{
346    Histo1DPtr _h_cos1[2][2][3],_h_cos2[2][2][2],_h_phi2[2][2][2];
347    Profile1DPtr _p_cos12[2][2][2];
348    /// @}
349
350
351  };
352
353
354  RIVET_DECLARE_PLUGIN(LHCB_2024_I2824757);
355
356}