Rivet analyses

Azimuthal asymmetries in bact-to-back π± and (π0, η, π±) production at $\sqrt{s}=10.58$GeV

Experiment: BELLE (KEKB)

Inspire ID: 1752523

Status: VALIDATED NOHEPDATA

Authors: - Peter Richardson

References: - Phys.Rev.D 100 (2019) 9, 092008

Beams: e+ e-

Beam energies: (5.3, 5.3)GeV

Run details: - e+e- to hadrons

Azimuthal asymmetries in bact-to-back π± and (π0, η, π±) production at $\sqrt{s}=10.58$GeV

Source code:BELLE_2019_I1752523.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/Thrust.hh"
#include "Rivet/Projections/UnstableParticles.hh"
#include "Rivet/Tools/Random.hh"

namespace Rivet {


  /// @brief azimuthal asymmetries in pi+/- (pi0, eta, pi+-) production
  class BELLE_2019_I1752523 : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2019_I1752523);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {
      // projections
      const FinalState fs;
      declare(fs, "FS");
      declare(UnstableParticles(Cuts::pid == 111 || Cuts::pid == 221), "UFS");
      declare(Thrust(fs), "Thrust");
      declare(Beam(), "Beams");
      // histograms
      unsigned int nbin = 20;
      // charged
      for (unsigned int ix = 0; ix < 3; ++ix) {
        // charged in pT bins
        for (unsigned int iy = 0; iy < 4; ++iy) {
          book(_h_charged_pt[ix][iy], "TMP/h_charged_pt_" + toString(ix + 1) + "_" + toString(iy + 1), nbin,
               0., M_PI);
          for (unsigned int iz = 0; iz < 4; ++iz) {
            book(_b_charged_pt[ix][iy][iz],
                 "TMP/b_charged_pt_" + toString(ix) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
          }
        }
        // charged in z bins
        for (unsigned int iy = 0; iy < 6; ++iy) {
          book(_h_charged_z[ix][iy], "TMP/h_charged_z_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0.,
               M_PI);
          if (iy == 5) continue;
          for (unsigned int iz = 0; iz < 5; ++iz) {
            book(_b_charged_z[ix][iy][iz],
                 "TMP/b_charged_z_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1),
                 nbin, 0., M_PI);
          }
        }
      }
      for (unsigned int ix = 0; ix < 2; ++ix) {
        // pi0
        for (unsigned int iy = 0; iy < 4; ++iy) {
          book(_h_pi0_pt[ix][iy], "TMP/h_pi0_pt_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0.,
               M_PI);
          book(_h_eta_pt[ix][iy], "TMP/h_eta_pt_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0.,
               M_PI);
          book(_h_pi0B_pt[ix][iy], "TMP/h_pi0B_pt_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0.,
               M_PI);
          for (unsigned int iz = 0; iz < 4; ++iz) {
            book(_b_pi0_pt[ix][iy][iz],
                 "TMP/b_pi0_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
            book(_b_eta_pt[ix][iy][iz],
                 "TMP/b_eta_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
            book(_b_pi0B_pt[ix][iy][iz],
                 "TMP/b_pi0B_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
            book(_b_charged_z_pt[ix][iy][iz],
                 "TMP/b_charged_z_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1),
                 nbin, 0., M_PI);
            book(_b_pi0_z_pt[ix][iy][iz],
                 "TMP/b_pi0_z_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
            if (iy > 2) continue;
            book(_b_eta_z_pt[ix][iy][iz],
                 "TMP/b_eta_z_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
            book(_b_pi0B_z_pt[ix][iy][iz],
                 "TMP/b_pi0B_z_pt_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1),
                 nbin, 0., M_PI);
          }
        }
        // pi0 in z bins
        for (unsigned int iy = 0; iy < 6; ++iy) {
          book(_h_pi0_z[ix][iy], "TMP/h_pi0_z_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0., M_PI);
          if (iy == 5) continue;
          for (unsigned int iz = 0; iz < 5; ++iz) {
            book(_b_pi0_z[ix][iy][iz],
                 "TMP/b_pi0_z_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
          }
        }
        // eta in z bins
        for (unsigned int iy = 0; iy < 5; ++iy) {
          book(_h_eta_z[ix][iy], "TMP/h_eta_z_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0., M_PI);
          book(_h_pi0B_z[ix][iy], "TMP/h_pi0B_z_" + toString(ix + 1) + "_" + toString(iy + 1), nbin, 0.,
               M_PI);
          if (iy > 2) continue;
          for (unsigned int iz = 0; iz < 3; ++iz) {
            book(_b_eta_z[ix][iy][iz],
                 "TMP/b_eta_z_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
            book(_b_pi0B_z[ix][iy][iz],
                 "TMP/b_pi0B_z_" + toString(ix + 1) + "_" + toString(iy + 1) + "_" + toString(iz + 1), nbin,
                 0., M_PI);
          }
        }
      }
    }

    unsigned int iBin_z0(double z) {
      if (z < .3)
        return 0;
      else if (z < .4)
        return 1;
      else if (z < .5)
        return 2;
      else if (z < .6)
        return 3;
      else if (z < .7)
        return 4;
      else
        return 5;
    }

    unsigned int iBin_z1(double z) {
      if (z < .2)
        return 0;
      else if (z < .3)
        return 1;
      else if (z < .5)
        return 2;
      else if (z < .7)
        return 3;
      else
        return 4;
    }

    unsigned int iBin_pT1(double pT) {
      if (pT < .15)
        return 0;
      else if (pT < .3)
        return 1;
      else if (pT < .5)
        return 2;
      else
        return 3;
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      static const double c03 = cos(0.3);
      // get the axis, direction of incoming electron
      const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
      Vector3 axis1;
      if (beams.first.pid() > 0) {
        axis1 = beams.second.mom().p3().unit();
      }
      else {
        axis1 = beams.first.mom().p3().unit();
      }
      // apply thrust cuts  T > 0.8
      Thrust thrust = apply<Thrust>(event, "Thrust");
      if (thrust.thrust() <= 0.8) vetoEvent;
      ThreeVector t_z = thrust.thrustAxis();
      ThreeVector t_x = (axis1 - t_z.dot(axis1) * t_z).unit();
      ThreeVector t_y = t_z.cross(t_x);
      double cThetaT = t_z.dot(axis1);
      static double cTheta[2] = {cos(1.34), cos(2.03)};
      if (cThetaT < cTheta[1] || cThetaT > cTheta[0]) vetoEvent;
      Vector3 cross = axis1.cross(t_z);
      Particles charged = apply<FinalState>(event, "FS").particles(Cuts::abspid == PID::PIPLUS);
      Particles neutral = apply<UnstableParticles>(event, "UFS").particles();
      // first charged particle
      for (unsigned int ix = 0; ix < charged.size(); ++ix) {
        // z and angle cut
        const double x1 = 2. * charged[ix].mom().t() / sqrtS();
        double dot1 = t_z.dot(charged[ix].p3().unit());
        if (abs(dot1) < c03 || x1 < 0.1) continue;
        // second charged particle
        for (unsigned int iy = ix + 1; iy < charged.size(); ++iy) {
          const double x2 = 2. * charged[iy].mom().t() / sqrtS();
          double dot2 = t_z.dot(charged[iy].p3().unit());
          if (abs(dot2) < c03 || x2 < 0.1 || dot1 * dot2 > 0) continue;
          // randomly order the particles
          Particle p1 = charged[ix], p2 = charged[iy];
          double z1(x1), z2(x2);
          if (rand01() < 0.5) {
            swap(p1, p2);
            swap(z1, z2);
          }
          const double pT1 = sqrt(sqr(dot(p1.mom().p3(), thrust.thrustMajorAxis()))
                                  + sqr(dot(p1.mom().p3(), thrust.thrustMinorAxis())));
          const double pT2 = sqrt(sqr(dot(p2.mom().p3(), thrust.thrustMajorAxis()))
                                  + sqr(dot(p2.mom().p3(), thrust.thrustMinorAxis())));
          if (pT1 > 3. || pT2 > 3.) continue;
          double phi12 = atan2(p1.p3().dot(t_y), p1.p3().dot(t_x))
              + atan2(p2.p3().dot(t_y), p2.p3().dot(t_x));
          if (phi12 > M_PI) phi12 -= 2 * M_PI;
          if (phi12 < -M_PI) phi12 += 2 * M_PI;
          if (phi12 < 0.) phi12 = -phi12;
          if (z1 > .2 && z2 > .2) {
            unsigned int ibin = iBin_z0(z1);
            unsigned int ipT1 = iBin_pT1(pT1);
            unsigned int ipT2 = iBin_pT1(pT2);
            unsigned int ibin1 = iBin_z1(z1) - 1;
            if (p1.pid() * p2.pid() > 0) {
              _h_charged_z[0][ibin]->fill(phi12);
              _h_charged_pt[0][ipT1]->fill(phi12);
              _b_charged_pt[0][ipT1][ipT2]->fill(phi12);
              _h_pi0_z[1][ibin]->fill(phi12);
              _h_pi0_pt[1][ipT1]->fill(phi12);
              _b_pi0_pt[1][ipT1][ipT2]->fill(phi12);
              _b_pi0_z_pt[1][ibin1][ipT1]->fill(phi12);
              if (z1 > .3 && z2 > .3) {
                _h_eta_z[1][ibin - 1]->fill(phi12);
                _h_pi0B_z[1][ibin - 1]->fill(phi12);
                _h_eta_pt[1][ipT1]->fill(phi12);
                _h_pi0B_pt[1][ipT1]->fill(phi12);
                _b_eta_pt[1][ipT1][ipT2]->fill(phi12);
                _b_pi0B_pt[1][ipT1][ipT2]->fill(phi12);
                _b_eta_z_pt[1][ibin1 - 1][ipT1]->fill(phi12);
                _b_pi0B_z_pt[1][ibin1 - 1][ipT1]->fill(phi12);
              }
            }
            else {
              _h_charged_z[1][ibin]->fill(phi12);
              _h_charged_pt[1][ipT1]->fill(phi12);
              _b_charged_pt[1][ipT1][ipT2]->fill(phi12);
              _b_charged_z_pt[0][ibin1][ipT1]->fill(phi12);
            }
            _h_charged_z[2][ibin]->fill(phi12);
            _h_charged_pt[2][ipT1]->fill(phi12);
            _b_charged_pt[2][ipT1][ipT2]->fill(phi12);
            _b_charged_z_pt[1][ibin1][ipT1]->fill(phi12);
          }
          unsigned int ibin1 = iBin_z1(z1), ibin2 = iBin_z1(z2);
          if (p1.pid() * p2.pid() > 0) {
            _b_charged_z[0][ibin1][ibin2]->fill(phi12);
            _b_pi0_z[1][ibin1][ibin2]->fill(phi12);
            if (z1 > .3 && z2 > .3) {
              _b_eta_z[1][ibin1 - 2][ibin2 - 2]->fill(phi12);
              _b_pi0B_z[1][ibin1 - 2][ibin2 - 2]->fill(phi12);
            }
          }
          else {
            _b_charged_z[1][ibin1][ibin2]->fill(phi12);
          }
          _b_charged_z[2][ibin1][ibin2]->fill(phi12);
        }
        // pi0 or eta
        for (unsigned int iy = 0; iy < neutral.size(); ++iy) {
          const double x2 = 2. * neutral[iy].mom().t() / sqrtS();
          double dot2 = t_z.dot(neutral[iy].p3().unit());
          if (abs(dot2) < c03 || x2 < 0.2 || dot1 * dot2 > 0) continue;
          // neutral particle first
          Particle p2 = charged[ix], p1 = neutral[iy];
          double z1(x2), z2(x1);
          const double pT1 = sqrt(sqr(dot(p1.mom().p3(), thrust.thrustMajorAxis()))
                                  + sqr(dot(p1.mom().p3(), thrust.thrustMinorAxis())));
          const double pT2 = sqrt(sqr(dot(p2.mom().p3(), thrust.thrustMajorAxis()))
                                  + sqr(dot(p2.mom().p3(), thrust.thrustMinorAxis())));
          if (pT1 > 3. || pT2 > 3.) continue;
          double phi12 = atan2(p1.p3().dot(t_y), p1.p3().dot(t_x))
              + atan2(p2.p3().dot(t_y), p2.p3().dot(t_x));
          if (phi12 > M_PI) phi12 -= 2 * M_PI;
          if (phi12 < -M_PI) phi12 += 2 * M_PI;
          if (phi12 < 0.) phi12 = -phi12;
          if (z1 > .2) {
            unsigned int ibin = iBin_z0(z1);
            unsigned int ipT1 = iBin_pT1(pT1);
            unsigned int ipT2 = iBin_pT1(pT2);
            unsigned int ibin1 = iBin_z1(z1) - 1;
            if (p1.pid() == 111) {
              _h_pi0_z[0][ibin]->fill(phi12);
              _h_pi0_pt[0][ipT1]->fill(phi12);
              _b_pi0_pt[0][ipT1][ipT2]->fill(phi12);
              _b_pi0_z_pt[0][ibin1][ipT1]->fill(phi12);
              if (z1 > .3 && z2 > .3) {
                _h_pi0B_z[0][ibin - 1]->fill(phi12);
                _h_pi0B_pt[0][ipT1]->fill(phi12);
                _b_pi0B_pt[0][ipT1][ipT2]->fill(phi12);
                _b_pi0B_z_pt[0][ibin1 - 1][ipT1]->fill(phi12);
              }
            }
            else if (z1 > .3 && z2 > .3) {
              _h_eta_z[0][ibin - 1]->fill(phi12);
              _h_eta_pt[0][ipT1]->fill(phi12);
              _b_eta_pt[0][ipT1][ipT2]->fill(phi12);
              _b_eta_z_pt[0][ibin1 - 1][ipT1]->fill(phi12);
            }
          }
          unsigned int ibin1 = iBin_z1(z1), ibin2 = iBin_z1(z2);
          if (p1.pid() == 111) {
            _b_pi0_z[0][ibin1][ibin2]->fill(phi12);
            if (z1 > .3 && z2 > .3) _b_pi0B_z[0][ibin1 - 2][ibin2 - 2]->fill(phi12);
          }
          else if (z1 > .3 && z2 > .3) {
            _b_eta_z[0][ibin1 - 2][ibin2 - 2]->fill(phi12);
          }
        }
      }
    }

    pair<double, double> calcAsymmetry(Estimate1DPtr hist, double fact = 1.) {
      double sum1(0.), sum2(0.);
      for (const auto& bin : hist->bins()) {
        double Oi = bin.val();
        if (Oi == 0. || std::isnan(Oi)) continue;
        double ai = 1.;
        double bi = (sin(fact * bin.xMax()) - sin(fact * bin.xMin())) / (bin.xMax() - bin.xMin()) / fact;
        double Ei = bin.errAvg();
        sum1 += sqr(bi / Ei);
        sum2 += bi / sqr(Ei) * (Oi - ai);
      }
      if (sum1 == 0.) return make_pair(0., 0.);
      return make_pair(sum2 / sum1 * 1e2, sqrt(1. / sum1) * 1e2);
    }

    /// Normalise histograms etc., after the run
    void finalize() {
      // charged in pT bins
      Estimate1DPtr h_charged_UL, h_charged_UC;
      book(h_charged_UL, 1, 1, 1);
      book(h_charged_UC, 1, 1, 2);
      Estimate1DPtr h_pi0_UL, h_eta_UL, h_pi0B_UL;
      book(h_pi0_UL, 6, 1, 1);
      book(h_eta_UL, 7, 1, 1);
      book(h_pi0B_UL, 8, 1, 1);
      for (unsigned int ix = 0; ix < 4; ++ix) {
        // first the 1d dists
        for (unsigned int ii = 0; ii < 3; ++ii) {
          normalize(_h_charged_pt[ii][ix]);
          if (ii == 2) continue;
          normalize(_h_pi0_pt[ii][ix]);
          normalize(_h_eta_pt[ii][ix]);
          normalize(_h_pi0B_pt[ii][ix]);
        }
        Estimate1DPtr htemp;
        // UL
        // charged
        book(htemp, "TMP/R_charged_pt_UL_" + toString(ix), _h_charged_pt[1][ix]->xEdges());
        divide(_h_charged_pt[1][ix], _h_charged_pt[0][ix], htemp);
        pair<double, double> asym = calcAsymmetry(htemp);
        h_charged_UL->bin(ix + 1).setVal(asym.first);
        h_charged_UL->bin(ix + 1).setErr(asym.second);
        // UC
        book(htemp, "TMP/R_charged_pt_UC_" + toString(ix), _h_charged_pt[1][ix]->xEdges());
        divide(_h_charged_pt[1][ix], _h_charged_pt[2][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_charged_UC->bin(ix + 1).setVal(asym.first);
        h_charged_UC->bin(ix + 1).setErr(asym.second);
        // pi0
        book(htemp, "TMP/R_pi0_pt_UL_" + toString(ix), _h_pi0_pt[0][ix]->xEdges());
        divide(_h_pi0_pt[0][ix], _h_pi0_pt[1][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_pi0_UL->bin(ix + 1).setVal(asym.first);
        h_pi0_UL->bin(ix + 1).setErr(asym.second);
        // eta
        book(htemp, "TMP/R_eta_pt_UL_" + toString(ix), _h_eta_pt[0][ix]->xEdges());
        divide(_h_eta_pt[0][ix], _h_eta_pt[1][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_eta_UL->bin(ix + 1).setVal(asym.first);
        h_eta_UL->bin(ix + 1).setErr(asym.second);
        // pi0 z>.3
        book(htemp, "TMP/R_pi0B_pt_UL_" + toString(ix), _h_pi0B_pt[0][ix]->xEdges());
        divide(_h_pi0B_pt[0][ix], _h_pi0B_pt[1][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_pi0B_UL->bin(ix + 1).setVal(asym.first);
        h_pi0B_UL->bin(ix + 1).setErr(asym.second);
        // then 2nd dists
        Estimate1DPtr h_charged_UL2, h_charged_UC2;
        book(h_charged_UL2, 1, 2 + ix, 1);
        book(h_charged_UC2, 1, 2 + ix, 2);
        Estimate1DPtr h_pi0_UL2, h_eta_UL2, h_pi0B_UL2;
        book(h_pi0_UL2, 6, 2 + ix, 1);
        book(h_eta_UL2, 7, 2 + ix, 1);
        book(h_pi0B_UL2, 8, 2 + ix, 1);
        for (unsigned int iy = 0; iy < 4; ++iy) {
          for (unsigned int ii = 0; ii < 3; ++ii) {
            normalize(_b_charged_pt[ii][ix][iy]);
            if (ii == 2) continue;
            normalize(_b_pi0_pt[ii][ix][iy]);
            normalize(_b_eta_pt[ii][ix][iy]);
            normalize(_b_pi0B_pt[ii][ix][iy]);
          }
          // UL
          book(htemp, "TMP/R_charged_pt_UL_" + toString(ix) + "_" + toString(iy),
               _b_charged_pt[1][ix][iy]->xEdges());
          divide(_b_charged_pt[1][ix][iy], _b_charged_pt[0][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_charged_UL2->bin(iy + 1).setVal(asym.first);
          h_charged_UL2->bin(iy + 1).setErr(asym.second);
          // UC
          book(htemp, "TMP/R_charged_pt_UC_" + toString(ix) + "_" + toString(iy),
               _b_charged_pt[1][ix][iy]->xEdges());
          divide(_b_charged_pt[1][ix][iy], _b_charged_pt[2][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_charged_UC2->bin(iy + 1).setVal(asym.first);
          h_charged_UC2->bin(iy + 1).setErr(asym.second);
          // pi0
          book(htemp, "TMP/R_pi0_pt_UL_" + toString(ix) + "_" + toString(iy), _b_pi0_pt[0][ix][iy]->xEdges());
          divide(_b_pi0_pt[0][ix][iy], _b_pi0_pt[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_pi0_UL2->bin(iy + 1).setVal(asym.first);
          h_pi0_UL2->bin(iy + 1).setErr(asym.second);
          // eta
          book(htemp, "TMP/R_eta_pt_UL_" + toString(ix) + "_" + toString(iy), _b_eta_pt[0][ix][iy]->xEdges());
          divide(_b_eta_pt[0][ix][iy], _b_eta_pt[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_eta_UL2->bin(iy + 1).setVal(asym.first);
          h_eta_UL2->bin(iy + 1).setErr(asym.second);
          // pi0 z>0.3
          book(htemp, "TMP/R_pi0B_pt_UL_" + toString(ix) + "_" + toString(iy),
               _b_pi0B_pt[0][ix][iy]->xEdges());
          divide(_b_pi0B_pt[0][ix][iy], _b_pi0B_pt[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_pi0B_UL2->bin(iy + 1).setVal(asym.first);
          h_pi0B_UL2->bin(iy + 1).setErr(asym.second);
        }
      }
      // charged and pi0 in z bins
      book(h_charged_UL, 2, 1, 1);
      book(h_charged_UC, 2, 1, 2);
      book(h_pi0_UL, 3, 1, 1);
      book(h_eta_UL, 4, 1, 1);
      book(h_pi0B_UL, 5, 1, 1);
      for (unsigned int ix = 0; ix < 6; ++ix) {
        // first the 1d dists
        for (unsigned int ii = 0; ii < 3; ++ii) {
          normalize(_h_charged_z[ii][ix]);
          if (ii == 2) continue;
          normalize(_h_pi0_z[ii][ix]);
          if (ix == 5) continue;
          normalize(_h_eta_z[ii][ix]);
          normalize(_h_pi0B_z[ii][ix]);
        }
        Estimate1DPtr htemp;
        // UL
        // charged
        book(htemp, "TMP/R_charged_z_UL_" + toString(ix), _h_charged_z[1][ix]->xEdges());
        divide(_h_charged_z[1][ix], _h_charged_z[0][ix], htemp);
        pair<double, double> asym = calcAsymmetry(htemp);
        h_charged_UL->bin(ix + 1).setVal(asym.first);
        h_charged_UL->bin(ix + 1).setErr(asym.second);
        // UC
        book(htemp, "TMP/R_charged_z_UC_" + toString(ix), _h_charged_z[1][ix]->xEdges());
        divide(_h_charged_z[1][ix], _h_charged_z[2][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_charged_UC->bin(ix + 1).setVal(asym.first);
        h_charged_UC->bin(ix + 1).setErr(asym.second);
        // pi0
        book(htemp, "TMP/R_pi0_z_UL_" + toString(ix), _h_pi0_z[0][ix]->xEdges());
        divide(_h_pi0_z[0][ix], _h_pi0_z[1][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_pi0_UL->bin(ix + 1).setVal(asym.first);
        h_pi0_UL->bin(ix + 1).setErr(asym.second);
        if (ix == 5) continue;
        // eta
        book(htemp, "TMP/R_eta_z_UL_" + toString(ix), _h_eta_z[0][ix]->xEdges());
        divide(_h_eta_z[0][ix], _h_eta_z[1][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_eta_UL->bin(ix + 1).setVal(asym.first);
        h_eta_UL->bin(ix + 1).setErr(asym.second);
        // pi0 z>.3
        book(htemp, "TMP/R_pi0B_z_UL_" + toString(ix), _h_pi0B_z[0][ix]->xEdges());
        divide(_h_pi0B_z[0][ix], _h_pi0B_z[1][ix], htemp);
        asym = calcAsymmetry(htemp);
        h_pi0B_UL->bin(ix + 1).setVal(asym.first);
        h_pi0B_UL->bin(ix + 1).setErr(asym.second);
        // then 2nd dists
        Estimate1DPtr h_charged_UL2, h_charged_UC2;
        book(h_charged_UL2, 2, 2 + ix, 1);
        book(h_charged_UC2, 2, 2 + ix, 2);
        Estimate1DPtr h_pi0_UL2, h_eta_UL2, h_pi0B_UL2;
        book(h_pi0_UL2, 3, 2 + ix, 1);
        if (ix < 3) {
          book(h_eta_UL2, 4, 2 + ix, 1);
          book(h_pi0B_UL2, 5, 2 + ix, 1);
        }
        for (unsigned int iy = 0; iy < 5; ++iy) {
          for (unsigned int ii = 0; ii < 3; ++ii) {
            normalize(_b_charged_z[ii][ix][iy]);
            if (ii == 2) continue;
            normalize(_b_pi0_z[ii][ix][iy]);
            if (ix > 2 || iy > 2) continue;
            normalize(_b_eta_z[ii][ix][iy]);
            normalize(_b_pi0B_z[ii][ix][iy]);
          }
          // UL
          book(htemp, "TMP/R_charged_z_UL_" + toString(ix) + "_" + toString(iy),
               _b_charged_z[1][ix][iy]->xEdges());
          divide(_b_charged_z[1][ix][iy], _b_charged_z[0][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_charged_UL2->bin(iy + 1).setVal(asym.first);
          h_charged_UL2->bin(iy + 1).setErr(asym.second);
          // UC
          book(htemp, "TMP/R_charged_z_UC_" + toString(ix) + "_" + toString(iy),
               _b_charged_z[1][ix][iy]->xEdges());
          divide(_b_charged_z[1][ix][iy], _b_charged_z[2][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_charged_UC2->bin(iy + 1).setVal(asym.first);
          h_charged_UC2->bin(iy + 1).setErr(asym.second);
          // pi0
          book(htemp, "TMP/R_pi0_z_UL_" + toString(ix) + "_" + toString(iy), _b_pi0_z[0][ix][iy]->xEdges());
          divide(_b_pi0_z[0][ix][iy], _b_pi0_z[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_pi0_UL2->bin(iy + 1).setVal(asym.first);
          h_pi0_UL2->bin(iy + 1).setErr(asym.second);
          if (ix > 2 || iy > 2) continue;
          // eta
          book(htemp, "TMP/R_eta_z_UL_" + toString(ix) + "_" + toString(iy), _b_eta_z[0][ix][iy]->xEdges());
          divide(_b_eta_z[0][ix][iy], _b_eta_z[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_eta_UL2->bin(iy + 1).setVal(asym.first);
          h_eta_UL2->bin(iy + 1).setErr(asym.second);
          // pi0 z>0.3
          book(htemp, "TMP/R_pi0B_z_UL_" + toString(ix) + "_" + toString(iy), _b_pi0B_z[0][ix][iy]->xEdges());
          divide(_b_pi0B_z[0][ix][iy], _b_pi0B_z[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_pi0B_UL2->bin(iy + 1).setVal(asym.first);
          h_pi0B_UL2->bin(iy + 1).setErr(asym.second);
        }
      }
      // finally z and pT
      // only 2d dists
      for (unsigned int ix = 0; ix < 4; ++ix) {
        Estimate1DPtr h_charged_UC2;
        book(h_charged_UC2, 9, 1 + ix, 1);
        Estimate1DPtr h_pi0_UL2, h_eta_UL2, h_pi0B_UL2;
        book(h_pi0_UL2, 10, 1 + ix, 1);
        if (ix < 3) {
          book(h_eta_UL2, 11, 1 + ix, 1);
          book(h_pi0B_UL2, 12, 1 + ix, 1);
        }
        for (unsigned int iy = 0; iy < 4; ++iy) {
          for (unsigned int ii = 0; ii < 2; ++ii) {
            normalize(_b_charged_z_pt[ii][ix][iy]);
            normalize(_b_pi0_z_pt[ii][ix][iy]);
            if (ix > 2) continue;
            normalize(_b_eta_z_pt[ii][ix][iy]);
            normalize(_b_pi0B_z_pt[ii][ix][iy]);
          }
          pair<double, double> asym;
          Estimate1DPtr htemp;
          // UC (missing last point for first histo)
          if (ix != 0 || iy != 3) {
            book(htemp, "TMP/R_charged_z_pt_UC_" + toString(ix) + "_" + toString(iy),
                 _b_charged_z_pt[0][ix][iy]->xEdges());
            divide(_b_charged_z_pt[0][ix][iy], _b_charged_z_pt[1][ix][iy], htemp);
            asym = calcAsymmetry(htemp);
            h_charged_UC2->bin(iy + 1).setVal(asym.first);
            h_charged_UC2->bin(iy + 1).setErr(asym.second);
            // pi0
            book(htemp, "TMP/R_pi0_z_pt_UL_" + toString(ix) + "_" + toString(iy),
                 _b_pi0_z_pt[0][ix][iy]->xEdges());
            divide(_b_pi0_z_pt[0][ix][iy], _b_pi0_z_pt[1][ix][iy], htemp);
            asym = calcAsymmetry(htemp);
            h_pi0_UL2->bin(iy + 1).setVal(asym.first);
            h_pi0_UL2->bin(iy + 1).setErr(asym.second);
          }
          if (ix > 2) continue;
          // eta
          book(htemp, "TMP/R_eta_z_pt_UL_" + toString(ix) + "_" + toString(iy),
               _b_eta_z_pt[0][ix][iy]->xEdges());
          divide(_b_eta_z_pt[0][ix][iy], _b_eta_z_pt[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_eta_UL2->bin(iy + 1).setVal(asym.first);
          h_eta_UL2->bin(iy + 1).setErr(asym.second);
          // pi0 z>0.3
          book(htemp, "TMP/R_pi0B_z_pt_UL_" + toString(ix) + "_" + toString(iy),
               _b_pi0B_z_pt[0][ix][iy]->xEdges());
          divide(_b_pi0B_z_pt[0][ix][iy], _b_pi0B_z_pt[1][ix][iy], htemp);
          asym = calcAsymmetry(htemp);
          h_pi0B_UL2->bin(iy + 1).setVal(asym.first);
          h_pi0B_UL2->bin(iy + 1).setErr(asym.second);
        }
      }
    }

    /// @}


    /// @name Histograms
    /// @{
    Histo1DPtr _h_charged_pt[3][4], _h_charged_z[3][6];
    Histo1DPtr _b_charged_pt[3][4][4], _b_charged_z[3][5][5], _b_charged_z_pt[2][4][4];
    Histo1DPtr _h_pi0_z[2][6], _h_eta_z[2][5], _h_pi0B_z[2][5], _h_pi0_pt[2][4], _h_eta_pt[2][4],
        _h_pi0B_pt[2][4];
    Histo1DPtr _b_pi0_z[2][5][5], _b_eta_z[2][3][3], _b_pi0B_z[2][3][3], _b_pi0_pt[2][4][4];
    Histo1DPtr _b_eta_pt[2][4][4], _b_pi0B_pt[2][4][4], _b_pi0_z_pt[2][4][4], _b_pi0B_z_pt[2][3][4],
        _b_eta_z_pt[2][3][4];
    /// @}
  };


  RIVET_DECLARE_PLUGIN(BELLE_2019_I1752523);

}