rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BESIII_2023_I2627838

Helicity amplitudes in $\chi_{cJ}\to \phi\phi$ decays.
Experiment: BESIII (BEPC)
Inspire ID: 2627838
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • JHEP 05 (2023) 069
  • Phys.Rev.D 88 (2013) 3, 034025
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing psi(2S) to gamma chi_c decays (originally e+e-)

Measurement of the ratios of helicity amplitudes in $\chi_{cJ}\to \phi\phi$ decays, ($J=0,1,2$). The ratios are extracted using appropriate moments

Source code: BESIII_2023_I2627838.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief chi_cJ -> phi phi
  9  class BESIII_2023_I2627838 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2023_I2627838);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21      declare(UnstableParticles(Cuts::abspid==100443), "UFS");
 22      // counters
 23      for (unsigned int ix=0; ix<3; ++ix) {
 24        book(_n[ix],"TMP/n_"+toString(ix+1));
 25        for (unsigned int iy=0; iy<ix+1; ++iy)
 26          book(_m[ix][iy],"TMP/m_"+toString(ix+1)+"_"+toString(iy+1));
 27      }
 28    }
 29
 30
 31    /// Perform the per-event analysis
 32    void analyze(const Event& event) {
 33      for (const Particle& psi : apply<UnstableParticles>(event, "UFS").particles()) {
 34        if (psi.children().size()!=2) continue;
 35        // find chi_c gamma decay and type of chi_c
 36        Particle chi;
 37        if (psi.children()[0].pid()==PID::GAMMA) {
 38          if (psi.children()[1].pid()==10441 ||
 39              psi.children()[1].pid()==20443 ||
 40              psi.children()[1].pid()==445 ) {
 41            chi = psi.children()[1];
 42          }
 43        }
 44        else if (psi.children()[1].pid()==PID::GAMMA) {
 45          if (psi.children()[0].pid()==10441 ||
 46              psi.children()[0].pid()==20443 ||
 47              psi.children()[0].pid()==445) {
 48	          chi = psi.children()[0];
 49          }
 50        }
 51        else {
 52          continue;
 53        }
 54        unsigned int iloc=0;
 55        if      (chi.pid()==10441) iloc=0;
 56        else if (chi.pid()==20443) iloc=1;
 57        else if (chi.pid()==  445) iloc=2;
 58        else {
 59          continue;
 60        }
 61        // require chi_c -> phi phi
 62        if (chi.children().size()!=2) continue;
 63        if (chi.children()[0].pid()!=333 ||
 64            chi.children()[0].pid()!=333) continue;
 65        bool found = true;
 66        Particle Km[2],Kp[2];
 67        for (unsigned int ix=0; ix<2; ++ix) {
 68          // required K+K- decay
 69          if (chi.children()[ix].children().size()!=2) {
 70            found = false;
 71            break;
 72          }
 73          if (chi.children()[ix].children()[0].pid()!=-chi.children()[ix].children()[1].pid() ||
 74              chi.children()[ix].children()[0].abspid()!=321) {
 75            found = false;
 76            break;
 77          }
 78          if (chi.children()[ix].children()[0].pid()>0) {
 79            Kp[ix] = chi.children()[ix].children()[0];
 80            Km[ix] = chi.children()[ix].children()[1];
 81          }
 82          else {
 83            Kp[ix] = chi.children()[ix].children()[1];
 84            Km[ix] = chi.children()[ix].children()[0];
 85          }
 86        }
 87        if (!found) continue;
 88        // fill count
 89        _n[iloc]->fill();
 90        // boost to psi(2S) frame
 91        LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(psi.mom().betaVec());
 92        LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(chi.mom().betaVec());
 93        Vector3 axis1 = boost1.transform(chi.mom()).p3().unit();
 94        double cTheta[3]={0.,0.,0.};
 95        for (unsigned int ix=0; ix<2; ++ix) {
 96          FourMomentum pPhi = boost2.transform(boost1.transform(chi.children()[ix].mom()));
 97          Vector3 axis2 = pPhi.p3().unit();
 98          if (ix==0) cTheta[0] = axis1.dot(axis2);
 99          LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pPhi.betaVec());
100          FourMomentum pK = boost3.transform(boost2.transform(boost1.transform(Kp[ix].mom())));
101          cTheta[ix+1] = axis2.dot(pK.p3().unit());
102        }
103        if (iloc==0) {
104          _m[0][0]->fill(0.25*(3. - 5.*sqr(cTheta[1])));
105        }
106        else if (iloc==1) {
107          _m[1][0]->fill(0.625*(1. + sqr(cTheta[1]) - 4.*sqr(cTheta[0])));
108          _m[1][1]->fill(     -(3.                  -10.*sqr(cTheta[0])));
109        }
110        else {
111          _m[2][0]->fill(-0.125*(25.*sqr(cTheta[1])*sqr(cTheta[2]) - 10*sqr(cTheta[1]) - 10*sqr(cTheta[2]) + 3.));
112          _m[2][1]->fill( 0.05 *(8 - 140.*sqr(cTheta[1]) + 325.*sqr(cTheta[0])*sqr(cTheta[2])
113                         + 250.*sqr(cTheta[0])*sqr(cTheta[1])*sqr(cTheta[2])));
114          _m[2][2]->fill( 0.75 *(1. + 5.*sqr(cTheta[1]) - 25.* sqr(cTheta[0])*sqr(cTheta[2])));
115        }
116      }
117    }
118
119
120    /// Normalise histograms etc., after the run
121    void finalize() {
122      for (unsigned int ix=0; ix<3; ++ix) {
123        if (_n[ix]->numEntries()==0)  continue;
124        scale(_m[ix], 1.0/ *_n[ix]);
125        if (ix==0) {
126          double x = _m[0][0]->val()/(1.-2.*_m[0][0]->val());
127          pair<double,double> dx = make_pair(x-(-_m[0][0]->err() + _m[0][0]->val())/(1 + 2*_m[0][0]->err() - 2*_m[0][0]->val()),
128                                            (_m[0][0]->err() + _m[0][0]->val())/(1 - 2*_m[0][0]->err() - 2*_m[0][0]->val())-x);
129          double rx = sqrt(abs(x));
130          dx.first  *= 0.5/rx;
131          dx.second *= 0.5/rx;
132          if (x<0.) rx*=-1.;
133          Estimate0DPtr h_x;
134          book(h_x, 1, 1, 1);
135          h_x->set(rx, dx);
136        }
137        else if (ix==1) {
138          double u1 = -4.*_m[1][0]->val()/(-1. + 4.*_m[1][0]->val() + _m[1][1]->val());
139          double u2 = -4.*_m[1][1]->val()/(-1. + 4.*_m[1][0]->val() + _m[1][1]->val());
140          double O1 = _m[1][0]->val(), DO1 = _m[1][0]->err();
141          double O2 = _m[1][1]->val(), DO2 = _m[1][1]->err();
142          double root1 = sqrt(sqr(-1 + 4*O1 + O2)*(sqr(DO2)*sqr(1 - 4*O1) + 16*sqr(DO1)*sqr(O2)));
143          pair<double,double> du1 = make_pair(-4*DO1*DO2/(4*DO1*DO2*(-1 + 4*O1 + O2) - root1),
144                                               4*DO1*DO2/(4*DO1*DO2*(-1 + 4*O1 + O2) + root1));
145          double ru1 = sqrt(abs(u1));
146          du1.first  *=0.5/ru1;
147          du1.second *=0.5/ru1;
148          if (u1<0.) ru1*=-1.;
149          double root2 = sqrt((sqr(DO2)*sqr(O1) + sqr(DO1)*sqr(-1 + O2))*sqr(-1 + 4*O1 + O2));
150          pair<double,double> du2 = make_pair(-4*DO1*DO2/(DO1*DO2*(-1 + 4*O1 + O2) - root2),
151                                               4*DO1*DO2/(DO1*DO2*(-1 + 4*O1 + O2) + root2));
152          double ru2 = sqrt(abs(u2));
153          du2.first  *=0.5/ru2;
154          du2.second *=0.5/ru2;
155          if (u2<0.) ru2*=-1.;
156          Estimate0DPtr h_u1;
157          book(h_u1, 1, 2, 1);
158          h_u1->set(ru1, du1);
159          Estimate0DPtr h_u2;
160          book(h_u2, 1, 2, 2);
161          h_u2->set(ru2, du2);
162        }
163        else {
164          double O1 = _m[2][0]->val(), DO1 = _m[2][0]->err();
165          double O2 = _m[2][1]->val(), DO2 = _m[2][1]->err();
166          double O4 = _m[2][2]->val(), DO4 = _m[2][2]->err();
167          double w1 = -O1/(-1 + 4*O1 + 2*O2 + 2*O4);
168          double w2 = -O2/(-1 + 4*O1 + 2*O2 + 2*O4);
169          double w4 = -O4/(-1 + 4*O1 + 2*O2 + 2*O4);
170          double root1 = sqrt((16*sqr(DO1)*sqr(DO4)*sqr(O2) + sqr(DO2)*(sqr(DO4) *
171                         sqr(1 - 4*O1) + 16*sqr(DO1)*sqr(O4)))/sqr(-1 + 4*O1 + 2*O2 + 2*O4));
172          pair<double,double> dw1 = make_pair( DO1*DO2*DO4*(4*DO1*DO2*DO4 + (-1 + 4*O1 + 2*O2 + 2*O4)*root1) /
173                                               ((-1 + 4*O1 + 2*O2 + 2*O4)*(16*sqr(DO1)*sqr(DO4)*sqr(O2) +
174                                               sqr(DO2)*(sqr(DO4)*(-16*sqr(DO1) + sqr(1 - 4*O1)) + 16*sqr(DO1)*sqr(O4)))),
175                                               DO1*DO2*DO4*(-4*DO1*DO2*DO4 + (-1 + 4*O1 + 2*O2 + 2*O4)*root1) /
176                                               ((-1 + 4*O1 + 2*O2 + 2*O4)*(16*sqr(DO1)*sqr(DO4)*sqr(O2) +
177                                               sqr(DO2)*(sqr(DO4)*(-16*sqr(DO1) +
178                                               sqr(1 - 4*O1)) + 16*sqr(DO1)*sqr(O4)))));
179          double rw1 = sqrt(abs(w1));
180          dw1.first  *=0.5/rw1;
181          dw1.second *=0.5/rw1;
182          if (w1<0.) rw1*=-1.;
183          double root2 = sqrt((4*sqr(DO2)*sqr(DO4)*sqr(O1) + sqr(DO1)*(sqr(DO4) *
184                         sqr(1 - 2*O2) + 4*sqr(DO2)*sqr(O4)))/sqr(-1 + 4*O1 + 2*O2 + 2*O4));
185          pair<double,double> dw2 = make_pair(DO1*DO2*DO4*(2*DO1*DO2*DO4 + (-1 + 4*O1 + 2*O2 + 2*O4)*root2) /
186                                              ((-1 + 4*O1 + 2*O2 + 2*O4)*(4*sqr(DO2)*sqr(DO4)*sqr(O1) +
187                                              sqr(DO1)*(sqr(DO4)*(-4*sqr(DO2) + sqr(1 - 2*O2)) + 4*sqr(DO2)*sqr(O4)))),
188                                              DO1*DO2*DO4*(-2*DO1*DO2*DO4 + (-1 + 4*O1 + 2*O2 + 2*O4)*root2) /
189                                              ((-1 + 4*O1 + 2*O2 + 2*O4)*(4*sqr(DO2)*sqr(DO4)*sqr(O1) +
190                                              sqr(DO1)*(sqr(DO4)*(-4*sqr(DO2) +
191                                              sqr(1 - 2*O2)) + 4*sqr(DO2)*sqr(O4)))));
192          double rw2 = sqrt(abs(w2));
193          dw2.first  *=0.5/rw2;
194          dw2.second *=0.5/rw2;
195          if (w2<0.) rw2*=-1.;
196          double root3 = sqrt((4*sqr(DO2)*sqr(DO4)*sqr(O1) + sqr(DO1)*(4*sqr(DO4)*sqr(O2) +
197                         sqr(DO2)*sqr(1 - 2*O4)))/sqr(-1 + 4*O1 + 2*O2 + 2*O4));
198          pair<double,double> dw4 = make_pair(DO1*DO2*DO4*(2*DO1*DO2*DO4 + (-1 + 4*O1 + 2*O2 + 2*O4)*root3) /
199                                              ((4*sqr(DO2)*sqr(DO4)*sqr(O1) + sqr(DO1)*(4*sqr(DO4)*sqr(O2) +
200                                              sqr(DO2)*(-4*sqr(DO4) + sqr(1 - 2*O4)))) * (-1 + 4*O1 + 2*O2 + 2*O4)),
201                                              DO1*DO2*DO4*(-2*DO1*DO2*DO4 + (-1 + 4*O1 + 2*O2 + 2*O4)*root3) /
202                                              ((4*sqr(DO2)*sqr(DO4)*sqr(O1) + sqr(DO1)*(4*sqr(DO4)*sqr(O2) +
203                                              sqr(DO2)*(-4*sqr(DO4) + sqr(1 - 2*O4)))) * (-1 + 4*O1 + 2*O2 + 2*O4)));
204          double rw4 = sqrt(abs(w4));
205          dw4.first  *=0.5/rw4;
206          dw4.second *=0.5/rw4;
207          if (w4<0.) rw4*=-1.;
208          Estimate0DPtr h_w1;
209          book(h_w1, 1, 3, 1);
210          h_w1->set(rw1, dw1);
211          Estimate0DPtr h_w2;
212          book(h_w2, 1, 3, 2);
213          h_w2->set(rw2, dw2);
214          Estimate0DPtr h_w4;
215          book(h_w4, 1, 3, 3);
216          h_w4->set(rw4, dw4);
217        }
218      }
219    }
220
221    /// @}
222
223
224    /// @name Histograms
225    /// @{
226    CounterPtr _n[3],_m[3][3];
227    /// @}
228
229
230  };
231
232
233  RIVET_DECLARE_PLUGIN(BESIII_2023_I2627838);
234
235}